Backend
[Spring] Spring REST Docs 도입기
[Spring] Spring REST Docs 도입기
2023.05.10Spring REST Docs 도입프로젝트를 수행하던 중, 개발 중에 기획이 여러 번 바뀌고 이에 따라 오고 가는 자원의 형태도 달라져 API 문서를 수정하는 일이 자주 생겼다. 하지만 잘못하여 실수로 적는 일도 생기고, 매번 API가 변경될 때마다 문서까지 수정하여 전달하기엔 시간 소모가 많았다. 때문에 Spring REST Docs를 통해 컨트롤러 테스트와 동시에 문서 작성을 자동화시켜 바로 전달할 수 있는 환경을 갖출 수 있어 도입하게 되었다. 현재 Spring REST Docs는 Java 17이상, Spring Framework 6 이상의 환경을 요구한다. build 구성Spring REST Docs를 사용하기 위해 다음과 같이 빌드를 작성한다. (Gradle 환경)plugins { id "or..
[JPA] OSIV(Open Session In View)
[JPA] OSIV(Open Session In View)
2023.05.09OSIV(Open Session In View)? OSIV는 영속성 컨텍스트를 뷰까지 열어두는 기능이다. 영속성 컨텍스트가 뷰까지 유지된다면 엔티티가 영속 상태로 유지되어 있어, 뷰에서도 지연 로딩을 사용할 수 있다. 즉 OSIV가 활성화 된 상태에서는 다음과 같이 영속성 컨텍스트 생존 범위가 요청이 끝나는 시점까지 유지된다. OSIV가 활성화 상태일 때 동작은 다음과 같다. 클라이언트의 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다. 트랜잭션을 시작할 때 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작한다. 서비스 계층이 끝나면 트랜잭션을 commit하고 영속성 컨텍스트를 flush한다. 이 시점에 트랜잭션은 끝나지만 영속성 컨텍스트는 종료되지 않는다. 컨트롤러..
[JPA] N+1 문제
[JPA] N+1 문제
2023.04.03N+1 문제? N+1 문제란 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상을 말한다. 예를 들어, Member와 여러 Member를 가지는 MemberGroup의 관계가 있다고 하자. Member와 MemberGroup Entity는 다음과 같이 구성되어 있다. @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne @JoinColumn(name ..