on
[향해99] 7주차 회고
[향해99] 7주차 회고
들어가며
안녕하세요 어느덧 7주차가 끝나고 8주차를 보내고 있는데요 늦었지만 7주차에 대한 회고를 하고자 이렇게 글을 작성합니다. 7주차의 큰 이벤트는 클론코딩과 실전 프로젝트 시작이라는 아주 큰 이벤트가 있었습니다. 이 과정에서 생긴 저의 고민들을 정리하고자 이렇게 글을 작성합니다.
클론코딩의 이슈들
향해에서는 클론코딩을 실전 프로젝트전에 하는 것을 커리큘럼으로 하고 있습니다. 그래서 우리도 실제 운영되고 있는 서비스 한개를 가지고 클론코딩을 해보았습니다. 저희는 그중에 '원티드' 라는 취업 정보를 제공하는 서비스를 클론코딩 해보았습니다.
여기서 그럼 원티드의 모든 서비스를 다 구현해보았나 라고 생각이 들겠지만 현실적으로 이걸 다 했다면 이미 원티드에 취직했겠죠??? 그래서 저희는 검색에 집중 했고 검색 중에서도 개발직군에 대해 한정하고 추가적으로 검색 서비스를 한정으로 원티드를 클론 했습니다. 이 과정에서 검색에만 집중하려고 하다보니 생기는 이슈들이 있었는데요 이것들을 이제 공유하고자 합니다.
채용공고와 태그 N:M 관계 핸들링
기본적으로 원티드의 검색 시스템은 꽤나 복잡합니다. 동적으로 쿼리가 바뀌어야 한다는 점이 있습니다. 그 이유는 채용공고를 검색할 때 총 3가지가 필터링 됩니다.
검색 필터
태그 포함 지역 신입/경력
N:M 인 이유
여기서 태그는 총 3개까지 받을 수 있습니다. 그리고 이 태그를 기반으로 선택한 태그를 포함한 추가적인 채용정보를 볼 수 있습니다.
채용정보 태그 필터링 적용을 위한 태그 선택 창
포함된 태그를 통해 추가 채용정보 검색결과 창 → 식사 제공 태그를 포함한 채용공고들
이러한 결과를 통해 현재 채용공고와 태그가 N:M 관계라는 점을 알 수 있었습니다. 이제 저는 이러한 정보를 바탕으로 Domain 을 설계하고 검색 기능을 개발을 했습니다. 하지만 제가 그 당시에는 조금 부족했기 때문에 다음과 같은 장애를 만났고 결국은 해결하지 못했었습니다. 이제 이 과정을 소개드리겠습니다.
N:M 구현 중 발생한 에러
먼저 태그 정보가 1개가 될지 2개가 될지 3개가 될지 아무도 모른다. 특정 태그를 포함한 모든 채용정보를 가져와야 하는데 OR 조건이 아니라 And 조건이면서 Contain 이어야 한다.
이렇게 크게 두 가지가 저의 발목을 잡았습니다. 우선 1번 같은 경우는 크기가 3개이기 때문에 간단한 조건 분기를 통해서 size를 판단하고 처리할 수 있도록 했습니다. 문제는 2번의 경우가 해결하지 못한 문제입니다. 이것은 아직도 고민이 됩니다.
예를 들어 #저녁식사 가 포함된 채용정보를 검색하면 많은 검색 결과가 나옵니다. 하지만 거의 없는 조건인 #사택제공 같은 정보가 들어가면 채용정보가 매우 줄어드는 것을 볼 수 있습니다. 따라서 And 조건이라는 점은 파악했습니다.
이때 발생한 문제는 1번과 이어지는 고민인데 태그가 한개일 때의 쿼리와 2개일 때 쿼리와 3개일 때의 쿼리가 모두 달라야 한다는 점인데 제가 아는 선에서는 Query DSL 을 적용하여 BooleanExpression 을 적용하면 처리할 수 있는 것으로 알고 있습니다.
하지만 저는 어떻게든 쿼리 메소드 혹은 SQL 로만 작성을 하려고 했고 그 과정에서 1주일이란 시간을 다 소비 해버렸습니다. 그래서 결론은 태그 검색을 한개만 가능하도록 하는 것으로 변경을 했습니다.
사실 이부분이 정말 딜레마 였는데요 지금은 공부하는 과정이고 어떻게든 동작하도록 하는 것이 아니라 조금더 SQL 과 DB 설계에 대한 개념을 정리하는 것이 중요할까 라는 생각과 일단 클론코딩을 하기로 했고 내가 구현해야 하는 기능인데 어떻게든 했야하지 않을까 라는 고민이 들었습니다.
그 과정에서 팀원들에게 양해를 구하고 개념을 정리하고 우선은 태그 정보를 한개만 받는 것으로 협의를 했는데 현업에서 내가 맡은 일에 대해서 이런일이 발생하기 된다면 어떻게 해야하지 라는 고민은 계속 해봐야 할 것 같습니다.
클론코딩 소감
저는 꽤나 코딩에 자신이 있던 사람이었고 처음에 봤을 때는 아 '이정도는 금방 끝낼 수 있지' 라는 생각을 했었습니다. 그래서 제가 많은 부분을 개발하게 되었는데 그로 인해서 일정산출에 미스가 발생했고 결국 중요한 기능중 하나인 Tag 기반의 검색을 완벽하게 구현하지 못했습니다.
일정 산출에 미스가 있었기 때문에 시간에 쫒겨 많은 고민을 할 수 있는 시간이 없었고 어떻게든 마감전에 하나라도 태그를 포함하여 검색할 수 있도록 해야 했기 때문에 어쩔 수 없이 태그를 1개만 포함할 수 있도록 한 것이 정말 아쉽습니다.
다음에는 일정 산출을 조금더 신중하게 그리고 자만하지 않고 짤 수 있도록 해야겠다라는 큰 교훈을 얻었습니다. 그리고 제가 이렇게 많은 부분을 가져간 원인 또한 백엔드 팀의 소통부재 라는 부분이 있었는데 로그인 처리를 구현하기로 그분에게 부탁을 했었습니다.
그분도 어느정도 실력이 있다는 것을 알고 있었기 때문에 그분의 구현을 전적으로 믿고 저의 일에만 신경을 썻는데 그분의 작업이 많이 늦어지다 보니 저의 일이 늘어난 감이 있습니다. 이렇게 아무리 상대방이 잘하는 사람이라고 해도 저도 그렇고 구현에 있어서는 많은 부분에서 애먹을 수 있기 때문에 서로 좀더 적극적으로 상황을 공유하려는 의식을 가질 필요가 있다고 느꼈고 모르는 것은 최대한 공유해서 빠르게 해결하는 것이 조금 더 개발을 잘하는 사람이라는 생각을 가지게 되었습니다.
사실 여기서 실전 프로젝트에 관한 이야기도 언급을 하려 했습니다. 하지만 글이 너무 길어지는 관계로 이번주 주말에 있을 회고에서 다시 정리해서 올리는 것이 좋겠다는 판단이 들어서 오늘은 클론코딩에 대한 리뷰만 하고 마무리 하겠습니다. 감사합니다
from http://bloowhale.tistory.com/75 by ccl(A) rewrite - 2021-07-29 14:01:37