본문 바로가기

백엔드

집콕 서버 리팩토링

 

작년 하반기에 백엔드 서버를 처음 배웠다.

KUIT이라는 교내 IT 동아리에서 한 학기 동안 10주차 강의를 듣고(파트장님이 해주시는), 종강 후 기획자-디자이너-개발자가 팀을 꾸려서 프로젝트를 해볼 수 있었다.

 

시작이 좋았다.

군대를 전역하고 열정으로 가득 차 있던 나에게 KUIT은 기회였고, 좋은 파트장님과 좋은 스터디원들을 만나서 많이 배우고 공부했다. 그리고 프로젝트도 정말 잊을 수 없는 좋은 경험이었다. 

 

겨울방학 2달 간 난 집콕이라는 프로젝트를 했다. 

 

 

집콕은 자취방 발품 서비스로 다방, 직방처럼 직접 매물을 등록/확인하는 서비스와는 달리, 자취방을 구하는 사람들이 발품다니며 조사한 정보를 쉽게 저장하고 꺼내어 비교해볼 수 있는 서비스이다. 즉 자취 초보자가 전문가처럼 자취방을 알아볼 수 있도록 도와주는 서비스이다. 

 

내가 다양한 프로젝트 아이디어 중 집콕을 선택한 이유는 자취생으로서 아이디어에 공감이 갔던 이유가 가장 크지만 프로젝트가 어려워 보였기 때문이다. 진흙탕에서 구르면서 배우는 것이 실력 향상에 좋다고 생각해서 가장 어려워 보이는 아이디어를 선택했다. 

지도에서 매물을 보여주는 기능, 카카오 로그인, 굉장히 많은 유저 온보딩, 굉장히 많은 콕 옵션 등등.. 단순한 CRUD가 아니라 ERD 구조도 중요하고 생성 쿼리도 적어야 하는 등 고려해야 하는 부분이 많을 것 같아서 구현을 하면서 크게 성장할 수 있을 것 같았다. 

실제로도 콕 체크리스트를 구현하기 위해서 ERD 구조가 복잡해지기도 했고, 비로그인 사용자 둘러보기 기능 등을 통해 서비스 로직 구현에 깊은 고민을 해볼 수 있어서 엄청 유익했다. 

 

최종 페이지이다... 기능이 엄청 많다...

 

위의 사진은 실제 집콕 페이지들이다. 굉장히 많고 기능도 엄청 다양하다. 아니 이렇게 많을 줄은 몰랐지..   

백엔드를 처음 배운 나에게 2달 간 구현하기에는 많아보였다. 백엔드 서버는 나 포함 2명이었는데 그 형도 이번에 백엔드는 처음이었다. 

 

방학 2달 동안 거의 형이랑 매일 만났고 매순간 프로젝트에만 매달렸다. 

 

개발 회의록. 백엔드 회의록이 절반 이상...

 

실제로 2달 간 우리는 굉장히 큰 성장을 했고, 나는 2달 간 무언가에 렇게까지 몰두했던 일이 있어나 싶을 정도로 몰입했었다. 

회의록을 살펴보면 정말 세세한 부분까지 전부 기록을 했고, 우리가 했던 토론, 기능 구현 고민 등이 담겨있다.  이 회의록에는 우리의 2달 간의 노력과 흔적이 고스란히 남아있다. 

 

ERD table을 많이 분리시키는 것이 좋은 구조인지. API 정보의 범위는 어디까지 설정하는 것이 바람직한지. 카카오 로그인에 대해서 프론트와 어디까지 작업 분할할지. 무엇이 RESTful 한 API인지. Refresh Token의 의의, 예외처리, Redis 도입, S3 네이밍 정책, Selenium 크롤링 방법 등등.....

근 6개월이 지난 지금도 당시의 회의록을 보면 그때의 느낌을 생생히 느낄 정도로 나에게는 당시의 경험이 뜻깊었다. 프로젝트를 한다는 경험 뿐만이 아니라 함께 토론하며 배우고 성장한 것이 기뻤다. 

 

 

서론이 조금 길었다.

집콕 프로젝트가 끝나고 4개월 정도가 지난 지금, 

우리는 집콕 프로젝트를 리팩토링 하기로 했다. 

 

 

사실 집콕 서버를 리팩토링 하자고 이야기를 꺼내게 된 건 프로젝트가 끝나고 1달 정도 지난 시점이었다. 

잊지 못할 정도로 열정을 쏟아 부었던 프로젝트가 일회성으로 끝나는 것이 아깝기도 했고, 그 당시에 큐시즘에서 네이버 백엔드 개발자님의 강연을 듣고 나서 집콕을 리팩토링 해봐야겠다는 생각을 가지게 되었다. 다시 형한테 오랜만에(?) 연락을 했고, 집콕 리팩토링 스터디를 제안했다. 

 

그런데 학기 중에는 형도 나도 각자 새로운 연합 IT 동아리에서, 새로운 사람들과, 새로운 프로젝트를 하느라 바빴고, 동시에 학교도 다니면서 현생을 사느라 집콕 프로젝트는 조금 뒷전이 되었다. 

그래도 큰 진도는 나가지 못했지만 학기 중에 6번의 모임을 가졌고 나름의 성취를 이루었다. 

 

  1. nGriner 환경을 세팅하고 적응했다. (성능 측정)
    집콕 서버 성능 측정을 위해 ngrinder를 사용하기로 결정했다. JMeter도 있는데 왜 nGrinder를 사용했는가? nGrider가 Naver에서 만들었기에 한국어 지원도 될 뿐더러 UI가 잘 제공되어서 성능 지표를 직관적으로 확인하기에는 좋을 것 같았다. 그리고 JMeter는 좀 대중적이라서 새로운 시도를 해보고 싶었다. 

  2. 집콕 서버에서 개선해야 할 점을 골랐다. 
    크게 두 가지로 좁혔다. 클린코드화랑 쿼리 최적화이다. 2달 간 많은 기능을 구현해야 했기에 코드 질은 신경쓰지 않아서 엄청난 코드 스파게티가 되었다. 코드 중복, 네이밍, 객체지향을 신경쓰면서 코드를 수정하기로 했다. 또 쿼리 최적화이다. nGrinder를 돌려보고 코드를 리뷰하면서 쿼리 생성이 심각하다는 것을 깨달았다. 쿼리 최적화만 잘해주어도 성능이 눈에 띄게 향상될 부분들이 많이 보였다. 당장 우리가 시도해볼 수 있는 부분이 코드 개선과 쿼리 최적화라고 판단했다.  

  3. 스터디원이 한 명 더 늘었다. 
    원래 집콕 서버 리팩토링 스터디는 형이랑 나, 둘이서만 진행하려고 했다. 방학 동안 같이 해왔기도 하고, 제 3자가 현재의 스파게티 코드를 이해하기에는 무리가 있을 것 같다고 생각했다. 하지만 우리 둘 다 리팩토링은 처음이었기에 맨 땅에 헤딩하는 것보단 조금 경험이 있는 사람이 있으면 빠르게 진행될 것 같았다. 작년 KUIT 서버 파트장을 맡아주셨던 형이 한 분 계신데, 운이 좋게도 그 형이 우리 스터디에 관심을 가져주셔서 같이 하게 되었다. 

 

 

우리 스터디 노션 페이지이다. 각자의 이름을 따와서 '이주 재민는 스터디' 라는 이름이 탄생했다.

네?

 

 

학기가 끝나고 여름방학이니 집콕 서버 리팩토링 프로젝트도 달려보려고 한다. 사실 여름방학 동안 2번의 모임이 추가적으로 있었는데 블로그 글쓰기를 미루다가 이제야 몰아서 쓴다.

 

여름방학이 시작되고 첫 모임에서 여름방학 계획을 짰다. 

여름방학 스터디 계획

 

API들을 도메인 별로 분류하니까 크게 3가지로 나뉘었다. RealEstate, User, Kok이다. RealEstate는 학기 중에 최적화 했어서 그대로 반영하고 Kok은 이 글을 포스팅하는 오늘 만나서 끝냈다. (다음 포스팅에 내용을 쓸 예정이다.) 다음 주차에 User 및 자잘한 CRUD  API 최적화를 하고 1주에 걸쳐 Spring Security를 도입해보기로 했다. 

 

왜 Spring Security인가?

지금은 Interceptor를 사용해서 인증/인가를 진행한다. 그러면 클라이언트의 요청이 Dispatcher Servlet을 거쳐서 인증/인가가 진행되기 때문에 별도의 Thread가 생성되고, 인증/인가를 하는 과정에서 DB접근이 불가피해서 서버의 자원이 굉장히 많이 소요된다. 그래서 Dispatcher Servlet 이전에 인증/인가를 처리하기 위해서 Spring Security를 도입해보기로 했다. 나 빼고 형들은 이미 경험이 있어서 1주만 잡았다.

 

그리고 1주에 걸쳐서 CICD 환경 구축을 해보기로 했다. 사실 가장 처음 진행했어야 하는 것이지만 늦게나마 해보기로 했다. 프로젝트를 진행하면서 변경사항이 생길 때마다 EC2에 접속해서 서버를 새로 띄우는 것이 굉장히 불편했었는데 그걸 이제야 해보기로 했다. 

 

나머지는 2주에 걸쳐서 Test 코드 작성이랑 예외처리를 꼼꼼하게 하기로 했다. 이것도 CICD와 마찬가지로 초기에 했어야 하는데 대작업이 될 것 같아서 뒤로 미루어 두었다. (우선순위가 코드/쿼리 최적화라고 판단했다.) 큐시즘 면접을 볼 때나 밋업 데이 심사에서 느낀 점인데 프론트든 백엔드든 예외처리가 굉장히 중요하다. 특히나 사용자가 직접 오류를 마주치게 하는 것은 절대로 있어서는 안되는 일이다. 그래서 예외처리가 가장 중요하다고 판단하고 대작업이 될 것 같아서 가장 후순위로 미루어두었다. 

 

결론

여름방학 동안 집콕 서버 리팩토링 스터디를 진행한 부분에 대해서 블로그에 정리하려고 한다. 이미 학기 중에 좀 진행했었고, 여름방학 때도 2번이나 진행했다. 그 과정을 좀 정리하려고 한다. 꾸준히 해보자.