실전! 스프링 데이터 JPA - 섹션5. 확장 기능
CS/김영한 스프링 강의

실전! 스프링 데이터 JPA - 섹션5. 확장 기능

자기가 원하는 기능을 data jpa repository interface에서 더 추가해서 사용할 수 있다. 자기만의 인터페이스를 만들고, 이 인터페이스의 구체적 클래스 + Impl를 작성하고(관례 규칙. 이게 있어야 스프링에서 가져감) jpa repository에서 이 인터페이스를 확장하는 것이다.

이렇게 뺄 정도의 복잡한 쿼리인데 핵심 비즈니스와 그다지 관련없는 쿼리라면 따로 레포지토리를 만들어 구조적으로 해결하는 방법도 있다. 어느게 더 좋을지는 본인 선택임.

 

 

db에서 해당 row가 언제 생성되었고 수정되었는지를 표시하는 만들어진 시간, 업데이트된 시간을 표시하는걸 audit이라고 함. 당연히 다른 곳들에서도 많이 쓰이므로 @Audit도 지원한다. 원래 db로만 있을 땐 상속 개념이 없어 각 테이블마다 일일히 만들어 관리해줘야 했지만 이젠 객체이기 때문에 객체 상속 개념이 들어가며 생긴 기능.

 

@PrePersist와 @PreUpdate로 만들어질 때, 업데이트 될 때의 이벤트를 걸 수 있다.

위 경우는 이벤트로 직접 걸었을 때고 jpa에서 지원하는걸 사용해보자. 위에서 직접 이벤트 함수 만든 것 대신에 @CreatedDate와 @LastModifiedDate를 사용하면 된다. 메인에 @EnableJpaAuditing넣고 @EntityListeners를 넣는 등의 설정이 필요하다.

 

 

 

다음은 시간 뿐 아니라 누군가에 의해 만들어지고 수정되었나도 기록할 때. @CreatedBy와 @LastModifiedBy를 지원한다. 메인에서 @Bean으로 누가 수정했는지를 적을 수 있는걸 등록할 수 있어서, 해당 엔티티가 수정될 때 메인에 정의된 AuditorAware를 거쳐간다.

 

 

실무에선 언제 수정되었는가는 엄청 자주 쓰이지만 누군가에 의해 수정되었나는 잘 안쓰인다. 그래서 엔티티를 따로 만들어서 관리하는 편.

 

 

 

도메인 클래스 컨버터는 controller에서 요청 받을 때 매개변수 보고 pk id보고 알아서 변환시켜주는거. 사실 위험해서 별로 쓰진 않는다.

 

id로 전해주는게 pk이기 때문에 알아서 where로 찾아 객체로 매핑한다.

 

 

web에서도 직접 Page를 사용할 수 있다. 파라미터로 조건들도 설정 가능.

레퍼지토리가 받는 매개변수고 Pageable 객체도 상속하고 있어서 Pageable을 그대로 주는것이 가능 한것.

기본값은 size가 20인데 global하게 설정해서 바꿀 수도 있고, @PageableDeault로도 바꿀 수 있다.

 

 

엔티티를 그대로 반환값으로 주면 안되므로 dto로 반환해서 준다.

참고로 dto는 엔티티를 봐도 되므로 엔티티를 받아 자신을 정의하는 방식으로 하면 더 쉬워짐.