Spring5 OSIV와 성능 최적화 OSIV란 하이버네이트: Open Session In View JPA: Open EntityManager In View OSIV ON spring.jpa.open-in-view : true (기본값) 동작 원리 클라이언트의 요청이 들어오면 영속성 컨텍스트를 생성한다. 이때 트랜잭션은 시작하지 않는다. 서비스 계증에서 트랜잭션을 시작하면 생성해둔 영속성 컨텍스트에 트랜잭션을 시작한다. 비즈니스 로직을 실행하고 서비스 계층이 끝나면 트랜잭션을 커밋하면서 영속성 컨텍스트를 플러시한다. 이때 트랜잭션만 종료하고 영속성 컨텍스트는 살려둔다. 클라이언트의 요청이 끝날 때 영속성 컨텍스트를 종료한다. 장점 영속성 컨텍스트가 유지되지 때문에 View Template이나 API 컨트롤러에서 지연 로딩이 가능하다. 단점 .. 2022. 3. 25. JPA 지연 로딩과 조회 성능 최적화 (2) 지연 로딩 @OneToMany 연관관계에 대한 성능 최적화 내용이다. 엔티티 직접 노출 엔티티를 API의 응답 값으로 반환하는 방법이다. @GetMapping("/api/v1/orders") public List orderV1() { List orders = orderRepository.findAll(); for (Order order : orders) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderItems(); orderItems.forEach(o -> o.getItem().getName()); } return orders; } @OneToMany 연관 관계인 엔티티의 값을 .. 2022. 3. 7. JPA 지연 로딩과 조회 성능 최적화 (1) 지연 로딩 @ManyToOne, @OneToOne 연관관계에 대한 성능 최적화 내용이다. @OneToMany 연관관계는 다음 포스트에서 정리할 예정이다. 예제 도메인 @Entity @Table(name = "orders") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL).. 2022. 3. 6. Log4j에서 SLF4J + Logback 으로 전환하기 레거시에서 아직 사용 중인 Log4j를 SLF4J + Logback로 전환하려고 분석한 내용을 정리해본다. 로깅 퍼사드란 로거 API를 추상화한 인터페이스이다. 로깅에 관련된 여러 라이브러리에 대한 통일된 사용방식(API)을 제공하므로 로깅 라이브러리의 변경이 용이하다. 로깅 퍼사드: JCL, SLF4J 로거: JUL, Log4j, Log4j 2, Logback 퍼사드 패턴: 건물의 정면"을 의미하는 단어로, 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴 SLF4J 사용 이유 JCL은 런타임에 로거를 바인딩한다. 로거의 동적 바인딩으로 비효율 발생한다. SLF4J은 컴파일 타임에 로거를 바인딩하므로 JCL에 비해 더 효율적이다. 적용 방법 pom.xml에 .. 2022. 2. 3. @Transactional의 propagation(전파옵션) REQUIRED 기본 속성, 부모 트랜잭션 내에서 실행(부모 트랜잭션 전파)하며 부모 트랜잭션이 없는 경우 새로운 트랜잭션을 생성한다. 한개의 트랜잭션으로 묶이기 때문에 부모나 자식 어디에서든 예외가 발생할 경우 둘 다 롤백 된다. 부모가 문제인 경우 @Transactional public void saveWithRequiredAndParentFailed(Parent parent, Child child) { parentRepository.save(parent); childService.saveWithRequired(child, false); throw new RuntimeException(); } @Transactional(propagation = Propagation.REQUIRED) public vo.. 2022. 1. 24. 이전 1 다음