인프런 커뮤니티 질문&답변

문재승님의 프로필 이미지
문재승

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

OSIV와 성능 최적화

osiv OFF했을 때 ordersV1 실행시 질문 있습니다.

작성

·

345

1


=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 네
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

@GetMapping("/api/v1/orders")
public List<Order> ordersV1() {
    List<Order> all = orderRepository.findAllByString(new OrderSearch());
    for (Order order : all) {
        order.getMember().getName();
        order.getDelivery().getAddress();

        List<OrderItem> orderItems = order.getOrderItems();
        orderItems.stream().forEach(o -> o.getItem().getName());
    }
    return all;
}

OSIV를 껏을 경우에

order.getMember().getName()에서 에러가 뜨는게 맞다고하셨습니다.

 

그런데 ordersv1 사용시에

findAllByString을 사용하면서 트랜잭션을 애초에 사용하지 않았는데 어느 타이밍에 트랜잭션이 켜지고 꺼지면서 커넥션이 사라지는지 궁금합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴이에요.

답변드리겠습니다.

OSIV를 껏을 경우에는 실제 DB 커넥션을 가져오지 않기 때문에 lazy loading으로 연결된 멤버나 딜리버리 객체에 접근할 때 에러가 발생합니다.

ordersV1 메소드에서 findAllByString 함수를 호출하면서 트랜잭션이 시작됩니다. JPA는 Entity를 다룰 때 트랜잭션 내에서 동작해야 합니다. findAllByString 함수 또한 트랜잭션을 기반으로 동작합니다. 그렇기 때문에 findAllByString 함수 실행 시 DB 커넥션을 가져오게 됩니다.

트랜잭션 시작과 끝은 스프링 프레임워크에서 제공하는 AOP 기술로 관리됩니다. findAllByString 함수 실행 시 트랜잭션 시작 이벤트가 동작하고, 함수 실행이 끝나면 트랜잭션 종료 이벤트가 동작합니다. 따라서, 트랜잭션 관리와 DB 커넥션도 스프링에서 관리됩니다.

그러므로, 사용자가 트랜잭션을 명시하지 않았어도 내부적으로 트랜잭션과 DB 커넥션을 사용하게 됩니다.

결론적으로, findAllByString 함수 실행 시 트랜잭션과 DB 커넥션이 켜지고, 트랜잭션 종료와 함께 DB 커넥션이 닫히게 됩니다.

다른 궁금한 내용 있으면 댓글로 남겨주세요. 감사합니다.

문재승님의 프로필 이미지
문재승

작성한 질문수

질문하기