사용자 정의 레포지토리
사용자 정의 레포지토리 만드는 법
1. 인터페이스 만들기
public interface MemberCustomRepo {
List<Member> findMemCustom();
}
2. 구현체 만들기 - 이름을 맞춰줘야함(설명은 아래에)
@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberCustomRepo{
private final EntityManager em;
@Override
public List<Member> findMemCustom() {
return em.createQuery("select m from Member m").getResultList();
}
}
3. 스프링 데이터 jpa 레포지토리에 1에서 만든 인터페이스 추가 상속
public interface MemberRepository extends JpaRepository<Member, Long>, MemberCustomRepo {}
2에서 클래스 이름은 3의 MemberRepository 뒤에다가 Impl을 붙여주는 것이다. 이렇게 하면 직접 쿼리를 따로 정의할 수 있다. Querydsl 사용 시 이렇게 한다.
Auditing
엔티티를 생성, 변경할 때 시간과 누가 변경했는지 정보를 남기는 것!
👉 순수 jpa 를 사용한 방법
우선 @MappedSuperClass 클래스를 하나 만들어서 공통으로 필요한 데이터들을 정의한다
@MappedSuperclass
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdDate = now;
updatedDate = now;
}
@PreUpdate
public void preUpdate() {
updatedDate = LocalDateTime.now();
}
}
이제 필요한 클래스에서 이 클래스를 상속 받으면 된다. 이렇듯 jpa에서는 JPA 이벤트 어노테이션으로 구현하는 것이다.
👉 스프링 데이터 jpa
jpa의 방법보다 더 깔끔하다.
- 스프링 부트 메인 클래스에 @EnableJpaAuditing 추가
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
//추가로 날짜와 더불어 누가 만들고 업데이트했는지를 넣기 위해서는 아래 코드와 함께 스프링
//메인 클래스에 추가로 메소드를 만들어야한다.
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
@SpringBootApplication
@EnableJpaAuditing
public class DataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(DataJpaApplication.class, args);
}
//추가한 메소드
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
}
이렇게 어노테이션 위주로 해결한다. 참고로 auditorProvider 함수에서는 람다 함수를 생성한다. 이러면 매번 새로운 uuid 를 만들어서 반환해준다.
💡 팁 : 시간 엔티티와 작성자 엔티티를 따로 만듦. 작성자 엔티티가 시간 엔티티를 상속받음. 그러면 시간 데이터는 다 필요하니까 쓰는데 누가 업데이트했는지 필요한 데이터면 시간 엔티티 상속받은 작성자 엔티티를 쓰면된다!
스프링 MVC에서 페이징과 정렬
우선 도메인 클래스 컨버터란 개념부터 정리하면
@GetMapping("/members2/{id}")
public String findMember(@PathVariable("id") Member member){
System.out.println("==========================");
return member.getUsername();
}
이런식으로 해두면 id 값을 가지고 Member 데이터를 찾는 쿼리가 자동으로 나간다. 그 후 찾은 객체를 Member 타입 변수로 주는 것이다.
select 문이 이렇게 나가는 것을 확인할 수 있다.
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
return memberRepository.findAll(pageable);
}
이렇게 해두면 pageable을 인자로 받는 findAll이 호출된다.
JpaRepository 에는 아무런 인자로 받지 않는 findAll이 오버라이딩 되어있고 ,
PagingAndSortingRepository에 들어가보면 이렇게 두개의 findAll이 정의되어있다.
브라우저로 localhost:8080/member 해서 들어가보면
마무리
마무리 글
관련글
관련글 링크
'백엔드 > JPA' 카테고리의 다른 글
쿼리dsl - 조인과 서브쿼리 (0) | 2021.08.31 |
---|---|
스프링 데이터 jpa - 구현체 코드 구경, 쿼리 dsl (0) | 2021.08.23 |
스프링 데이터 jpa 기본 기능정리 (0) | 2021.08.22 |
스프링 데이터 JPA 기초 (0) | 2021.08.22 |
JPQL 페치조인의 한계, 다양한 쿼리 (0) | 2021.08.09 |