• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Spring boot에서 EntityManager를 사용하여 Transaction 사용 시 오류 질문드립니다.

20.11.30 01:43 작성 조회수 477

0

안녕하세요 급 호기심에 Spring boot 에서 EntityManager를 사용하여 명시적으로 트랜잭션을 사용해보았는데요.

아래와 같은 오류가 떠서 질문드립니다

트랜잭션 템플릿을 사용해서 실행시켰을 떄는 오류없이 잘되었는데, EntiyManager를 사용해서 트랜잭션을 사용하면 위와 같은 에러가 출력되는 이유가 궁금합니다 !!

테스트한 코드는 아래와 같습니다.

(예제 코드를 코틀린으로 올린 점 죄송합니다 ㅠㅠ)

감사합니다 !!

답변 4

·

답변을 작성해보세요.

1

김광훈님의 프로필

김광훈

질문자

2020.12.03

친절한 설명 감사합니다 !!!

다음 강의도 기대됩니다 :)

1

네 광훈님

JPA 강의 처음을 떠올려 보시면

persistence.xml 에서 데이터베이스 커넥션 정보를 입력했던 것이 기억나실 거에요.

이 방법으로 사용하면 JPA를 순수하게 사용할 수 있고, 데이터베이스 커넥션이나 트랙잭션도 JPA 인터페이스를 통해서 바로 사용할 수 있습니다.

반면에 @PersistenceContext나 @PersistenceUnit 등으로 JPA와 관련된 emf, em을 조회하게 되면 이것은 스프링을 통해서 생성하게 됩니다. 그리고 스프링이 관리하는 트랜잭션과 데이터베이스 커넥션을 사용하게 됩니다.

스프링은 통합 기술이기 때문에 이렇게 하면 같은 트랜잭션을 JPA도 사용하고 일반 JDBC에서도 함께 트랜잭션을 묶어서 사용할 수 있습니다.

스프링은 LocalContainerEntitymanagerFactorybean 이라는 클래스로 엔티티 메니저를 초기화하고 생성하고, JPATransactionManager를 통해서 스프링의 트랜잭션을 통합해서 관리합니다. 그리고 데이터베이스 커넥션 정보도 DataSource를 통해서 생생해야 합니다. (https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#orm-jpa)

마지막으로 이 3가지를 서로 묶어줍니다.

원래는 이런 과정을 개발자가 직접 설정해야 하지만 스프링 부트가 편리하게 도와주는 것이지요.

이런 내용들은 다음에 스프링 데이터 접근 기술 강의(https://www.inflearn.com/roadmaps/373)에서 자세히 설명드릴 예정입니다.

감사합니다.

0

김광훈님의 프로필

김광훈

질문자

2020.11.30

선생님 늦은 밤 친절한 답변 감사합니다 !!

마지막으로 스프링과 JPA를 함께 사용하면 스프링이 제공하는 트랙잭션 매니저를 사용하는 이유에 대해서 알 수 있을까요 ??

혹은 참고할만한 문서 링크 첨부해주시면 정말 감사하겠습니다 ㅠㅠ 

0

안녕하세요. 광훈님

스프링과 함께 JPA를 사용하게 되면, 스프링이 제공하는 트랜잭션 메니저를 통해서 트랜잭션을 사용해야 합니다.

순수하게 JPA를 직접 사용하고, 트랜잭션도 스프링을 사용하지 않고, JPA 트랜잭션을 직접 사용할 때 해당 코드를 사용하시면 됩니다.

감사합니다.