팀 활동
프로젝트 기본 셋팅
어제 정한 컨벤션에 따라 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 문제가 발생할 수 있다.
- 읽어오는 API도
@Transactional(readOnly=true)
를 추가한다. jpa open-in-view: false
를 설정하면 컨트롤러에서 영속성 컨텍스트와의 연결을 끊을 수 있다.hibernate.default_batch_fetch_size
를 설정하면 개수를 정해 한번에 가져올 수 있다.- 또는
.fetchJoin()
을 사용하여 가져온다.
QueryDSL로 동적 쿼리 작성
predicate는 서술어를 의미한다.
BooleanBuilder
와BooleanExpression을
활용한다.- 조건이 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 구현
QuerydslPredicateExecutor
- Repository 인터페이스에
implements
하면 predicate와 pageable을 지원한다.
- Repository 인터페이스에
BooleanBuilder
- 검색 조건을 추가하거나 제한 할 수 있다.
- 그룹별 조회도 가능하다.
QuerydslBinderCustomzier
- 부분 검색 및 문자열 트림을 지원하여 유연한 검색 제공.