✔ 사용자 정의 리포지토리 구현
- 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성
- 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음
다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면?
- JPA 직접 사용( EntityManager )
- 스프링 JDBC Template 사용
- MyBatis 사용
- 데이터베이스 커넥션 직접 사용 등등...
- Querydsl 사용
1. 인터페이스를 하나 생성한다.

2. 구현체 생성 ( +Impl )
Custom인터페이스를 상속한다.

3. Repository에 Custom()메서드 상속

4. 호출 코드

✔ Auditing
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면?
등록일,수정일,등록자,수정자
- JPA 주요 이벤트 어노테이션
- @PrePersist, @PostPersist
- @PreUpdate, @PostUpdate
- 스프링 데이터 JPA 주요 어노테이션
- @CreatedDate
- @LastModifiedDate
- @CreatedBy
- @LastModifiedBy
순수 jpa 사용

일단 생성일에 @Column(update =false)를 이용해서 변경을 막아주고 @PrePersist를 이용해서 등록일,수정일을 둘 다 저장해둔다. 그 후에 @PreUpdate를 이용해서 수정일을 변경해준다.
data jpa 사용
1.@EnableJpaAuditing 스프링 부트 설정 클래스에 적용해줘야 Auditing 사용 가능.
2.스프링 데이터 Auditing 적용 - 등록일, 수정일

3.스프링 데이터 Auditing 적용 - 등록자, 수정자'

4.등록자, 수정자를 처리해주는 AuditorAware 스프링 빈 등록

- 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받음
- 실무에서 대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다. 그래서 위와 같이 Base 타입을 분리하고, 원하는 타입을 선택해서 상속한다.
- 저장시점에 저장데이터만 입력하고 싶으면 @EnableJpaAuditing(modifyOnCreate = false)옵션을 사용하면 된다.