커뮤니티 서비스 검색 API 개발기 (2)

kshired·2021년 7월 23일
1

오늘은 7월 6일에서 13일까지 1주차동안 진행했던 개발을 회고해보려고한다.

API 초기 세팅

  • 커뮤니티 회원 인증을 위한 게시물을 미리 작성해두었다. ( Issue 1 )
  • SQLite를 Django에서 써본 뒤로, 개발할 때 사용해본적이 없어서 처음으로 로컬에 설치하고 express와 연결해 보았다. ( Issue 2 )
  • Yarn을 통한 필요한 패키지 설치 및 ORM에 관련한 환경설정을 진행하였다 ( Issue 3 ~ Issue 5 )

테스트 환경구성

  • TDD를 개발 방법론으로 정하였기 때문에, 테스트를 진행하기 위한 설정을하였다. ( Issue 6 )
    • 이 파트에서, 꽤나 많은 삽질을하였다.
    • Prisma를 ORM으로 선택했기에, Prisma를 Mokcing 할 방법을 찾았어야했다.
    • 하지만, 공식문서에는 TypeScript를 이용한 환경에서의 테스팅만 안내하고있어 새로운 방법을 찾아내야했다.
    • 여러번 삽질과 스택 오버플로우 형들의 글을 참고하여 아래와 같은 Github Repo를 발견하였고 아래 방법을 적용하기로 했다.
    • 참고 자료 - Prisma Test Setting
    • Prisma를 이용하여 jest용 testEnvironment를 구성하고, 그 후 supertest를 통해 express app을 Mocking하여 request를 보내어서 테스트를 진행하는 방식을 선택했다.
    • 결국 Prisma를 Mocking 하는 것이 아닌, 테스트 마다 테스트용 DB를 만들고 삭제하는 방식을 사용하게 된 것이다.
    • 그래도, SQLite를 사용하기 때문에 그리 크게 부담이 되는 작업이 아니여서 이 방법을 선택하게 되었다.

구현 시작

  • 회원가입 API를 위한 테스트 코드를 구현하고, 그 뒤 각종 utility 함수를 작성하였다. ( Issue 7 )
    • Jsend를 위한 ResponseJson을 생성하는 Utility class를 구현
      • 처음에는 status를 set하는 함수를 string으로 설정하였다가, 오타가 발생할 것 같아 (success를 sucess라고 쓴다던지..) 이 부분도 Object Symbol을 통해 Enum과 같은 형식으로 바꾸었다.
    • Request Body, Header, Path variable 등을 체크하기 위한 Utility 함수 구현
    • 회원가입 API를 위한 인증용 문자열 생성 Utitliy 함수 구현
      • 무작위 문자열을 생성해야했기에, crypto를 통해 무작위 문자열을 생성하고 이를 Base64로 Encoding해서 return하는 함수를 구현했다.
    • JWT용 Utility 함수 구현.
      • 솔직히 꽤나 구현할 것이 많고, 귀찮은게 많을 수 있는데 미리 velog에 다음과 같은 글을 작성해두어서 빠르게 구현 할 수 있었다.
      • 참고 자료 - Express에서 JWT 구현
    • 테스트 코드 작성
    • 테스트 코드 기반으로 회원가입 구현
      • 위 두 개는 그냥 문제없이 구현했던 것 같다.
  • 회원 인증을 위한 크롤러 구현 ( Issue 8 )
    • 처음에는 puppeter를 사용하여 Chromium을 띄운뒤, 크롤링을하게 진행하였다.
    • 하지만, PR 코드리뷰 에서 Chromium을 띄우는 방법돠 다른 방법으로 구현하는게 좋다고 언급을해주셔서 request를하고 cookie와 csrftoken을 받아와 구현하는 방식으로 변경하였다.
    • 현재 아직도 해결하지 못한 문제는, 이 크롤링 테스트를 어떻게 작성하냐이다..
    • 인증방식이 특이하다보니, 회원가입 후 5분뒤 크롤러가 돌아가는데 이러한 과정을 테스트 하는 방법을 아직도 모르겠다..
  • 로그인 기능 구현 ( Issue 9 )
    • 로그인 테스트 코드 작성
      • 여기서 테스트 코드가 빛을 발했다.
      • 인증된 유저와 인증되지 않은 유저, 비밀번호 틀린경우 아이디 틀린 경우 등.. 체크해야 할 부분이 많았다
      • 평소라면 놓칠 수 있었던 부분을 테스트 코드로 미리 작성해놓으니 구현 할 때 더 신경쓸 수 있었다.
    • 테스트 코드 기반으로 로그인 구현
      • 일반적으로는 username, password만 체크하면 되겠지만 우리는 정회원 준회원과 같이 인증된 유저와 인증되지 않은 유저를 구분해야했다.
      • 그래서, User 스키마에 Authenticated라는 boolean Column을 생성하였고 그것을 통해 Filter 처리 하였다.
  • 재인증 API 구현 ( Issue 10 )
    • API의 인증방식이 특이하고, 처음에 헷갈릴 수 있기때문에 인증을 처음에 제대로하지 못하는 상황이 존재할 수 있다고 생각하여 재인증을 위한 API를 구현하게 되었다.
    • 테스트 코드 작성
    • 테스트 코드 기반으로 재인증 API 구현
      • 딱히 문제없이 구현했던 것 같다.
  • 리팩토링 및 플로우차트 작성 ( Issue 11 )
    • 재인증 및 회원가입에 사용되는 크롤링 코드가 반복되어 재사용되어 나중에 따로 빼놓아야겠다..라고 생각했는데, 바로 Issue 10에서 코드 리뷰 받을 때 지적받았다 ㅜ-ㅜ ( 매의 눈 PM님.. )
    • 그래서 바로 새로 Issue를 파서 그 부분을 수정하고, 리팩토링을 진행하였다.
    • 그 외에 정회원 인증방식도 특이하고, JWT도 같이 쓰니 회원가입-인증-로그인의 절차가 꽤 복잡하게 돌아갔고 이를 프론트엔드분에게 이해시키기 위해 플로우차트를 작성하여 전달해드렸다.

1주차 후기

  • TDD의 장점을 뼈저리게 느낀 개발 경험이였다.
    • 물론, 그렇다고 테스트 코드 작성이 재미있지는 않다.
    • 머리도 아프고.. ㅋㅋ ( 아직도 해결하지 못한 크롤링 테스트!!!!! )
    • TDD관련 영상 참고자료 : TDD를 실제로 진행하면서 보니까 공감되는 부분도 있고 배워야 할 부분도 많은 영상이였다.
  • PR을 이렇게 적극적으로 해볼 경험이 없었는데, 진행해보니까 좋은 경험이라고 생각이 든다.
    • 자연스럽게 코드에대해 한 번 더 생각하게 되고, 코드 리뷰를 통해 얻어가는 것도 있고 :)
  • 백엔드는 재밌다. 어렵다. 배우는 건 늘 새롭다.
profile
글 쓰는 개발자

0개의 댓글