• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

MemberService에 @Transactional 붙이는 이유

23.02.07 03:06 작성 조회수 490

0

jpa를 사용하기 이전( 순수jdbc,jdbctemplate)에는 MemberService 클래스에 @Transactional을 안달아줬는데 왜 jpa를 사용하게되면 갑자기 MemberService클래스에 @Transactional 어노테이션을 달아줘야되나요???

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.02.07

안녕하세요, 코더 님. 공식 서포터즈 y2gcoder 입니다.

Service에 @Transactional 을 붙여준 가장 큰 이유는 서비스 계층에서 트랜잭션을 열어주기 위해서입니다.

보통 서비스에 있는 비즈니스 로직들은 한 트랜잭션 안에서 기능을 구현했을 때 정확하게 의도대로 동작하는 경우도 있고, 매번 Repository 계층에 들어갈 때마다 트랜잭션을 열어주고 닫아주고 했을 때보다 성능적으로도 좀 더 나은 경우가 많습니다.

그리고 부가적으로 JPA에서는 영속성 컨텍스트라는 개념이 존재합니다. 이 영속성 컨텍스트를 활용해서 많은 기능을 할 수 있는데, 그 중 변경감지 기능이 있습니다.

간단하게만 설명 드리자면 원래 다른 DB 접근 기술들(MyBatis, JdbcTemplate)은 DB에서 불러온 정보를 수정할 때 따로 update 쿼리를 작성하고 DB로 날려줘야 합니다. 그러나 JPA는 DB에서 불러온 객체의 값을 변경하면 트랜잭션을 커밋할 때 해당 객체의 이전 값과 비교해서 변경된 값이 있으면 update 쿼리를 자동으로 작성해 날려줍니다. 이 때 변경감지 기능은 트랜잭션 내에서 동작하기 때문에 비즈니스 로직에 의해 값 변경이 일어나는 서비스 계층에서 @Transactional을 달아줍니다.

위의 설명을 들으시면서 JPA에 관한 지식이나 DB에 관한 지식이 없다면 이해하는데 어려우실 수 있다고 생각합니다. 그 때는 영한님의 DB 1편, DB 2편JPA 기본편 강의를 수강하시면 바로 이해가 되실 거라 생각합니다 :)

감사합니다.

0

Sang-Uk Lee님의 프로필

Sang-Uk Lee

2023.02.07

Though it is just a guess, in the pure jdbc example you might explicitly open/close transaction in the code.

 

On JPA, same functionality is controlled by the Transactional annotation.