Database/JPA

Transactional with jpa repository

BUST 2018. 5. 28. 22:48


interface SampleRepository {

}



interfaces  SampleJpaRepository implements JpaRepository, SampleRepository {

}


@Autowired

private SampleRepository sampleRepositry;



- SampleRepositry라는 인터페이스를 두고 실제 SampleJpaRepository 구현체를 따로 두는 형식으로 구현을 할수가 있다.

- 구조는 Domain Driven Design에서 인프라 설계부분 (여기에서는 JPA를 Infra라고 볼수 있다)을 인터페이스 두고 구현을 한 예제이다.


위의 코드는 비즈니스 로직을 작성을 할때 문제점이 발생이 될수가 있다.

- 실제 Transaction은 SampleJpaRepostiory에만 적용이 되어있는 것이기 때문에 SampleRepository의 인터페이스를 통한 작동에서는 Transaction이 작동이 되지가 않는다.

  - 즉 save, update가 작동이 되지않는다.

- Transaction이 없는 상태이기 때문에 @Transactional Annotaion이 없이 얻은 객체는 영속성이 없는 상태(Detached)이다

- 위의 문제를 해결하기 위해서는 반드시 @Transactional Annotation을 추가를 해야된다. Read Only 인경우에는 Read Only Flag를 true로 해서 잘못된 Save, update가 발생이 되지 않도록 주의해야 된다.

'Database > JPA' 카테고리의 다른 글

JPA 영속성 컨텍스트  (0) 2018.09.08
JPA CascadeType  (0) 2018.09.08
@ EnableTransactionManagement Advice Mode PROXY와 ASPECTJ  (0) 2018.06.03
Database Transaction Lock With JPA  (0) 2018.05.28