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

See Go님의 프로필 이미지
See Go

작성한 질문수

실전! 스프링 데이터 JPA

스프링 데이터 JPA 구현체 분석

JpaRepository 구현 관련

해결된 질문

작성

·

267

0

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

[질문 내용]
여기에 질문 내용을 남겨주세요.


SimpleJpaRepository가 처음에 생성될 때 entitymanager를 의존성 주입을 받아서 초기화가 됩니다.

문제는 전에 강의에서 entitymanager는 트랜색션 하나당 하나를 생성해야 한다고 했던 것이 생각납니다. 문제는 이렇게 처음 초기화할 때 entitymanager를 주입받게되면 한 entitymanager를 스프링 프로그램이 끝날 때 까지 사용하게 되는데 문제가 없는건가요?

https://jiwondev.tistory.com/225

이런식으로 트랜색션이 끝나고 연결이 끝나도 entitymanager를 유지하면 문제가 생기지 않을까 생각되어 질문드립니다.

답변 2

0

안녕하세요. See Go님, 공식 서포터즈 David입니다.

아래 글 답변을 참고해 주세요:)

https://www.inflearn.com/questions/158967

감사합니다.

See Go님의 프로필 이미지
See Go
질문자

와...감사합니다... 스프링은 보면 볼 수록 신기하네요

0

안녕하세요, 인프런 AI 인턴입니다.

JpaRepository의 구현 클래스인 SimpleJpaRepository는 처음에 EntityManager를 의존성 주입받아 초기화를 합니다. 그리고 이 EntityManager는 스프링 애플리케이션의 라이프사이클 동안 계속해서 사용됩니다.

일반적으로 스프링에서는 EntityManager를 통해 DB와의 세션을 관리하며, 트랜잭션의 범위 내에서 동작합니다. 따라서 트랜잭션이 끝나면 EntityManager는 기본적으로 DB와의 연결을 끊게 됩니다.

하지만 Spring Data JPA의 SimpleJpaRepository에서는 EntityManager를 스프링에 의존하여 관리하는 것이 아니라, EntityManagerFactory를 통해 직접 EntityManager를 생성하고 사용합니다. 이 때, EntityManager는 스프링 컨텍스트를 통해 관리되지 않습니다. 따라서 EntityManager의 생명 주기는 SimpleJpaRepository 인스턴스와 같아지며, 해당 인스턴스가 소멸할 때까지 유지됩니다.

단, 트랜잭션이 끝나고 연결이 끊어진 후에 EntityManager를 사용하려고 할 경우, 예외가 발생할 수 있습니다. 따라서 EntityManager의 유효 범위 내에서만 사용해야 합니다.

만약 EntityManager를 한 번이 아니라 여러 번 사용하려면, 스프링에서 EntityManager를 관리하고 트랜잭션 범위 내에서 사용하도록 설정해야 합니다. 스프링 부트를 사용한다면, @Transactional 어노테이션을 메서드나 클래스에 추가하여 트랜잭션 범위 내에서 EntityManager를 사용할 수 있습니다.

질문하신 링크의 내용을 보면 EntityManager를 사용한 후에는 명시적으로 close() 메서드를 호출해야 한다는 내용이 있는데, 이 부분에 신경쓰셔서 EntityManager의 생명주기와 사용 방법을 관리하시면 됩니다.

더 자세한 내용은 Spring Data JPA와 EntityManager의 관련된 개념을 공부하시면 도움이 될 것입니다. 감사합니다.

See Go님의 프로필 이미지
See Go
질문자

simpleJpaRepository 안에 있는 EntityManager는 초기화시에 한번 초기화 된 이후로는 바꾸지 못하는거 같은데요?

See Go님의 프로필 이미지
See Go

작성한 질문수

질문하기