You Don’t Know JS Yet - 자바스크립트 개념, 스코프와 클로저
카일 심슨 지음, 이보라 옮김 / 한빛미디어 / 2024년 1월
평점 :
장바구니담기


책의 부제는 : "자바스크립트 개념, 스코프와 클로저" 입니다.

책의 제목이 영어로 되어 있어서 번역서인데, 보통 접근성이나 검색등에 잘 노출이 안될거 같은데

이렇게 영어로 책제목을 정했다는 것이 읽기 전에 신선하게 다가왔습니다.

 

저는 잘 몰랐는데 기존에 "You don't Know JS" 시리즈가 있었고, 이번에 나온것이 2판이라는 내용을 알게 되었습니다.

 

이 책은 두개의 Part로 구성되어 있습니다.

Part1. 시작하기

Part2. 스코프와 클로저

 

 

시중에는 정말 많은 javascript 책이 출간되어 있습니다. 초급자용 쉬운책부터, 어려운 책들도 다양하게 나와있습니다.

이책은 기존에 출간된 책과 무엇을 다를지 궁금합니다. 대상독자는 어느 대상으로 하는지도 살펴보려고 합니다.

책의 내용을 빨리 보려고 하지 말고, 하나하나 오래 걸려도 필요한 내용을 살펴보는것을 저자분은 강조하십니다.

 

■ 대상독자

· 책에 나와있는 내용은 아래와 같습니다.

javascript 입문서가 아니므로 프로그래밍을 처음 접하는 분들에게는 적합하지 않습니다. 초심자라면 조금 어려울수 있습니다.

분야를 막론하고, 자바스크립트를 최소 6~9개월 동안 다루어보거나, javascript코드를 읽는 데 불편함이 없는 분들은 이책을 읽어도 좋습니다.

· 개인적으로 javascript는 웹개발을 하는 직군이면 피해갈수 없는 분야인거 같습니다. 이책은 조금 더 나은 개발자로 나아가기 위한 js책이 출간된거 같아서, 기쁩니다.

 

■ 자바스크립트란.
현재 사용하고 있는 js에 대해서 규정을 정하는 부분, 기존코드와 호환성, 바벨등 전반적으로 현재의 spec의 사용과 기술스팩에 대해서 어떻게 진행되고 있는지 설명합니다.

 

· TC39는 JS의 공식명세를 관리합니다.

https://github.com/tc39/proposals

https://262.ecma-international.org/10.0/

· 사례로 많이 사용하고 있는 alert, console.log는 정식JS에 정의된 문법이 아닌 부분도 새롭게 느껴졌습니다.

 

 

■ 들어가며 1,2장

· js 파일 각각이 별도의 프로그램이다,

js에서는 값은 크게 원시타입(promitive type)과 객체타입(object type)으로 분류됩니다.

· 인터프리터의 개념을 상세히 알려주어서, 실제적으로 컴파일이 어떻게 되어가는지 이해하게 됩니다.

· ES2019 최신 문법에 대해서도 설명하고 있어서, 앞으로 점차적으로 많이 사용하게될 문법에 익숙하게 됩니다.

· 변수, 배열, 객체, 함수에 대해서 단순한 설명이 아닌 평소에 고려하지 않았던 부분들 까지 포함해서 설명이 되어 집니다.

 

■ 자바스크립트 뿌리 파헤치기 3장

이장에서 부터는 조금더 깊이 있는 내용들로 구성이 되어 집니다.

· 이터레이션를 통해서 data를 잘 처리하기 위해서 이터레이터 , 이터러블에 대해서 정리합니다.

· 클로저를 통해서 실용적인 관점에서 최대한 구체적으로 구현을 진행합니다.

· this 키워드를 통해서 가장 오래를 많이 받은 부분부터 정의해 나가면서, this의 동작방식을 이해합니다.

· prototype을 통해서 접근할때 일어나는 동작에 관련된 특징을 알아봅니다.

평소 기본적인 js의 문법을 활용해서 사용을 해왔던 부분에서 조금 더 깊게 관련 키워드 및 동작방식에 대해서 이해를 할수 있는 예시와 설명으로 구성되어 있습니다. 

 

Part1의 부분에 두개의 부록 A,B가 있는데, 이러한 내용은 실제 미리 경험해보고, 코드를 작성할때도 고민이 되는 부분인데

적절하게 잘 언급이 되어 있습니다. 여기서 언급되는 내용들이 저는 좋게 느껴졌습니다. 해당 부분의 내용들은 검색을 통해서도 잘 볼수없는 내용들이 있어서 좋았습니다.

 

■ Part2. 스코프와 클로저

· 내용의 키워드들을 보면서, 문법위주의 항목이 아닌 javascript의 동작에 대한 부분인 것을 알수 있습니다.

 

· 스코프를 이해하기 전에 코드 컴파일 되는 원리를 먼저 설명하고 접근하는 방식이 인상깊었습니다.

내용을 급하게 살펴보기 보다는 천천히 이해도를 높이면서 다음장으로 넘어가는 방식이 좋은 방식이라는 말이 느껴졌습니다.

 

· frontend개발 면접시 많이 나오는 호이스팅에 대해서도 "변수의 비밀 생명주기"에서 설명되어 집니다. 어떠한 부분은 그것을 지징하는

용어를 잘 알지 못하였는데, 이론을 설명하는 과정에서 그러한 동작을 설명하는 용어를 알게 되는 부분도 있습니다.

· 조금 어려운 주제인 클로저에 대해서 다양한 예시를 통해서 설명하는 부분도 다른책과 차별점이 있었습니다.

 

 

 

■ 리뷰

평소에 이러한 조금 깊게 javascript를 학습하시거나, 동작방식에 대해서 궁금증이 있는 분들이면 아주 좋은 책입니다.

현업에서 개발 진행시, 오류는 발생을 하는데 문법적으로 문제가 없는데 원인을 찾기 어려운 부분들은 이제 조금더 깊게 동작원리를 알아야 하는 시점이 오신거라고 생각이 들고 이책을 통해서 조금더 깊게 javascript의 동작원리 및 잘못 사용하고 있는 패턴 및 방식을 학습할수 있을것 같습니다. 

이책의 목차 및 키워드들이 평소에 관심있는 부분이 한번 정독해보시는것을 추천드립니다.

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
Release의 모든 것 - 대규모 웹 분산 시스템을 위한 운영 고려 설계 | 아마존 소프트웨어 공학 분야 베스트셀러
마이클 나이가드 지음, 박성철 옮김 / 한빛미디어 / 2023년 11월
평점 :
장바구니담기


매우 유명한 책입니다. 지금 소개드리는 책은 [2판] 입니다.

부제 : 대규모 웹 분산 시스템을 위한 운영 고려 설계

 

첫버전은 2007년에 나온 아래 "Release It 릴리스 잇 성공적인 출시를 위한 소프트웨어 설계와 배치" 아래 책입니다.

왼쪽에 출간된 책이 초판, 오른쪽이 이번에 출간된 2판의 표지입니다.

정말 오랜만에 다음 개정판이 나온것 같습니다. 

 

번역을 담당하신 분은 "박성철"님으로 여러 활동들을 통해서 다양한 SW개발에 긍정적인 선한 영향력을 제공해주시는 분이십니다.

세미나를 통해서 들었는지, 어떤 글에서 본것인지는 잘 기억이 나지 않지만, "이책이 너무 좋은 책이라서 바쁘신 와중에 시간을 쪼개어서 번역을 진행하셨다고 들었습니다." 그만큼 애정이 가고, 좋은 책이라는 애정이 느껴졌습니다.

 

 

 

■ 추천사만 보아도 느낌이 다른책

· 서비스를 3년이상 운영해봤다면, 이책의 내용에 공감을 할수 있습니다.

· 번역을 누구나 하고 싶었던 책

· 모든말을 제처두고, 반드시 이책을 읽어야 합니다.

· 필요할때 마다 다시 꺼내서 한번 더 읽으세요

· 소프트웨어 출시 전 검점목록 같은책

· 시니어 개발자로 도약하기 위해 반드시 알아야할 내용

· 현실에서 잘 동작하는 프로그램을 만드는 방법

· 해결할 문제가 무엇이고, 어떻게 그 문제를 해결할수 있는지

 

■ 책의 구성

· 책은 총 4부로 구성됩니다.

· 1부 : 안정성 구축

 - 시스템이 작동을 유지하면서, 멈추지 않게 할 방법

· 2부 : 운영 고려 설계

 - 1부 안정성 다음에 지속적으로 운영하기 위한 방법

· 3부 : 시스템 전달

 - 배치(deployment)를 뜻하는 의미로 1판과 동일하게 배포가 아닌 배치로 변역하셨습니다.

    고객에 피해를 주지 않고, 배치를 하는 것을 하는 방법

· 4부 : 쳬계적 문제 해결

 - 시간이 지남에 따라 성장하고 유연하게 적응하는 시스템을 만드는 방법

 

· 운영환경의 현실

내용중에 우리는 QA부서의 테스트를 통화하는 것을 목표로 삼는다.

이 글이 주는 울림이 많이 있었습니다.  실제 QA를 통해서 기능적인 결함을 잘 찾고, 품질을 높이는 것은 분명한 사실입니다.

하지만, 우리가 만드는 서비스에 대해서 목표에 대해서 다시한번 생각해보고, 어떠한 주안점을 가지는 방향이 맞는지 알게 됩니다.

 

· 4장에서는 "안정성 안티패턴"에 대해서 설명하고 이어서 5장에서는 안티를 제거한 "안정성 패턴"을 설명합니다.

시스템들이 통합의 구성으로 연결되는 구조에서는 데이터의 input의 출처가 다양화 될수 밖에 없다. 이러한 시점에 우리는 장애시 발생될수 있는 연쇄반응에 대해서 고려해야 한다.

사용자가 늘어난다는 것은 트래픽이 늘어난다는 것이고, 이것은 기존에 구성된 시스템의 처리능력이 해당 요청을 처리할수 있는지 명확히 판단할수 있어야 한다. 시간단 처리 최대량에 대해서 알고 있어야 한다는 점이다. 

자연스럽게 물리적인 내부 메모리를 이용하는 방식에서 외부 메모리 시스템(멤캐시드, 레디스)와 같은 데이터 구조 서버를 고려하게 되며

이것은 지나친 서비스 비용이 발생하는 부분은 아닌지 고려해야 되는 부분이다.

· 불쾌한 사용자, 해로운 사용자에 대한 부분은 우리가 어떠한 부분을 고려해야 하는지 안내되어 집니다.

글의 중간중간 현업에서 고민되거나 맹목적으로 좋다고 사용하는 것에 대해서 고려해야 하는 글들이 있습니다.

 

라이브러리, 자기부정 공격, 공유자원, 처리능력 불균형, 도그 파일, 응답지연등에 대해서 우리가 구성한 시스템에서 나타날수 있는 다양한 현상을 설명합니다.

· 5장에서는 " 안정성 패턴"으로 우리가 시스템, 서비스를 개발할때 주의 깊게 보아야 하는 부분입니다.

시간제한(응답시간에 대한 제한을 적용하라), 회로 차단기(문제가 있으면 호출을 멈추어라), 격벽(유용한 분할 수준을 선정해서, 서비스의 일부분이라도 유지될수 있는 구조를 만들어라), 정상 상태에 대한 데이터, 로그, 캐시에 대한 처리 기준, 빠른 실패(느린 응답에 대한 빠른 노티)

파손방지, 핸드셰이킹, 테스트 하네스, 결하분리 미들웨어 등등 서비스를 운영할때 모두 다를 고려할 필요는 없지만, 서비스 구성에 대한 정의를 내릴수 있고 필요한 부분은 부분적으로 도입을 하는 올바른 방향을 제시합니다.

 

 

■ 소스 코드, 실제 분석 내용을 통한 reference

· 실제 필자분의 경험하신 사례를 통해서, 발생한 이슈 및 그에 대한 대응책, 해결방안의 내용을 보면서 실제 사이트 담당자의 입장에서 관련 이슈를 같이 분석해보는 생각이 듭니다. 발생된 사이트 및 관련 이슈는 단순한 범위가 아니고 실제 많은 사용자들이 사용하는 서비스의 이슈에 대해서 설명되어 집니다.

· 코드적으로 분석이 필요한 부분은 코드를 예시로 구성됩니다.

 

 

· 이론적인 부분에 대한 설명도 예시를 들어 구성되어 있습니다.

 

 

· 개념, 구조가 필요한 부분에 대한 서비스흐름형태가 설명되어 집니다.

 

 

 

■ 운영 고려 설계

· 이 단어가 모두 좋은것 같습니다. 2부의 제목인데 우리는 실제적으로 운영환경에서 장애를 발생안하고, 안정적인 요구사항을 서비스 하기 위해서 고민하고, 개발을 합니다. 단순한 개발이 아니라, "운영을 고려한 설계"는 궁극적으로 우리가 나아가는 방향과 일치하는것 같습니다.

 

· 실제 일어난 사례를 통해서, 우리도 저자분과 함께 해당 사이트에서 일어나는 일을 경험해보고 우리는 어떠한 fact를 고려하고, 파악할수 있는지 상세하게 느낄수 있습니다.

 

· 운영고려설계의 개념은 "운영문제를 최우선고려사항"으로 생각한다는 뜻이다.

개발환경과 매우 다른 운영네트워크가 포함되고, 로그, 모니터링, 운영제어, 보안도 포함된다., 운영담당자의 입장의 설계도 포함된다.

7장 "기반" chapter에서는 우리가 아는 데이타센터 IDC와 클라우드도 포함되어서 설명됩니다. 1판에서는 클라우드에 대한 부분이 없었지만 2반에서는 클라우드 환경에서 대해서도 추가되어서 많이 사용하고 있는 AWS등의 서비스를 이용할때의 고려점도 언급되어 있습니다.

- 네트워크 인터페이스와 이름, 다중네트워크 프로그래밍, 물리 호스트, 가상머신, 컨테이너, 클라우드 내 가상머신, 클라우드 내 컨테이너에 대한 부분이 있는데, 우리 소속이 인프라를 담당하는 부서가 아니라고 한다고 해도, 장애의 최초 보고는 사용자 화면을 이용하는 접점인 개발부서로 처음 오기 때문에 대한 부분도 다른 부서의 영역이 아닌, 원인을 찾는 모든 부서의 영역이 된다고 생각합니다.

8장 "프로세스" 부분은 개발 인스턴스 입장에서 초첨을 맞추는데, 이러한 개발젹인 개발의 효과를 높이고, 구성을 어떻게 하고 로그 기록에 대한 위치, 수준에 대해서 고민하게 됩니다.

9장 "상호연결"을 통해서 인스턴스 들이 함께 연결되어 하나의 시시템이 되어야 하는데, 이러한 방법에 대한 해법을 살펴볼수 있습니다. 

DNS를 활용한 연결, 서버 부하 분산, 가용성등 다양한 관점으로 평소 잘 신경쓰지 않았던 부분을 볼수 있었습니다.

사용자가 많아지만 고민하게 되는 부하분산에 대해서, 소프트웨어, 하드웨어 방식으로 부하를 분산할때 사용되는 프록시 서버, 알고리즘등에 대해서, 하드웨어는 상용장비의 예시를 통해서 처리하는 방법등 생각의 폭을 넓혀줍니다.

10장에서는 "제어 평면" 이라고 되어 있어서 어색했는데, 각종 기능 및 서비스들을 올바른 위치에 놓고, 어느정도 일관된 젠체로 엮는 부분을 말합니다. 책에서 언급하는 점검 목록은 아래와 같은 사항입니다.

 

· 11장 보안 부분에서는 OWASP에서 나온 상위 10개의 개념에 대해서 설명합니다. 보안취약점 검사를 통해서 나온 결과에 대해서 의도를 파악하지 못하고 수정을 하지 말고, 실제 중요한 취약점 공격의 원리를 설명해주고 있어서, 이해가 쉽게 설명되어집니다. AWS클라우드 사용시에 활용하는 방법도 함께 포함되어 있습니다.

 

■ 시스템 전달

· 3부에서는 우리가 운영환경에서 필수적이 요소들로 구성되어 있습니다. 배치(배포), 버전관리에 대해서 다룹니다.

배치는 서비스를 운영환경에 올리는 과정이기 때문에 고려해야 할 사항이 매우 많고, 그 순서와 구성도 고려할게 많습니다

배치를 하면서 기존 캐시의 전략은?, 장애 발생시 롤백에 대한 계획은? 테이블 스키마가 기존에 있는경우, 없는 경우등에 대해서 고려 하다보면 그 난이도는 매우 높아집니다. 또한 이러한 부분은 언어적인 제약이 있는 부분도 있기 때문에 책을 통해서 좋은 방향성 및 지금 배포시스템에 도입이 필요하거나, 주의해서 추가해야 하는 부분을 파악해볼수 있습니다.

버전관리에 대해서는 git, svn같은 형상관리의 버전을 의미하는 것이 아닌, API의 버전과 같은 버전에 대해서 설명합니다.

 

■ 체계적 문제 해결

· 4부에서는 평소 업무에 한번은 경험해보았을만한 다양한 사례연구 및 Agent가 제시됩니다. 

최정점검과 출시, QA지향, 부하테스트, 테스트 간극 등등 저도 평소에 고민하던 부분이라서 현실감있게 다가왔습니다.

· 절차와 조직, 팀의 규모, 서비스의 종료, 시스템 아키텍처에 대한 진화적구성, 마이크로서비스에 대한 조언등 선택과 갈등에 대한 부분은 결국 서비스를 잘 릴리즈 하고, 자원은 안정적으로 효율적으로 사용하기 위한 하나의 큰 소프트웨어 라이프사이클에 대해서 느끼게 해주고

카오스 공학적인 내용을 통해서, 앞으로 새로운 분야도 소개됩니다.

 

 

좋은 책이라는 의미가 많이 와닿은 책이였습니다.

이 책을 보고 느끼는 바가 모두 다를거 같습니다.

아는 만큼 보이고 한줄의 문장이 더 많은 고민을 하게 된다면

조금 더 나은 Release를 하고 있는 개발자, 엔지니어 분들이라고 생각되어 집니다.

스터디를 해도 좋고, 우선 필요한 부분에 대해서 부분 학습을 해도 좋은 책이라고 생각되어 집니다.

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 


댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
모니터링의 새로운 미래 관측 가능성 - 프로메테우스, 그라파나, 오픈텔레메트리까지 마이크로서비스와 인공지능 중심의 옵저버빌리티 구현
정현석.진미란 지음 / 제이펍 / 2023년 12월
평점 :
장바구니담기


이 책을 처음 보고, 처음 궁금했던 하거나 들었던 생각을 정리해보면 아래와 같습니다.

1. 번역서가 아니다. 왠지 번역서인것 같은데 국내 저자분의 책이라서 조금 더 흥미가 생겼습니다.
2. 표지가 정말 멋지다. (아래 숨어있는 위험요소를 잘 표현한것 같다)
3. 단순히 모니터링에 대해서 관심만 있는데, 이책은 도움이 될것인가?
4. 프로메테우스, 그라파나, 오픈텔레메트리에 대해서 자세히 설명되어져 있는가?
5. 마이크로서비스, 인공지능까지 너무 넒은 범위까지 다루는것은 아닌가?
6. 이 책을 읽으면, 작은 부분이라도 우리가 하는 서비스 모니터링에 바로 도움이 되는 부분이 있을까?

 

이 책을 읽어보면서 해당 궁금증을 하나하나 살펴보려고 합니다.

■ 목차 살펴보기 (본문 보기 전)

· 목차를 구분지어서 생각해보면, 아래와 같이 크게 3단계 구성으로 설명되어집니다.

  모든 분들이 필요하거나, 궁금해 하시는 부분이 다르기 때문에 필요한 부분을 살펴보면 도움이 될것 같습니다.

· 예를들어 오픈소스 모니터링 tool이 소개되는데, 해당 내용은 별도의 단행본으로 출간된 책은 거의 없습니다.

  이러한 부분에 대해서 설치과정부터 주요지표부분은 충분히 많은 가치를 가지는것 같습니다.

· 인공지능 모니터링 부분은 저자분중이 ML쪽 엔지니어의 경험이 있으셔서 현실적인 조언이.

· 1장,2장 부분에서 우리는 서비스가 확장되고, 사용량이 늘었을때 과연 어느지표를 가지고 해당 서버 Spec으로 최대한 튜닝을 해서 사용을 하고 있다고 판단하고, 서버를 scale out하던지, scale up 하는 결정 근거를 세울수 있는 내용으로 구성되어 있고, 오류 및 모니터링에 대한 큰 기준을 가지게 되는 이론적인 내용으로 구성되어 있을것 같습니다.

제가 예상한 구성 및 내용이 맞는지 살펴보고, 처음느낌 그대로 인지 체크해보겠습니다.

 

 

책을 읽어보면서, 위에 가정했던 부분에 대한 고찰

▶ 체크1 : chapter1, chapter2 부분의 내용도 일반적인 내용의 모니터링에 대한 내용이 아닙니다. ^^ chaper1부터 PromQL 에 대한 설명등 등 큰 개념의 "관측가능성 입장의 모니터링", "큰 규모의 서버들"을 고려한 관점으로 설명되어 집니다. 

 

▶ 이책의 레벨은 입문/초급자 수준은 아닙니다. 책의 뒷편에서도 중급자로 표기되어 있습니다. 평소에 책에서 소개되는 기술들에 관심이 있다면 이런 모니터링 책이 나오기 힘든데, 국내 저자분의 다양한 예시 및 설명은 많은 도움이 됩니다. 헙업에서 관련된 부분의 업무에 겹치는 부분이 있으시면, 많은 가이드를 통해서 바로 적용할수 있을것으로 생각됩니다.

■ 관측 가능성

· "관측 가능성" : 책의 제목은 왜 모니터링에 "관측 가능성" 이라는 단어를 넣었고, 명명하였을까? 이 개념을 알아야 이 책에서 설명하려고 하는 가장 중요한 방향성을 이해 할수 있습니다. 해당 개념이 아직은 생소한 개념이기 때문입니다.

· 책에서 정의는 아래와 같이 합니다. -> 시스템에서 외부로 출력되는 값만을 사용해서, 시스템의 내부 상태를 이해하고, 예측하는것

보통 테스트 케이스를 구성할때, 블랙박스 테스트 / 화이트박스 테스트를 진행하는데, 그것과 다른 미리 예측하는 관점의 개념을

관측가능성의 영역이라고 생각하고 개념을 잡으면 됩니다. 

■ 다양한 오픈소스들

· 관측가능성 오픈소스에 대한 책에서 사용한 오픈소스는 아래와 같다.

· 오픈텔레메트리 : 계측을 위한 표존화된 도구, API, SDK 모음

· 로키 : 그라파나의 로그 관리 시스템

· 그라파나 미미르 : 프로메테우스용 오픈소스

· 타노스 : 다수의 프로메테우스를 통합할수 있는 글로벌 뷰 제공

· 예거 : 마이크로서비스 기반 분산 시스템 모니터링과 추적, 프로파일 연계

· 그라파나 템포 : 그라파나의 오픈소스 추적 솔루션

· 엘라스틱 서치 : 로그 관리

· dynatrace APM : 클라우드 네이티브 및 엔터프라이즈 스택을 위한 APM, 처리량, 지연시간을 모니터링

· influxDB / Telegraf / splunk /  new relic / Prometheus /  grafana / 오프서치

 

· 참고 : https://blog.samstdio.com/system-monitoring-tick-stack-1/

 

 

■ 내용 소개

· 프로메테우스의 다양한 사용법이 처음부터 설명되어 집니다.

· 쿠버네티스의 환경이 있다면, ks8까지 테스테 구성을 해보면 좋겠지만, 각자 테스트를 할수 있는 범주안에서 직접 실습을 해볼수 있으면 좋을것 같습니다. 내용이 너무 좋은데, Application을 개발하는 부분이 아니다 보니, 직접 경험해서 확인하는 것과는 많은 경험차이 및 이해하는 부분에 차이가 있을수 있습니다.

 

프로메테우스는 ks8에서 기본으로 사용을 하지만, 별도로 WAS, Spring만 사용하는 일반적인 다른 모니터링에서도 다양하게 사용이 가능합니다. 책은 프로메테우스에 익숙해지고, 제공하는 다양한 기능들을 설명합니다.

로그에서는 오픈텔레메트리를 사용해서 구조회된 로그를 생성하는 방법을 이용합니다.

오픈텔레메트리에 대해서는 https://jennifersoft.com/ko/blog/tech/opentelemetry/ 글을 참고하시면 좋을것 같습니다.

 

실제 사용하지 않은 오픈소스는 어색합니다. 명칭부터 어색하고, 실제 어떠한 목적/기능이 있는지 선뜻 다가오지 가 았습니다.

처음에 주요 기능으로 사용되는 개념을 잡아놓고 책을 보신다면 지면에 나와있는 다양한 정보가 의미있게 다가올것 같습니다.

 

관측 가능성의 구성요소를 3가지로 정의하고 있습니다.

메트릭, 로그, 추적의 요소로 정의하고 있습니다.

  • 메트릭과 로그는 익숙하실수 잇는데, 구성요소 중에 추적이라는 개념은 조금 생소 하실수 있습니다.
  • 로그에 노출된 에러 사항만을 보고 추적하는 방향에서 조금더 예측 가능한 구성으로 구분지어 연관성을 파악합니다.

 

SLI, SLO, SLA등의 서비스 지표에 대한 용어도 언급되어지며,

1장부터 바로 PromQL을 이용해서 필요한 지표를 어떻게 구성할지, 예시가 제공됩니다.

→ 이 부분이 의미하는것은 Prometheus를 책에서 기본으로 사용적으로 설명되어 진다는 의미입니다.

 

모니터링과 관련된 시스템이 구성되어 있다면, 실제 얼마나 잘 사용하고 있는지 돌아보게 되었습니다.

일반적으로 서비스의 오류사항을 확인하는 것을 넘어서, 정보는 많은데 실제 효율적으로 기준을 세우고 활용하고 있는지는 되돌아볼 문제입니다.

 

이 책은 그러한 기준을 넓혀주는데 많은 도움이 됩니다.

에러라고 생각되어지는 부분에 대해서 500, 400 http status말고 어떠한 측면을 어떻게 모니터링하는게 좋을지 제시합니다.

 

아래와 같은 형태로, 사용할수 있는 PromQL을 확인할수 있습니다.

 

 

 

■ 테스트 환경에 진심이 책

· 이책의 장점은 아래그림처럼 다양한 데모 환경을 구성하는 부분입니다.

모니터링을 하기 위해서는 운영환경처럼 동일하지는 않지만, 비슷환 환경의 구성이 필수인데 이점은 정말 좋은 구성입니다.

아래 항목중에 평고 고민되었거나, 체크해보고 싶은 모니터링 항목이 있다면 업무에서도 쉽게 적용이 가능할 것으로 보입니다.

 

상세한 소스 설명이나, 추가적인 데모, SW버전업에 대해서는 https://yohaim.medium.com/을 통해서 업데이트 되니 실습시의 오류도 최소하 할수 있을 것 같습니다.

 

 

 

 

· 후속작이 기대됩니다.^^

 

■ SRE역활을 하거나, 실제 모니터링에 업무를 진행하시는 분들은 이책이 쉬울수 있지만, 처음 책을 보시는 분들은

여기서 나오는 다양한 오픈소스의 역활 및 사용처, 동작방식을 통해서 실제 어떻게 활용을 할지 명확하게 이해하는 것만으로

많은 것을 얻어가는 부분이라고 생각됩니다.

 

실제 업무적으로 바로 사용할수 있는 예시로 구성되어 있어서, 이러한 고민을 하셨던 분은 정말 많은 현실적인 도움을 받을수 있는 내용으로 구성되어 있습니다.



댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
스트리트 코더 - 프로그래밍 세계에서 살아남기 위한 개발자 생존 가이드!
세다트 카파노글루 지음, 이준용 옮김 / 길벗 / 2023년 8월
평점 :
장바구니담기


책의 제목도 그렇고, 표지의  그림도 매우 궁금증을 일으키는 구성입니다.

개발자의 성장은 끝이 없고, 기존의 기술도 심도있는 학습이 필요하고 새로운 기술의 발전도 빠르기 때문에

"개발자 생존 가이드" 이 부분은 어느 개발자 분들이나 추구하는 방향이 아닐가요?

 

이 책에서는 어떠한 내용을 다룰까 궁금합니다.

책에서는 코드적인 내용이 있을까? 마인드 부분을 강조하는 것일까요?

 

·    저자분은 독학으로 개발자가 되었다고 합니다. MS에서 윈도우 핵심부서에서 근무를 하신 이력이 있으시고,
이책은 독학하면서 MS엔지니어가 된 저자의 경험을 바탕으로 수 많은 개발자를 위한 생존 법칙과 노하우를 담고 있습니다.

 

 

 

■ 목차 및 책 소개 살펴보기

·  목차

1장 거리로
2장 실용적인 이론
3장 유용한 안티패턴
4장 맛있는 테스트
5장 보람 있는 리팩터링
6장 조사를 통한 보안
7장 자기 주장이 뚜렷한 최적화
8장 기분 좋은 확장성
9장 버그와의 동거

목차는 이렇게 구성되어 있습니다. 

샘플코드는 C#, .NET으로 구성되어 있는데 코드를 보고 저자분의 의도를 파악하는 부분은 크게 어렵지 않게 소스를 볼수 있습니다.

특정 언어에 대한 소개 가 아니기 때문에 주요 관점을 설명하는 목적으로 사용하고, 이른적이고 내용이 더 많은 구성으로 되어 있습니다.

책의 소개 에 대해서 살펴보니, 아래 출판사의 책 소개글에서 핵심이 잘 소개 되어 있어서 여기서도 소개 하려고 합니다. 

 

아래 내용을 보면, 우리가 별도의 책으로 출간되는 항목들이 보입니다. "알고리즘", "리팩토링", "보안", "프로젝트" 등등 이러한 부분들은

우리가 매우 중요하게 생각하는 부분입니다. 저저의 입장에서 어떠한 부분을 접근해야 하는 경험 및 관점을 살펴볼수 있는 내용이라고

생각됩니다.

 



■ 2장. 실용적인 이론

·  내용을 살펴보면, 해당 내용,항목으로 java, c#, python, go등 모든 언어의 세부 기술을 적을수 있다는 생각이 듭니다. 

즉 거의 모든 언어에서 채택하고 있는 개념에 대해서 설명을 합니다.

예를 들어서, 알고르짐, 빅오에 대해서 간단히 설명하고

문자열, 배열, 리스트, 연결리스트, 큐, 딕셔너리(맵), 해시, 스택 등 우리가 모든 언어에서 사용하는 개념에 대해서 자세히 설명을 합니다.

이러한 부분에 대해서 한번 개념을 잘 잡아놓으면, 언어에 차이없이 쉽게 개념을 파악할수 있습니다.

다음에 설명되어지는 것 또한 모든 언어에서 언급되는 부분입니다. 타입에 대한 부분입니다.

변수에 대한 타입으로 인해서 발생되는 다양한 케이스, null에 대한 고민, 참조타입(메모리 저장방식)등 설명되어지는 부분이 개발 언어을

한번이라도 학습해본 개발자라면 충분히 공감이 되고 중요한 개념이라고 생각되어 집니다.

 

 

■ 3장. 유용한 안티패턴

·  제목이 매우 흥미롭습니다. 디자인 패턴등을 학습하면서, 의도적으로 적용하는 방법은 그렇게 좋아보이지 않는 경우도 발생합니다.

DB에서 의도적인 반정규화가 있는것처럼, 좋은 디자인 패턴에 대한 설명을 한것 반대의 입장을 살펴보는 것도 균형있는 방향성을 가질수 있을것 같습니다. 실제 무슨 디자인패턴은 사용하지 말아라!! 이런 관점을 설명하는 내용은 아닙니다.

 

·  사례로 기준에 구현된 "코드재작성"을 하는 것을 보통 힘들고, 해당 방식으로 진행하지 않고 기존 소스의 로직을 개선하는 방향으로 진행을 한다. 이러한 방식의 장단점은 있지만, 해당 코드를 개선하는 방식으로 진행시 어떻게 진행해야 하는지 하나하나 StepbyStep으로 설명을 합니다.

  • 코드의 경직성에 맞서라
  • 빠르게 옮기고 깨버리자
  • 경계를 존준하라 : 추상화의 경게를 잘 파악해서 웹/비지니스/DB간의 경계를 잘 파악해야 하는 부분이다

  • 공통적인 기능을 분리하라 : 우리가 새롭게 기존 조직을 개발하려고 할때, 공통으로 만드는 공통모듈에 대한 고민은 필수이다.

·  다른 관점

처음부터 다시 작성해야 하는 경우 등에 대해서 코드를 변경하는것이 위험하더면, 처음부터 작성하는 것은 훨씬 더 위험할것이다. 이럴때 어떤한 부분을 고민하고 생각해야할  기준이 제시되고 있다. 라이브러리에 대한 버전 충돌이 일어나는 부분을 고민해볼수 있는 가이드가 제시된다. 

·  새로운 것을 시도하는 입장

아래 입장은 매우 자극적이라고 보실수도 있는데, 무조건 사용하지 말라는 입장이 아니라, 열거형을 사용해라 / 구조체 등 꼭 고려해야 하는 부분을 언급하는 부분으로 내용이 구성되어 있으니 오해는 없었으면 좋겠습니다.

  • 상속을 사용하지 마라
  • 클래스를 사용하지 마라
  • 불량코드를 작성하라
  • 코드 주석을 작성하지 마라

객체 지향에 대해서 많이 알고 있는 SOLID에 대한 저자분의 의견
"P. 105 내용 소개..

약어를 만들기 위해서 억지로 만들기 위해 맞춘 느낌이 든다. ....(중략).. 이런 원칙의 가치를 아무런 확신 없이 그대로 받아들이는 것을 결단코 반대한다."

이런한 내용은 이책에서 잘 이해는 안되지만 무조건 읽어봤던 원칙에 대해서 조금더 현실적인 조언이라고 생각이 됩니다.

 

 

 

■ 4장. 맛있는 테스트

제목부터 아주 흥미로운 주제입니다. 또한 테스트를 언급하고 설명하는 것이 이 책의 완성도를 높여준다고 생각합니다.

우리는 보통 TDD를 이야기 합니다. 그런데 여기서 다루는 항목에서 TDD, BDD와 같은 용어 피하기는 어떠한 다른 시작을 제공하는 것일까요? 테스트가 누구나 필요하다고 생각하지만, 쉽게 접근하지 못하는 부분도 있는데 조금은 현실적인 조언 및 가이드로 구성되어 있지 않을까 생각합니다.

 

 

·  저자분은 어떻게 하는 테스트방법을 권장하고, 알려주려고 하시는 것일까?

수동테스트, 자동테스트 등등 우리가 이론적으로 다 알고 있는 것이다, 코드 리뷰도 어떻게 보면 수동테스트의 일환으로 볼수도 있다. 
아래 그림은 SW경력이 있는 분들이면, 누구나 생각해볼수 있는 flow입니다. 그림만 보아도 자동화된 테스트가 좋다는 것은 쉽게 알수 있습니다. 

 

· 단위테스트라는 말을 많이 사용하는데, 단위라는 기준에 대한 범위를 정하는 것도 어찌보면 단위테스트의 시작점이다.

· 단위테스트 프레임워크를 사용하는 것이 더 좋다는 입장이다. JUnit, NUnit 등등에 대해서 수동으로 테스트 로직을 작성하는 것보다, 다양한 케이스를 한꺼번에 실해야야 하는 입장에서 훨씬 편하게 접근할수 있습니다.

· 자신의 이득을 위해서 테스트를 작성하라. (보여주기 입장이 아닌, 실제 다른 변화를 검증하기 위한 코드로 구성하자)

· 테스트 전문서적을 보면 경계값에 대한 부분에 대한 검증을 많이 강조한다. 조건이 걸려있는 로직에 대해서 테스트를 이책도 강조하고 있다. 입력값 분할을 통해서 모든 범위를 커버하는 케이스를 확보하자.

· 모든 테스트를 작성하려고 하지 마라. 주요 버그는 20%의 기능에서 대부분의 버그 횟수를 커버하는 것은 8:2 파레토 법칙이다. 테스트를 현명하게 하는 방향으로 선택하는 것이 좋다.

· 컴파일러가 코드를 테스트 하도록 코드를 작성하도록 하자. (컴파일시, 오류를 체크하는것이 최고의 테스트 케이스라고 생각된다)

· 유효값을 확인하는 로직에서 중복을 제거하라

· 테스트 이름을 잘 정의하는 것이, 실제 운영코드와 테스트 코드에 모두 좋은 효과를 가지고 온다. (실제 이름이 명확하지 않으면, 그 의도를 파악하는데, 더 시간이 소요되기 때문이다)

 

 

■ 5장. 보람있는 리팩토링

리팩토링은 꼭 필요한 부분이다. 여러명의 개발자의 개발 코드를 조금더 개선하는 것은 기존의 개발자의 코드를 무시하거나, 잘못되었다고 원망하는 입장이 아닌 현재의 코드는 동작되는 것이고 시대의 흐름으로 주변 SW의 버전업, 새로운 기법등이 나와서 수행되는 자연스러운 과정으로 생각되어 질수 있다.

· 리팩토링은 왜 하는지 한번 remind를 해보면 아래와 같이 정의할수 있다.

  1.  반복을 줄이코 코드 재사용을 증가시킨다
  2. 여러분의 정신 모델과 코드를 더 가깝게 한다.
  3. 코드를 더 이해하기 쉽고 유지관리하기 쉽도록 만든다.
  4. 특정 클래스에 버그가 발생하지 않도록 한다.
  5. 중요한 아키텍러 변화를 준비할수 있다.
  6. 코드의 경적된 부분을 없앨수 있다.

· 한번에 큰 아키텍처를 변경을 수행하는 것은 결코 좋은 생각이 아니다. 

· 일반적으로 IDE를 통해서 메소드, 클래서, 공통요소를 추출하거나, rename하는것도 한 부분이지만, 조금더 전문적인 기준이 있어야 한다.

보통 하나의 기능을 담당하는 클래스, 모듈을 변경시에 각자 생각하는 범주가 다르다. 우선 이러한 범주를 설정하고, 작은 범위 단위로 접근하는것이 좋은 이유가 작은것을 검증하면서 확장해 나가는 구성을 가질수 있기 때문이다.

 

 

· 우리는 어떠한 기준으로 리팩토링 절차를 진행해야 할까?

  1. 구성요소를 식별 : 의미적으로 다른 구성요소를 나누는것이 좋다.
  2. 작업량과 위험도를 추정 : 컨트롤러, 뷰, 모델을 이용하는 작업시 업무에서 조금더 높은 위험도를 할당해서 구성하고 판단한다.
  3. 움직이는 바퀴를 갈아끼는 것이라고 하는데, 기존 프로젝트와 신규 프로젝트 2개가 혼재되어서 잘 동작되는 방향으로 진행한다.
  4. 더 쉽게 리팩토링 기법을 활용하자 : 인터페이스, DI 등을 통해서 종석성을 제거하는 방법을 이용한다.
  5. 득보다 실이 많을때는 리팩토링을 하지 않은것을 고려해야 한다.

■ 6장. 조사를 통한 보안

앞장에서 다루는 큰 대분류에서 보안이라는 부분이 빠지면 안되는 중요한 부분이다.

SQL삽입, CSRF, XSS, 오브플로와 같은 개발시 익숙한 키워드 들이 보인다.

· 해당 부분의 내용도 단순히 주의해야 하는 부분에 대해서 간단히 언급만 하는 것이 아니라, 세부 예시를 들어서 설명해주고 

취약점에 대해서 어떠한 경우에 발생하는지 코드적으로 접근하는 부분으로 구성되어 있어서 이해를 쉽게 할수 있습니다.

· 조금 다른 관점으로 시야를 크게 생각할수 있는 항목들이 있스빈다.

  1. 캡차를 사용하지 마라
  2. 캐시를 구현하지 마라
  3. 암호 관련하여서, 고정된 솔트를 사용하지 마라 / UUID는 랜덤이 아니다.

등에 대해서는 조금 더 다른 관점으로 우리가 놓치고 있는 보안취약점의 경험을 알 수 있습니다.

 

■ 그 이후의 내용

· 7,8,9장에서도 SW개발을 개발하는데, 고민해야 하는 부분이 어김없이 설명됩니다.

단순히 해당 시점에 개발이 완료되고 릴리즈 되었다고, 해당 서비스의 개선 및 수정이 없는것은 아니고 

서비스를 이용하는 트래픽 및 사용케이스의 변화에 따라서 고려해야 하는 경우가 설명되어집니다.

자신이 어려움을 경험하고, 비슷한 케이스에 대해서 트러블장애를 경험해보셨으면, 조금 더 현실적인 조언이라고 느낄수 있는 구성입니다.

 

 

7장에서는 최적화를 위해서 하드코어한 최적화 기술 및 성능문제를 해결하기 위한 접근방법의 내용으로 구성됩니다.

 

 

8장에서는 코드의 확장성을 높이는 방법과 병렬화 매커니즘이 성능과 응답성에 미치는 영향도를 다룹니다.

 

9장 마지막 장에서는 버그와 오류처리를 위한 모범사례을 설명하고 오류 복구 코드를 작성하는 기술에 대해서 설명합니다.

 

 

프로그래밍을 하다보면 느낄수 있는 거의 모든 사항이 담겨있다고 생각합니다. 

일반적인 이야기를 하지 않고, 조금 더 현실적인 접근법과 기존에 생각하지 못했던 부분에 대한 언급도 사고의 폭을 넓게 해주는 구성으로 되어 있습니다. 개발을 코드를 작성하고 나서 이후에 발생하고, 고민해야 하는 부분이 잘 정리되어 있어서 다양한 경험을 간접체험 할 수 있고

조금 다른 관점으로 우리를 발전 시킬수 있는 책이라고 생각합니다.

 

"길벗  <개발자 리뷰어> 활동을 위해서 책을 제공받아 작성된 서평입니다."




댓글(0) 먼댓글(0) 좋아요(0)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo
 
 
 
우아한 타입스크립트 with 리액트 - 배달의민족 개발 사례로 살펴보는 우아한형제들의 타입스크립트와 리액트 활용법
우아한형제들 웹프론트개발그룹 지음, 김민태 감수 / 한빛미디어 / 2023년 10월
평점 :
장바구니담기


책의 제목은 "우아한 타입스크립트 with 리액트" 입니다.

부제는 "배달의민족 개발 사례로 살펴보는 우아한형제들의 타입스크립트와 리액트 활용법" 입니다.

이 책은 타입스트립트 책입니다. 저자분은 특정 1인이 아닌, 우아한 형제들에서 "웹프론트개발그룹" 에서 공동집필을 하였습니다.

총 8분이 공동집필하셨습니다. 정말 좋은 오보딩 가이드 책이 될것 같습니다.

이렇게 회사에서 실제 사용하는 실무코드 및 노하우를 설명해주는것이 개발자 입장에서는 매우 현실적인 조언이 되기 때문입니다.

 

 

■ 책의 구성

· 기본적으로 타입스크립트를 설명합니다. 다만 기본적인 html,css,javascript를 알고 있다면 조금 수월하게 책을 접할수 있습니다.

· React를 알고 있으면, 우형에서 React의 JSX문법활용, Hock, 상태관리를 사용할때, 어떻게 ts를 적용하는지 알려줍니다.
하지만 React를 알지 못하여도, 타입스크립트만 학습해도 문제는 없습니다. (추후에 활용하게 될 기회가 많이 있을것으로 생각합니다)

·  책의 예제 저장소 : https://github.com/woowa-typescript

 

■ 구성되어진 내용

·  기존에 javascript를 조금이라도 알고 계신 개발자 분들이라면, 초반 chapter를 개념도 정리하고 재미있게 읽으실수 있습니다.

·  강타입 / 약타입을 설명할때, 아래와 같이 다른 언어도 함께 예시를 들어주시는 부분이 좋았습니다.

아래와 같이 책에 전반적으로 typescript로 작성시, 또는 javascript로 작성시 다른점,차이점이 직관적으로 예시를 통해서 설명되어지는 부분은 ts의 장점, 차이점을 알아볼수 있어서 학습하고 이해하기에 충분한 예시를 제시합니다.

추가로 java등 다른 언어에 대해서도 다양하게 예시로 활용해서, 다각도로 예시를 들어주는 책인것을 알수 있었습니다.

 

·  typescript의 독자적인 타입은 기존 javascript를 사용했을때 없는 개념이여서 혼돈이 있는 부분입니다.

any, unknown, void, never등의 타입에 대해서 개념을 쉽게 잡을수 있게 설명되어 집니다. 일방적으로 문법적으로 설명하기 보다는

어떠한 경우에 대해서 사용하는지, 이러한 타입에 대한 개념은 ts를 이해하는 가장 기본적인 개념입니다.

여기에 정의된 타입을 잘 이해하고 사용해야, 의도한 타입이 체크되고 활용할수 있습니다.

제네릭에 대한 부분도 함께 고려할수 있습니다.

 

·  타입에 대해서 확장을 하고 기존타입을 사용해서 새로운 타입을 정의할수 있습니다. 

기본적으로 타입스크립트에서는 interface 와 type키둬드를 사용해서 타입을 정의하고, extends, 교차타입, 유니온 타입을 사용하여 타입을 확장합니다. 타입 확장에 대한 예시를 구성할때, 우리가 익숙한 배달의 민족의 예시를 사용해서 설명을 하는 것은 책의 재미를 줍니다.

 

타입을 사용할때 무조건 확장을 반대로 줄이는 것도 필요하다. 타입을 좁히기를 통해 더 정확하고 명시적인 타입 추론을 할수 있게 되고, 복잡한 타입을 작은 범위로 축소하여 타입 안정성을 높일수 있다. 

- 타입가드에 따라 분기 처리, typeof, instanceof, in, is 연산자를 활용해서 다양한 기법을 제시합니다. 

 

 

■ 활용적인 내용

·  6장부터는 ts의 문법보다는 아래와 같은 사항들이 설명되어 집니다. 

타입스크립트도 javascript로 변경이 되어야 합니다. ts로 코드를 작성하였어도 언제, 어떤 방식으로 변환이 되는지 알게 된다면 타입스크립트의 컴파일 하는 과정을 통해서 동작원리를 파악하게 됩니다.

·  실제 비지니스 로직을 수행하기 위해서 API를 호출하게 됩니다. 이러한 부분은 비동기 호출이 필요한 부분으로 처리를 하는데 그러한 방법은 fetch, Axios등을 활용한 실제 데이터를 서버에서 받아와서 처리하는 부분에 대한 내용으로 구성됩니다. 호출도 중요하지만, 실제 받아온 result에 대해서 타입스크립트에서 어떻게 처리하는지에 대한 부분도 매주 중요합니다. 응답값에 대한 Superstruct 활용사례 및 API의 상태관리하는 방법에 대한 내용이 있습니다.

·  react를 사용할때 JSX문법을 사용하는데, jsx에 대해서 어떻게 타입스크립트에 적용하는지 8장에서 언급됩니다.

·  추가로 react에 hock을 사용할때에는 useState, useEffect등등을 어떻게 적용할지, custom hock에 대한 부분이 있습니다.

·  실제 타입스크립트의 프로젝트를 진해할때 어떻게 관리하고 주의해야 하는지 12장에서 설명됩니다. 타입스크립트의 유용하게 활용할수 잇는 개념과 팁이 소개됩니다. 앰비언트 타입 활용을 하고, 실제 우아한 형제들에서 declare 키워드를 활용한 사례도 살펴봅니다.

 

 

■ 누군가 기술적인 고민, 질문등 나와 같은 고민을 우형에서 함께 고민해주는 느낌

·  우형에 고민했던 현실적인 이야기들이 책의 곳곳에 있습니다. 여러가지 "우형 이야기" 중에서 평소에 고민을 해보았던 내용이 있다면 

그리고 답을 아직 찾지 못하였던 부분에 대해서 이책을 통해서 아...나만 고민했던 부분이 아니구나!!
이렇게 결론을 낼수 있고 접근하면 되는구나...!!

이러한 부분이 하나라도 있다면, 정말 이책은 독자분에게 도움이 될것 같습니다. 언급되는 내용이 기본적인 문법적인 부분도 있고 평소에 개발을 할때, 고민이 당연히 되는 다양한 현실적인 이야기를 담겨 있어서 매우 좋았던 부분입니다.

·  5장에서는 조금더 우아한형제에서 사용하는 코드를 경험 할 수 있습니다. 실제 코드 예시를 살펴보면서, 정확한 타이핑을 하지 못해 발생하는 문제를 타입스크립트를 이용해서 해결해봅니다. 추가로 react, react-query 코드를 포함하는 예제를 통해서 실제 활용하는 예제를 경험하면서, 현업에서 시행착오를 줄일수 있게 가이드 합니다.

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

 


댓글(0) 먼댓글(0) 좋아요(1)
좋아요
공유하기 북마크하기찜하기 thankstoThanksTo