상세 컨텐츠

본문 제목

코드 '제대로' 읽기

TIL (deeply)

by NayC 2022. 1. 20. 03:32

본문

728x90

 

 

 

  지금의 이 느낌을 어떻게 설명할 수 있을까. 마치 일본어 첫 수업을 들었을 때의 느낌같다. 일본어를 본격적으로 배우기 이전에도 슬램덩크니, 일본 드라마니 해서 일본어를 많이 들었었다. 그래서 첫 수업 시간 때 '아 내가 알던게 이렇게 분해가 되는거구나' 하고 되게 신기해했던 기억이 있는데 지금의 느낌이 딱 그 느낌같다. -  '아 이렇게 컴파일되는거였구나' 

  한 가지 다른 점이 있다면 지금은 부끄러움도 느낀다는 점이다. 그간 너무 코드를 대충 해석하고 있었구나, 대충 다루고 있었구나 하는 반성이 든다. 정확히 해나가보자. period. 


(내가 다시 재구성한 예시) 

Q. user.js 폴더 내 아래 한 문장을 정확히 해석해보시오. 

- const Service = require ('../../common/service'); 코드도 존재함

 

<내가 기존에 읽고 있던 방법>

- latest 가지고 와서 변수 serviceVersion라고 하겠다는거네. 

 

<제대로 읽는 방법> 

1. req.get()이 무엇인가. 

내가 맨 처음 했던 생각
잘못된 생각을 깨우치기 위해 나와의 대화를 해보자. (A, B 둘다 '나'임)

A : ( ) 괄호 안의 장소(?)에서 데이터를 가지고 와주는 것
B : 그럼 req.get()을 하면 항상 데이터가 있음? 
A : 그렇다. service.js 파일을 보면 저렇게 버젓이 데이터가 있지를 않나. 
      만약 req.body로 가지고 오는거였으면 클라이언트가 body에 보내는 정보로서 데이터가 있을 수도 없을 수도 있는데, 
      req.get은 데이터를 무조건 가지고 오는거다. 
B : 힌트는 다음과 같다. 
req.get('Content-Type');
  // => "text/plain"
  
req.get('content-type');
  // => "text/plain"
  
req.get('Something');
  // => undefined

출처 : https://expressjs.com/ko/api.html

B : 힌트를 보면 req.get() 은 무엇인 것 같나. 
A : key값을 인자로 해서 value를 불러와주고 있다. 
B : 항상 값을 가지고 오는가?
A : 아니다. (힌트를 보니) undefined 로 값을 가지고 오지 않는 경우도 있다. 

B : req는 무엇인가
A : 객체다. (http request 객체) 
B : 그럼 객체.get() 하고 있는데 뭘 하고 있는건가? 
A : 메소드를 호출 중이다.
B : 어떤 메소드를 호출중인가? req.get()을 하면 뭐가 나오는건가? 

B : header에 대해 말해봐라.
A : body가 실제로 주고 받는 데이터라면, header는 그 데이터들의 데이터를 담은 것이다. 
B : 잘못 알고 있다. (기존에 아는 지식도 의심할 것. 프로그래밍하며 믿을 놈, 믿을 다큐먼트 없다고 생각하기) 
     header에는 custom으로 넘길 수 있는 정보도 담을 수 있다/있었다 (deprecated됨)(이건 이 대화의 핵심이 아님을 유의) 
request.setHeader('content-type', 'text/html');

const contentType = request.getHeader('Content-Type');
// 'contentType' is 'text/html'

출처 : https://nodejs.org/api/http.html#requestgetheadername

B : 다시 묻는다. req.get() 이 무엇인가.
A : http request 객체가 key값을 통해 http request header의 key 값에 대한 value 값을 가지고 오는 것이다. 
     그리고 그 결과는 있을 수도 있고 없을 수도 있다. 클라이언트가 정보를 보내줬으면 있는 것이고, 안보내줬으면 없는 것이다. 
B : 왜 항상 데이터가 있다고 착각했는가? 
A : req.get()이 어떤 정보를 가지고 오는건지 개념이 없었다. 

 

2. req.get(latest)라고 쓰면 될 걸 가지고, 왜 굳이 req.get(Service.header-service-version) 라고 써줬을까? 

B : const serviceVersion = req.get(Service.header-service-version) 이 코드에서 변수는 총 몇 개인가? 
A : 1개다. (serviceVersion) 
B : 아니다. 
A : 3개다. (serviceVersion, Service, req) 

B : Service는 자료형이 뭔가? 
A : 문자인 것도 있고, 아닌 것도 있고 ... 문자열... 이다
B : module.exports 하는 부분에서 다시 살펴봐라. 무슨 자료형인가? 
A : 딕셔너리다. 
B : 그럼 Service.header-service-version는 지금 뭐하는 것인가? 
A : key 값을 통해 value를 가져오는 것이다. 

보충 - req.get(latest)라고 쓰면 될 걸 가지고 굳이 req.get(Service.header-service-version) 라고 써준 이유는, (자바의 enum처럼) 재활용도 하고 더 가독성 좋게 하기 위해서
 

 

3. postman 통해 확인

KEY 값에 어떤 값을 넣어줘야 하는지 한 20분은 틀리고 틀렸던 것 같다. 

이유 1) req.get()의 key 값은 () 안의 있는 결과 값인 건데... 이를 인지 못함

            부끄러운 나의 시도들 : header-service-version, Service.header-service-version ... 

이유 2) 따옴표 붙여줬었음. (힌트 : 8 hidden 쓰여져있는 형태) 

 


* 가지고 가야 할 큰 그림. 

객체 아래 1) property 2) method -> 값과 메소드 추출해내기

 

* Keep in mind

“상상하지 말기”
“당연하다고 생각하지 말기” (예를 들어 a && b && c 같은 코드도 너무나 잘 안다고 생각하지만, 정작 알지 못하는거였음)
“잘게 쪼개서 보기”
“집요하게 생각하기” (컴공과 다른점이 이런 부분일 것. 알게 모르게 ‘컴파일러하는 방법과 과정’에 대해 숙지가 되어 있을 것. 그러니 이 점을 인식해서 집요하고 집요하게 하기)

 

* 세상에 믿을 놈/블로그/심지어 document까지 없다.

최대한 document 보되 직접 해보기

 

* 라이브러리 사용할 때

1) 충분히 지원하는지

2) 실제로 지원하는지 확인 (듣보 라이브러리 사용 말기) 

 

 

 

 

 

728x90
반응형

관련글 더보기