Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

네이밍설명
MyAddressRepository

인터페이스이며, 커스텀함 함수규격을 미리 설명을 해놓아야합니다.

네이밍 특성 : 특성+테이블명+저장소

My + Address + Repository

AddressRepositoryImpl

커스텀한 구현체를 정의합니다.

네이밍 특성: 테이블명+저장소+구현

MyAddressRepositoryImpx ( X )

AddressRepository

최종 사용가능해진 저장소이름입니다. JPA의 기본 저장소 특성과함께

사용자 정의 기능을 함께 사용가능합니다.

네이밍특성: 테이블명+저장소



영속성을 활용한 쓰기지연

Image Added

위 그림이 중요한 이유는, 영속의 상태가 상하로 2단계 갑자기 변경될수 없음을 의미합니다.

예를 들어 Remove된 엔티티는 deatach(준영속) 상태가 될수 없습니다. 


영속성을 간단하게 설명하기위해, 하나의 함수(트랜젝션에) 다양한 데이터처리를 포함하였습니다.

Code Block
languagejava
themeEmacs
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() 타임시 변경점만을 반영을 합니다.