(노드 심화 주차 강의 듣는 중)
좋은 노트 정리 방식을 하나 알았다. 강의 노트가 있을 때 거기서 꼭 모든 꼭지를 다 내 언어로 옮겨 적지 말고, 내가 명확히 그리고 더 자세하게 정리한 부분이 있으면 그 부분을 강의노트에서 선 긋기 방식으로 (이렇게) 지워놓는 것이다. 그리고 강의 노트에서 특별히 더 덧붙일 말이 없으면 그냥 이 꼭지는 강의 노트를 참고하라고 한 마디 남겨 놓고 말이다. 좋아. 이렇게 덜어낼 것은 덜어내고 분업 루트로 가는 거다..!
- 오늘은 진짜 미스테리 그 자체인 에러를 하나 기록으로 남기려고 한다. 아직 해결하지 못했다. 테스트 코드에 대해 마침 배우려는 참인데 이걸 배우고 나면 디버깅에 도움될 수 있지 않을까 해서 일단 공부중이다.
아래는 어제에 이은 에러 기록이다.
일단 내 편집기의 현재 상황은 :
- (파란 박스) 왼쪽의 폴더 구조에서와 같이 posts.repository.js과 같은 이름의 파일들은 강의 노트에서 나온 코드 그대로이고, 3.posts.repository.작성연습.js와 같은 이름의 파일들은 내가 작성한 파일들이다.
- (빨간 박스) 이 두 세트를 왼쪽과 오른쪽 창에 나눠서 나란히 열어 놓았다. 똑같이 순서대로 3레파지토리 → 2서비스 → 1컨트롤러 → 0라우터의 번호순. 그리고 이 순서로 모듈들이 임포트 된다.
- (노란 박스) index.js에서 마지막의 0라우터 파일이 임포트 된다. 그래서 여기서 강의 노트 루트를 탈 것인지 (노란 화살표가 가리키는 윗줄), 내가 작성한 루트를 탈 것인지(노란 화살표가 가리키는 아랫줄)를 결정지을 수가 있다. index.js에서와 app.js에서 루트 전치사(…) ‘/posts’와 ‘/api’가 더해져 최종적으로 호출경로가 ‘http://localhost:4000/api/posts’
가 된다.
- (빨간 밑줄) 어제 여기서 ‘this’를 undefined로 인식한다는 에러가 났었다. 강의 예제처럼 아래의 코드로 바꾸니 작동이 되는 것을 확인했다.
이 세가지 버전의 메소드 작성 형식을 비교 테스트 하는 중:
위에서부터 차례로 메소드 선언 1번 방식, 2번 방식, 3번 방식이라 부르겠다.
작동이 확인된 ‘확실한’ 코드는 1번 방식이다.
강의 노트에서와 여러 구글링에서 보는 대부분의 코드도 1번 같은 식이다. 나는 3번 스타일로 (원래의 클래스 메소드 작성방식) 작성해보았다. 여기서 에러들이 줄줄이 나오게 된다…
에러 1.
실행 코드: POST, ‘http://localhost:4000/api/posts
’ 호출시
에러 문구:
ValidationError [SequelizeValidationError]: notNull Violation: Posts.title cannot be null,
notNull Violation: Posts.nickname cannot be null,
notNull Violation: Posts.password cannot be null
⇒ title, password, title이 모두 undefined로 전달되어 생기는 에러였다.
에러 발생 위치:
at async PostRepository.createPost3 (C:\Users\USER\Desktop\Sparta\02.9_2_node_practice_layered_architecture_pattern\repositories\3.posts.repostitory.작성연습.js:47:29)
at async PostService.createPost (C:\Users\USER\Desktop\Sparta\02.9_2_node_practice_layered_architecture_pattern\services\2.posts.service.작성연습.js:38:25)
at async createPost (C:\Users\USER\Desktop\Sparta\02.9_2_node_practice_layered_architecture_pattern\controllers\1.posts.controller.작성연습.js:33:25) {
에러 원인:
규명중
순서대로
(1컨트롤러-1번식 post 메소드) → (2서비스-3번식 post 메소드) → (3레파지토리-3번식 post 메소드)
로 호출하여 이런 에러가 났다.
이상한 게, 다 똑같이 하고 (1번식 get 메소드 → 3번식 get 메소드 → 3번식 get 메소드)
GET
, ‘http://localhost:4000/api/posts
’으로 호출했을 땐 멀쩡히 게시글 리스트가 반환됐다는 사실이다.
다시 한 번 정리하자면,
- GET 요청시: (1컨트롤러-2서비스-3레파지토리 순으로) 3-3-3으로 호출했을 때 “TypeError: Cannot read properties of undefined (reading 'postService')” 에러 발생함.
- GET 요청시: 1-3-3으로 호출하니 잘 동작함. ⇒ 3-3이 문제였다면 분명 여기서도 문제가 발생해야 할 텐데 잘 돌아간 것이 꺼림칙.
- POST 요청시: 3-3-3으로 호출했을 때 GET 3-3-3과 똑같은 에러가 발생함. (”TypeError: Cannot read properties of undefined (reading 'postService')”)
- POST 요청시: 1-3-3으로 호출했을 때 “ValidationError: notNull Violation”에러 발생. 어디선가 title, password, nickname, content가 모두 undefined로 전달되고 있음.
⇒ 앗, createPost 호출시 인수를 전달해주지 않고 부르고 있었다. 해결함.
다시 POST 요청시: 1-3-3 호출시 잘 동작함!
와 진짜 모르겟다…
가장 미스테리는 컨트롤러→서비스 호출시 3-3 조합은 안 됐는데, 서비스→레파지토리 호출시 3-3 조합은 된다는 점이다. 이러면 단순히 “async 메소드3() { … }
방식이 안 되고 메소드1 = async () ⇒ { … }
선언 방식만 먹힌다, this의 맥락을 바인딩하기 위해서는!” 이라고 결론도 못 내린다.
튜터 두 분에게 찾아갔지만 그거참 정말 이상하다는 답변만 얻었다.
Uploaded by N2T