본문 바로가기

백엔드/JPA

스프링 데이터 JPA - 사용자 정의 클래스, Auditing, MVC 페이징

사용자 정의 레포지토리

사용자 정의 레포지토리 만드는 법

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의 방법보다 더 깔끔하다.

  1. 스프링 부트 메인 클래스에 @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 해서 들어가보면

 

 

 

 

 

 

마무리

마무리 글

 

관련글

관련글 링크