오늘은 처음으로 어제 풀던 문제에 계속 막혀서 CodeKata를 진행하지 못했다. 내일 계속 시도해보자.
이어서 JPA의 심화적인 부분을 배웠다. 가장 흥미로웠던 것은 JPA의 Persistence Context에 관해 배운 것이다.
JPA에서는 SQL을 모아두었다가 한 번에 실행한다는 사실은 알고 있었지만, 언제 하는 지를 몰랐었는데, 이번에 3가지 방식으로 자동으로 실행하다는 것을 알게 되었다. 첫 번째는 Entity를 관리하는 EntityManager에 flush 메소드를 직접 호출하는 것이다. 혹은 Repository에 saveAndFlush를 사용하면 바로바로 SQL이 Database에 반영이 된다. 두 번째는 @Transactional 이 붙은 메소드가 실행이 완료되면 바로 Commit 된다고 한다. 마지막으로, JPQL을 사용하면 바로 실행된다고 한다.
이어서 영속성 컨텍스트에 의한 Entity의 생명주기에 대해 배웠다.
Entity의 상태는 영속성 컨텍스트가 관리하는 영속 상태와, 영속 상태였다가 분리된 준영속 상태, 영속성과 관련없는 비영속 상태, 삭제된 상태로 이루어져 있다. 이러한 영속성 컨텍스트는 @Transactional 의 생명주기와 함께한다는 것은 기억해 둘만 하다.
detach는 영속 상태의 Entity를 준영속으로 만들고, clear는 영속성 컨텍스트 내의 모든 영속 상태의 Entity를 준영속 상태로 만들며, persist는 비영속 상태였던 Entity를 영속 상태로 만든다. 강의에서 가장 강조했던 것은 merge이다. 이 merge는 준영속 상태인 Entity를 영속 상태로 바꾼다라 표시는 했지만, 정확히는 준영속 상태인 Entity와 영속 상태가 된 Entity는 다른 객체이다. 즉, 준영속에서 영속 상태가 될 수 없다.
메소드 이름이 merge인 이유는 다름이 아니라, 1차 캐쉬나 데이터베이스에 있는 Entity를 가져와서 이것을 파라미터로 전달된 Entity와 합치고, 영속 상태로 만들기 때문이다. 그렇기에 파라미터로 전달된 Entity와 다른 객체이다. 지금까지 나는 JPA를 사용하면서 save를 사용하였지만, save내에서는 persist와 merge를 활용해서 데이터베이스에 저장을 한다는 사실을 이번에 처음 알게 되었다.
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
if (entityInformation.isNew(entity)) {
entityManager.persist(entity);
return entity;
} else {
return entityManager.merge(entity);
}
}
오늘 배운 것 중 또 기억에 남는 것이 있다면 @Where 내지 @SQLRestriction이나. 특정 Entity를 조회 할 때마다 특정 조건을 붙이고 싶다면 Entity 위에 @Where Annotation을 붙여서 반복되는 JPQL을 줄일 수 있다. 현재, Where는 Deprecated 되었기에, SQLRestriction을 사용한다고 한다. 내가 이전에 했던 팀 프로젝트에서 soft-delete를 구현하신 팀원 분이 SQLRestriction을 사용하셨는데, 이제야 왜 이렇게 사용을 하셨는지 알게 되었다. 추가적으로 @SQLDelete를 사용하면 해당 Entity를 삭제할 때, DELETE가 아닌 해당 Annotation에 들어가 있는 쿼리가 실행 된다고 한다.
또 흥미로웠던 것은 @CreatedBy이다. @CreatedData나 @LastModifiedDate는 이전 부터 알고 있었지만, 특정 Entity를 Post해서 생성하였을때, 로그인 한 멤버를 수동적으로 넣었었는데, 이 @CreatedBy를 사용하면, 자동적으로 넣어 줄 수 있다고 해서 지금 바로 써보고 싶어질 정도로 감탄했다. 내일이라도 한 번 써보도록 하자.
'부트캠프 일지' 카테고리의 다른 글
부트캠프 52일차 후기 (0) | 2024.02.08 |
---|---|
부트캠프 51일차 후기 (1) | 2024.02.07 |
부트캠프 49일차 후기 (1) | 2024.02.05 |
부트캠프 48일차 일지 (1) | 2024.02.02 |
부트캠프 47일차 후기 (0) | 2024.02.01 |