당근마켓 블라인드 채용 후기

float_letter·2019년 12월 5일
0
post-thumbnail

지난달에 프리계약을 한달연장 하게된 와중에 아는동생에게 연락이 왔다.
당근마켓 블라인드 채용을 하는데 한번 해보는게 어떻겠느냐는 연락이었다.
문제를 본 사람들은 알겠지만 알고리즘을 요구하는 문제는 아니고
서비스를 구성하면서 성능과 확장성을 고려한 코드를 짤 수 있는가에 대한 문제였다.

문제는 단순했는데
상품 카테고리가 추가 되는것을 고려해서 카테고리에 따른 상품목록과 등록폼 상세보기를 추가 및 수정하라는 문제였다.

그리고 그에 따른 확장성과 성능을 고려한 코드를 작성 해달라는것

기술스택으로 사용가능한것은 ts+node, ruby on rais
내가 선택한것은 당연히 내가 취미로 하면서 가장 좋아하는 Typescript, React, Nodejs 였다.

약20일의 기간이 남아있었고 보통이었다면 테스트코드까지 작성했겠지만

프로젝트 막바지 기간이었고 코드를 작성할 수 있는 시간은 프리기간중 하루받을 수 있는 휴가와 출퇴근시간중 지하철에 탄 시간 뿐이었다.
(그마저도 지하철에 앉을수 없으면 상상코딩)

상품상세에 대한 구현은 두가지 방법을 고민했었는데

  1. 상품상세 종류별로 테이블을 별도로 생성하고 엄격한 타입정의로 확장하기.

    내 시간을 고려했을 때 가장 적절한 방식이라 생각했고 이 방식으로 진행했다.

  2. 폼종류에 대한 정의와 카테고리 테이블을 만들고 폼빌더를 만들어서 상품상세는 Json타입으로 정의하고 관리자가 임의로 카테고리를 만들고 그에 따른 입력해야할 폼종류 정의할수 있게하기.

    관리자까지 구현한다 가정했을때 이상적이지만 jsonType은 인덱스를 걸 수 없고 관리자 구현에 대한 부분은 요구는 전혀 없었으므로 아마 요구한 스펙은 아닐꺼라 생각해서 생략했다.

어찌어찌 마지막날 전날에 휴가를 내서 마저 작성하고 다음날 점심시간에 제출하긴했지만
결과가 나오기전 자체리뷰를 진행해보니 그저 부끄럽고 또 부끄러웠다.
지적할만한 사항들을 정리해보면

  1. 상품상세와 상품을 등록시에 트랜잭션을 넣지않은것
    서비스로 빼고 트랜잭션을 걸어 호출해야했는데
    두번의 insert를 진행하는 코드에서 트랜잭션을 넣지않았다.
  1. 상품상세 조회조건에 인덱스를 걸지 않은것
    조회성능을 고려해서 1번이라도 첫번째 구현방법대로 구현했는데 정작 인덱스를 걸지 않아버렸다.
  1. 등록할때와 조회할때 유효성검사는 했지만 타입캐스팅은 하지않아 타입의 오염이 퍼져나간것.
    ts+Node에서 제대로된 타입안정성을 얻으려면 입력값이 되는 모든것들에 대해서는 유효성검사 및 타입캐스팅이 절대적으로 필요하다.
    이 부분을 위해서 결정했던것은 class-validator와 class-transformer를 사용해서 선언적으로 유효성검사 및 타입캐스팅에 대한 공통 부분을 정의하여 클라이언트와 백엔드 양방향에서 사용하는것이었는데 parcel은 reflect-metadata를 사용한 데코레이터 활용한 type-reflection이 되지않는 문제가 있었다. Parcel에서 글로벌로 사용할 방법을 찾으면 될거 같았는데 일단 시간이 없기에 급한대로 다른 유효성검사 라이브러리를 찾았고 yup을 사용했는데 정작 타입캐스팅기능 지원되는지는 몰라서 유효성검사만 사용하였다.

  2. 레거시코드를 존중하지않고 기존 orm을 바꾼점
    초반에 sequelize로 다형성을 구현하려다가 삽질의 연속으로 얼마없는 시간의 3분의 1은 써먹은거 같다.
    하다가 결국 익숙하게 사용하던 typeorm으로 교체하였다.
    삽질말고도 바꾸게 된 여러가지 이유가 있는데
    개인적으로 가독성이 구린점이나
    typescript와 호환성이 낮은점 (sequelize5 에서는 좋다고 하는데.. 그닥 쓸만하지는 않을거 같다.)
    Datamapper패턴을 지원하지 않고 액티브레코드패턴을 사용하는점등의 이유도 있다.
    (사실 HasManyAssociation같은 타입보고 기겁한것도 있다.)
    sequelize-typescript라도 넣을까 했는데 다운로드 수가 너무 적었기에 선택하지 않았다.

  1. 레거시코드를 수정했는데 제대로 테스트 하지 않은점
    Sequelize처럼 static.create메소드가 Typeorm에서는 말 그대로 저장까지는 해주지 않아 회원가입기능이 되지않고 있었다.
    이런것에 대비하기 위해서 레거시코드를 건드리기 위해서는 통합테스트를 포함한 꼼꼼한 테스트가 필요하다.
    실제 서비스되는것이라면 정말 아찔한 상황이었다.

  2. 5번과 연계되는 테스트코드가 없는 상태
    레거시 코드를 건드리는 주제에 테스트 코드를 작성하지 않은 것은 오만하기 짝이 없었다.
    기 구현된 코드도 얼마없으니 크게 신경쓰지않았던게 화근이었다.

    프론트에서 아쉬웠던점은 스토리북추가하고 추가하는 ui별로 스토리를 추가하고
    상태별 ui직렬화 및 storyshots테스트를 넣고 싶었던점이 있다.
    이거말고도 얼마안되는 코드에서 깔요소는 무수히 많았던거 같다.

    아마 이번주중으로 리뷰가 나온다면 내가 짚은 부분말고도 좀더 나올텐데
    떨어지는건 아마 99프로일듯하다.

    이 정도면 마음의 준비를 해두고 리뷰라도 받을 수 있다는 것에 감사를 하면 될거같다.

profile
타입스크립트러버

0개의 댓글