오늘은 부트캠프 68일차이다. 이번주는 JPA 심화와 CI/CD에 대해서 공부하는 주이기도 하면서 자바와 스프링부트를 복습하는 주가 되었고, 아쉬운 점은 얇고 넓게 배우는 점이 되었고, 이것을 깊게 파고 들어가기에는 다른 부분을 놓치기 쉬워서 넓게 복습을 하는 시간을 가졌고 프로젝트를 진행하면서 놓친부분을 자연스럽게 학습을 하는 계기가 될 것 같다.
오늘 배운 것
1. 테스트 간단 정리
1-1. 단위 테스트
- 각 계층(클래스) 별로 테스트 케이스 작성
1-2. 통합 테스트
- 실행될 때마다 랜덤하게 변경되는 시나리오를 만들고 그에 따른 데이터를 미리 생성(Docker 환경의 데이터베이스)
- 모든 엔드포인트에 대해서 테스트
- 사전에 데이터를 미리 만들어둔 것을 통해서, 결과를 예측하고 검증할 수 있음
1-3. 단위테스트는 Pull Request에서 검증하는 용도(CI)
1-4. 통합테스트는 정기 배포 당일 생성한 브랜치에 대해서 검증하고 검증이 완료된다면 자동으로 배포하는 프로세스(CD)
2. Isolation(격리 수준)
- READ_COMMITTED : 다른 트랜잭션에서 커밋하되 내용만 참조할 수 있다.
- REPETABLE_READ : 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
- READ_UNCOMMITTED와 SERIALIZABLE는 잘 사용하지 않는데 이유는 DIRTY READ와 동시성 제어로 인해 잘 사용되지 않는다.
3. EntityGraph(+ QueryDSL)
- @EntityGraph도 마찬가지로 EntityGraph 상에 있는 Entity들의 연관관계 속에서 필요한 엔티티와 컬렉션을 함께 조회하려고 할때 사용한다.
public interface CommentRepository extends JpaRepository<Comment, Long> { @EntityGraph(attributePaths = {"thread"}, type = EntityGraph.EntityGraphType.LOAD) List<Comment> findAll(); }
- Spring Data JPA에 적용하려는 메소드 위에 @EntityGraph 어노테이션을 달고 옵션을 준다.
- attributePaths는 같이 조회할 연관 엔티티명을 적으면 된다.
- ,(콤마)를 통하여 여러개를 줄 수도 있다.
3-1. type은 EntityGraphType.LOAD, EntityGrapType.FETCH 2가지가 있다.
- LOAD : attributePaths에 정의한 엔티티들은 EAGER, 나머지는 글로벌 패치 전략에 따라 패치한다.
- 일단 attributePaths는 EAGER, 나머지는 매핑 설정 따라서
- FETCH : attributePaths에 정의한 엔티티들은 EAGER, 나머지는 LAZY로 패치한다.