Skip to main content Link Search Menu Expand Document (external link) Copy Copied

팀 활동

프로젝트 기본 셋팅

어제 정한 컨벤션에 따라 GitHub Repository의 설정을 반영하고, 프로젝트 기본 셋팅과 공통 모듈에 대해 논의 했다. BaseEntity, Exception, Response, Swagger Config처럼 공통적으로 필요한 부분을 추려보았는데, 막상 모놀리식 서비스와 다르게 MSA환경 에서는 각 서비스가 독립적으로 나누어져 있어 이것을 반영하는 방법을 오랫동안 고민해보았다.

결국, 추후에 리팩토링 단계에서 튜터님께 조언을 받는 것으로 마무리 했다. 그리고 각 서비스에서 개별적으로 중복 코드일 수 있는 코드를 적용하되, 같은 방식으로 진행 될 수 있도록 틀을 먼저 만들어 두기로 했다.


GitHub Proejct 적용

GitHub Projects에서 Todo를 설정하고 이슈로 전환해 라벨을 붙이고 브랜치까지 생성할 수 있는 흐름이 정말 편리했다. 덕분에 작업 관리가 눈에 보이게 정리되는 느낌이라 활용도가 높았다.

다만, 여기서 약간의 아쉬움이 있었던 점은, 이슈로 전환된 경우 템플릿이 적용되지 않았다는 점이다.


QueryDSL 특강

QueryDSL 장점

  • 타입 안전성: 컴파일 시 타입 검사가 가능하다.
  • 간결한 SQL 작성: 가독성과 유지보수성이 높다.

QueryDSL 사용 이유

  • 복잡한 쿼리 작성: Method Query로는 복잡한 쿼리를 작성하기 어렵다.
  • 동적 쿼리 생성: JPQL로는 동적 쿼리를 작성하는 것이 어렵다.

QueryDSL은 JPAQueryFactory 빈을 사용하여 동적 쿼리를 편리하게 작성할 수 있다.


Query 사용시 주의사항

효율적으로 사용하기 위해 LAZY 옵션을 주로 사용하는데, Lazy 옵션 사용시 N+1 문제가 발생할 수 있다.

  1. 읽어오는 API도 @Transactional(readOnly=true)를 추가한다.
  2. jpa open-in-view: false를 설정하면 컨트롤러에서 영속성 컨텍스트와의 연결을 끊을 수 있다.
  3. hibernate.default_batch_fetch_size를 설정하면 개수를 정해 한번에 가져올 수 있다.
  4. 또는 .fetchJoin()을 사용하여 가져온다.

QueryDSL로 동적 쿼리 작성

predicate는 서술어를 의미한다.

  • BooleanBuilderBooleanExpression을 활용한다.
  • 조건이 null일 경우 조건절이 자동으로 제거되므로 명시적이고 깔끔한 동적 쿼리 구성이 가능하다.
  • count() 보다는 exists()이 많이 효율이 좋다.

엔티티 대신 DTO 조회하기

장점

  • 필요없는 컬럼을 조회하지 않는다.
  • 1:1 관계시 N+1 문제를 방지한다.
  • 2차 캐시 등 불필요한 기능 작동을 줄여 캐시와 오버헤드가 감소한다.
  • Group By와 정렬에 최적화되어 있다.
  • 커버링 인덱스 활용할 수 있다.

대량 업데이트

  • 대규모 배치 업데이트시에 엔티티를 전부 로딩하고, 수정시 자동 반영하기 때 성능저하가 심각하다.
  • QueryDSL을 통해 1회성 벌크 업데이트로 처리하는 좋다.

QueryProjection

DTO도 Q파일을 생성할 수 있다. @QueryProjection 으로 DTO 생성자에 추가하여 효율적으로 데이터를 매핑할 수 있다.


꿀팁

PagedModel

Controller에서 페이징 정보를 받을때 Pageable 객체로 담을 수 있다.

Page 객체가 사용하기는 편하지만, DTO를 대체해 쓰기에는 아쉬운 점이 있다.

  • 순환 오류 발생 가능
  • JSON으로 변환 문제
  • Redis 직렬화 문제
  • Page 객체 사용시 Transactional(readOnly=true) 어노테이션 필수

PagedModel은 스프링 Web에서 권장하는 Page용 DTO(size, number, totalElements, totalPages)이다.


JPA와 QueryDsl 조합 Search 구현

  1. QuerydslPredicateExecutor
    • Repository 인터페이스에 implements하면 predicate와 pageable을 지원한다.
  2. BooleanBuilder
    • 검색 조건을 추가하거나 제한 할 수 있다.
    • 그룹별 조회도 가능하다.
  3. QuerydslBinderCustomzier
    • 부분 검색 및 문자열 트림을 지원하여 유연한 검색 제공.