Page History
...
네이밍 | 설명 |
---|---|
MyAddressRepository | 인터페이스이며, 커스텀함 함수규격을 미리 설명을 해놓아야합니다. 네이밍 특성 : 특성+테이블명+저장소 My + Address + Repository |
AddressRepositoryImpl | 커스텀한 구현체를 정의합니다. 네이밍 특성: 테이블명+저장소+구현 MyAddressRepositoryImpx ( X ) |
AddressRepository | 최종 사용가능해진 저장소이름입니다. JPA의 기본 저장소 특성과함께 사용자 정의 기능을 함께 사용가능합니다. 네이밍특성: 테이블명+저장소 |
영속성을 활용한 쓰기지연
위 그림이 중요한 이유는, 영속의 상태가 상하로 2단계 갑자기 변경될수 없음을 의미합니다.
예를 들어 Remove된 엔티티는 deatach(준영속) 상태가 될수 없습니다.
영속성을 간단하게 설명하기위해, 하나의 함수(트랜젝션에) 다양한 데이터처리를 포함하였습니다.
Code Block | ||||
---|---|---|---|---|
| ||||
public class AddressRepositoryImpl implements MyAddressRepository {
@PersistenceContext
private EntityManager em;
@Override
@Transactional
public void addAddress() {
//비영속( 단순하게 엔티티 객체만 생성함)
Address2 address2 = new Address2();
address2.setName("영희");
address2.setSex("여");
address2.setAddress("서울/마포");
//엔티티 저장하고, 준영속화(분리함)
em.persist(address2);
em.detach(address2);
// 첫번째 데이터를 찾아서 삭제대기...
Address2 firstAddress = em.find(Address2.class, 1L );
em.remove(firstAddress);
//엔티티를 다시 영속 관리객체로 복귀
em.merge(address2);
//추가된 엔티티의 데이터가 변경되었음으로 변경감지.
address2.setName("영희2");
//마지막 상태 Db반영(쓰기지연)
em.flush();
//준영속
//em.detach(address2);
//다시영속시킴
//em.merge(address2);
//예외발생-롤백
//assertTrue(false);
} |
코드분석:
- 단지 '@Transactional' 어노테이션을 함수에 선언함으로, 어플리케이션에서 발생하는 예외까지 트랜젝션 과정에 포함시켜, 자동 롤백을 시킬수가 있습니다.
- 기존 SQL/SP개발 방식에서는 하나의 함수에 즉각적인 삽입과 삭제가이루어 졌을것입니다. 하지만 지연쓰기방식은 변경점을 조사하여 변경이 없는 부분은 SQL문을 수행하지 않습니다.
- 즉 , 실제 DB에 반영하는 flush() 타임시 변경점만을 반영을 합니다.