JPA N+1 문제: 원인 분석부터 해결까지
문제 상황 카카오테크캠퍼스에서 선물하기 API를 JDBC에서 JPA로 마이그레이션하다가 위시리스트 조회 기능에서 N+1 문제를 겪었다. 엔티티 구조 WishlistItem 엔티티가 Product를 @ManyToOne(fetch = FetchType.LAZY)로 참조하고 있었다 발생한 쿼리 위시리스트 아이템이 10개였을 때: 1번: ...
문제 상황 카카오테크캠퍼스에서 선물하기 API를 JDBC에서 JPA로 마이그레이션하다가 위시리스트 조회 기능에서 N+1 문제를 겪었다. 엔티티 구조 WishlistItem 엔티티가 Product를 @ManyToOne(fetch = FetchType.LAZY)로 참조하고 있었다 발생한 쿼리 위시리스트 아이템이 10개였을 때: 1번: ...
고민의 시작 카카오테크캠퍼스에서 위시리스트 API를 구현하다가 삭제 API URL 설계에서 막혔다. 원래 이렇게 설계했다: DELETE /api/wishlist/{id} 이 {id}가 wishlist의 id인지, product의 id인지 모호하다는 피드백을 받았다. URL만 봐서는 구분하기 어렵다. 멘토님 피드백 “/api/wishli...
코드 리뷰에서 시작된 궁금증 카카오테크캠퍼스에서 선물하기 API를 구현하면서 회원 식별자로 UUID를 썼다. 코드 리뷰에서 멘토님이 이런 코멘트를 남겼다. “준영님이라면 이미 아실 것 같기도 한데요. UUID를 사용하셨으니, ULID에 대해서도 한번 참고해보시면 좋겠어요.” ULID가 뭔지 찾아봤는데 궁금한 점이 생겼다. 멘토님한테 질문했...
고민의 시작 카카오테크캠퍼스에서 선물하기 API를 클론 코딩하면서 비슷한 고민을 두 번 했다. 상품 수정에서 UPDATE를 바로 치는 게 맞나, 먼저 조회해서 상태/권한을 확인하고 수정하는 게 맞나? 위시리스트 추가에서 없는 상품 ID가 들어왔을 때, DB의 외래키 예외에 기대도 되나, 애플리케이션에서 먼저 검증해야 하나? 초기에는 쿼...
왜 RAG까지 갔나 PNU x Upstage DOCUMENT AI CHALLENGE에서 해외 파견 의료진을 돕는 챗봇 서비스 똑똑(DocDoc)을 만들었다. 목표는 질문을 받으면 관련 문서를 근거로 답을 만들어 주는 것이었다. 초기 구현은 LLM에 질문만 전달하는 방식이었고, 아래 문제가 있었다. 그럴듯한데 근거가 없는 문장이 섞인다 없...
문제 상황 고등학교 때 학교 학우들을 위한 편의 앱 동천 알리미를 만들었다. 시간표, 급식, 공지사항 등을 볼 수 있는 앱이었다. 화면 구성은 다음과 같았다. FrameLayout에 4개의 Fragment를 올려놓고 Bottom Navigation Bar로 show/hide 해서 전환 그런데 버그가 발생했다. 잠깐 다른 앱을 켰다가 다...
프로젝트 배경 우송대 제1회 전국 SW 동아리 경진대회에 참가해서 IoT 자율형 전등을 만들었다. 실내 밝기에 따라 전등 밝기를 자동으로 조절하는 시스템이고, 센서 값이 바뀌면 앱에서도 바로 보이게 만드는 게 목표였다. 구성 요소: NodeMCU(ESP8266): 조도 센서로 밝기 측정, 전등 제어 Node.js 서버: 중계 역할 An...