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 |