Development/썬카(SunCar) - 개인 프로젝트

[썬카/정기 회고] 스프린트 2 종료 - N+1 문제

양선규 2025. 3. 25. 18:52
728x90
반응형

차량 관련 테이블만 11개. 이걸 다 조인해야 해...

 

 

 

스프린트 2가 종료되었다. 6일이 걸렸으니 스프린트 1에 비해 3배는 빨리 끝났다.

당연한 거겠지만 환경설정과 학습 시간이 빠지고, 기능 구현에만 집중하니 작업이 훨씬 빨랐던 것 같다.

스프린트 2에서 구현한 기능은 아래와 같다.

  • 마이페이지 조회
  • 마이페이지 내 정보 수정
  • 판매중인 차량 목록 조회

 

프론트와 백엔드를 함께 진행하며 느낀건데, 확실히 백엔드가 좀 더 논리적으로 생각할 게 많은 것 같다. 물론 내가 백에 좀 더 신경을 쓰고 있는 것도 사실이지만, 백 로직을 생각하는 것이 3배는 머리아픈 것 같다. 백은 깊고, 프론트는 넓은 것 같다고 느꼈다. 개인적인 생각이다.

 

프론트엔드에서 어려웠던 점 - 다양하고 자잘한 이슈들

마이페이지 조회와 내 정보 수정 기능은 백에서는 아주 수월했다. 쉽게 구현할 수 있었다.

 

하지만 프론트 쪽에서 조금 어려웠다. 당연히 처음 해보니까 그럴만도 하겠지만 데이터를 어떻게 받아와서 어떻게 뿌려주는지, pinia를 통해 사용자 정보를 저장하고 그걸 가져와 뿌려주는 것도 어려웠다.

 

특히 기능을 구현했는데도 마이페이지 조회 시 데이터가 로드되지 않는 문제가 발생했었는데, 데이터를 로드하는 시점이 문제였다. 백에서 데이터를 받아왔다는 걸 확인한 후에 뿌려줘야 했고, 사용자 정보를 로드해서 pinia store에 저장하는 것은 홈 화면에 접속할때만 하도록 했는데 그렇게 하니 빈틈이 많아서 라우터 가드 쪽에도 로드하는 로직을 추가해야 했다. 프론트는 이런 생각지도 못한 자잘한 부분에서 신경 쓸 것들이 많았던 것 같다.

 

백엔드에서 어려웠던 점 - 쿼리와 N+1 문제

판매중인 차량 목록 조회 쿼리 작성이 어려웠다.

 

차량 정보를 담는 테이블이 워낙 많다 보니, 상세보기도 아니고 목록조회 쿼리가 5개의 테이블을 조인해야 했다. 이제 개발 첫단계인데 5개 테이블 조인이라니. 내가 도메인을 잘못 선택한걸까? 라는 생각도 했다.

 

뭐 그래도 이걸 헤쳐나가며 배우는 것도 있을거라 생각했다. QueryDSL을 사용해 커스텀 쿼리를 짰는데, QueryDSL 문법도 처음이라 이것도 익숙해져야 했다. QueryDSL 결과를 어떻게 dto에 담는지, 그리고 한 필드의 값이 여러개라면 그걸 또 어떻게 가져오고 담아야 하는지도 전부 해결할 문제였다.

 

어찌저찌 클로드의 힘을 빌려 모든 차량 목록 조회 기능을 만들고 postman으로 결과를 확인했지만, 내 코드에는 N+1 문제가 있었다. N+1문제는 들어보기만 했지 사실 정확히 뭔지도 몰랐고 어떻게 해결하는지도 몰랐다. 이게 뭔지, 왜 문제인지, 어떻게 해결하는지 공부하고 이해하며 시간이 꽤 많이 걸렸고 어찌저찌 해결하게 되었다. 또한 DB 리소스를 사용하던 코드를 Java 코드를 통해 서버 리소스를 사용하도록 개선한 것도 큰 개선점이라고 생각된다.

 

 

아래는 N+1 문제 해결 과정을 담은 포스팅이다.

https://yskisking.tistory.com/310

 

[썬카/백엔드] 차량 목록 조회 쿼리 작성 과정에서의 N+1 문제 발생과 해결

신뢰성이 중요한 중고차 거래에 필요한 차량 정보를 담기 위해서는 꽤 많은 테이블이 필요했다.차량 목록 조회 기능을 구현하는 것에만 5개의 테이블이 엮여있었고, 5개 테이블을 전부 조인해서

yskisking.tistory.com

 

 

================

 

 

난 백엔드다.

 

프론트는 조금 못해도 괜찮다.

애초에 큰 비중을 두지도 않았고 프로젝트의 큰 틀을 이해하고 싶어서 진행하고 있는 거니까.

 

하지만 백은 잘해야 한다. 내가 짜는 코드를 전부 이해하고 있어야 하고, 왜 이렇게 짰는지 알아야 하고, 뭐가 부족한지, 어떻게 개선할 수 있을지도 알고 있어야 한다.

 

하지만… 복잡한 조인 쿼리와 N+1 문제를 해결하면서 내가 쿼리를 정말 못 짠다는 걸 실감했다. 테이블 5개의 관계도를 보면서 쿼리를 어떻게 작성해야 할 지 감도 안왔다. 쿼리 공부를 따로 해야하나 싶을만큼 말이다. 물론 프로젝트를 진행하며 계속해서 쿼리를 작성하다 보면 당연히 늘기야 하겠지만, 나는 내 생각보다 더 쿼리를 못 짜는 사람이었다.

 

스프린트 3에서 구현해야 하는 것은 차량 상세 조회이다. 차량 관련 테이블이 10개가 넘기에 이걸 전부 조인해야 한다. 이걸 해낼 수 있을까 걱정부터 든다. 또한 차량 조회 페이지에서 필터링, 정렬도 추가해야 하는데 이렇게 엄청나게 많은 테이블과 필드들을 전부 담아 필터링, 정렬을 해낼 수 있을지 심히 걱정된다.

 

그런데 어쩌겠는가. 내가 선택한 중고차 도메인인데… 말이다. 실무 가면 더 복잡한 작업들도 많을 테니, 미리 경험해 본다 생각해야겠다. 이걸 이겨내고 나면 나는 더 성장해 있겠지.

 

 

728x90
반응형