Skip to content

taeik21/Flow_Commerce

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🚀 Flow Commerce

Spring Boot, JPA, Querydsl을 활용하여 복잡한 도메인(회원, 상품, 주문)의 요구사항을 구현하고, N+1 문제 해결 및 대용량 트래픽을 고려한 쿼리 성능 튜닝(최적화)을 진행한 RESTful API 서버입니다.

🛠 Tech Stack

  • Language: Java
  • Framework: Spring Boot, Spring Data JPA, Querydsl
  • Database: MySQL, H2

📌 Project Overview

단순한 CRUD를 넘어 실무에서 마주하는 JPA의 성능 이슈와 동적 쿼리의 한계를 극복하는 데 초점을 맞추었습니다. 복잡한 테이블 조인과 일대다(1:N) 컬렉션 조회 시 발생하는 치명적인 성능 저하 원인을 분석하고, 이를 리팩토링 과정을 거쳐 튜닝했습니다.


💡 Key Features & Architecture

1. 도메인 주도 설계

  • 회원(Member), 상품(Item), 주문(Order) 도메인의 복잡한 비즈니스 로직을 분석하고, 객체지향적인 엔티티 설계 및 테이블 매핑 진행
  • 엔티티가 직접 외부에 노출되어 스펙이 변경되는 것을 방지하기 위해 API 응답용 DTO를 별도로 설계하여 유지보수성과 안전성 확보

2. Spring Data JPA의 실무적 활용

  • 순수 JPA 로직을 Spring Data JPA로 전환하며 공통화된 CRUD 인터페이스 적용
  • 실무에서 불필요하거나 위험할 수 있는 자동화 기능은 배제하고, 꼭 필요한 기능만 선별하여 안정적인 데이터 접근 계층(Data Access Layer) 구축.

🔥 Engineering Focus

1. JPA N+1 문제 해결 및 극한의 조회 성능 최적화

  • 이슈: 주문 목록을 조회할 때, 회원과 상품 정보(컬렉션 데이터)를 지연 로딩으로 가져오면서 수많은 단건 쿼리가 폭주하는 N+1 문제 및 성능 저하 발생.
  • 해결 및 튜닝 과정 (6단계 리팩토링):
    1. 엔티티 직접 노출: 문제점 파악 (순환 참조, 스펙 노출)
    2. DTO 변환: API 스펙 안정화, 여전히 N+1 문제 존재
    3. Fetch Join 적용: 일반적인 다대일(N:1) 관계의 쿼리를 한 번의 조인 쿼리로 최적화
    4. JPA 컬렉션 한계 돌파: 일대다(1:N) 페이징 처리 시 발생하는 OOM 위험 분석
    5. hibernate.default_batch_fetch_size 적용: 컬렉션 조회를 페이징 가능하도록 유지하면서, 쿼리 발생 횟수를 1번의 IN 쿼리로 획기적으로 단축
    6. DTO 직접 조회: 화면에 최적화된 복잡한 쿼리를 별도의 DTO로 한 번에 조회하도록 튜닝하여 극한의 성능 확보

2. Querydsl을 활용한 동적 쿼리 및 타입 세이프 개발

  • 이슈: 회원 상태나 주문 기간 등 다양한 검색 조건이 조합되는 복잡한 동적 쿼리를 순수 JPQL이나 Criteria로 작성 시, 가독성이 현저히 떨어지고 런타임 에러 발생 위험이 높음
  • 해결: Querydsl을 도입하여 자바 코드로 SQL을 작성
    • 컴파일 시점에 문법 오류를 100% 잡아내어 런타임 안정성 보장
    • 조건문 분기를 통한 깔끔한 동적 쿼리 작성으로 복잡한 실무 검색 로직 해결
    • 코드가 직관적이고 재사용이 가능해져 비즈니스 로직 구현에만 집중할 수 있는 환경 구축

3. 실무 장애 방지: OSIV (Open Session In View) 전략

  • 데이터베이스 커넥션이 뷰(View)나 API 응답 끝까지 유지되면서, 커넥션 풀이 말라버려 장애가 발생하는 OSIV 개념을 이해
  • 실무 환경의 트래픽을 고려하여 OSIV를 적절히 끄고, 트랜잭션 범위 안에서 강제 초기화를 진행하는 명확한 아키텍처 설계 지향

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors