확장 기능

yeoro·2021년 12월 28일

사용자 정의 레포지토리

  • 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다.
  • 다양하게 커스텀해서 구현하고 싶다면? ex) JDBC, MyBatis, Querydsl...
  • 복잡한 쿼리, 동적 쿼리 등에 사용
  • 결국 레포지토리가 사용자 정의 레포지토리를 상속받으므로 원래 레포는 지저분해질 수 밖에 없다. 따라서 사용자 정의 레포는 무조건 사용하지 말고 레포를 성격에 따라 나누는 것을 추천한다.

동작

  1. MemberRepositoryImpl(원래 레포지토리 이름 + impl) 에서 MemberRepositoryCustom 상속, 메서드 구현
  2. MemberRepository에서 MemberRepositoryCustom 상속
  3. 메서드 호출시 Impl에서 구현한 메서드가 호출됨

Impl 이 싫다면?

  • XML 설정
  • JavaConfig 설정
  • 유지보수할 때 복잡할 수 있으니 관례를 따르자..

Auditing

  • 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 사용
  • 등록일, 수정일, 등록자, 수정자, ...
  • BaseTimeEntity에는 시간만, BaseEntity에는 Id, BaseTimeEntity 상속으로 필요에 따라 유연하게 사용

JPA

@Column(updatable = false)

  • 실수로 값을 바꿔도 값이 변경되지 않는다.

@PrePersist, @PreUpdate

  • 우선적으로 발생시키려는 이벤트 정의

@MappedSuperclass

  • 속성만 상속받아서 쓰는 어노테이션

Spring Data JPA

@EnableJpaAuditing

  • modifyOnCreate : 값 갱신 여부 설정

@CreatedDate

@LastModifiedDate

@CreatedBy

@LastModifiedBy

@EntityListeners(AuditingEntityListener.class)

  • JPA Auditing 처리 어노테이션

  • orm.xml 파일에 정의해도 됨

등록자, 수정자 값 설정

  • Bean 활용, 메인앱 클래스에 정의

  • 세션에서 사용자 아이디 꺼내오기

  • 랜덤 UUID 값

    UUID (Universally Unique IDentifier)

    • 네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약이며, 범용 고유 식별자라고 한다.
    • 중앙관리시스템 환경은 각 세션에 일련번호를 부여해 유일성은 보장하는 반면, 분산관리 환경에서는 개별 시스템이 id를 발급하더라도 유일성을 보장하기 위해 UUID를 사용한다.
  • 등록, 수정할 때마다 AuditorAware 호출하여 값 가져감


도메인 클래스 컨버터

  • PathVariable에 엔티티를 넣어도 pk 값을 가져옴
  • 레포지토리를 참고한다.
  • 파라미터로 엔티티를 받으면, 이 엔티티는 단순 조회용으로 써야 한다. 트랜잭션이 없는 범위에서 조회했으므로 변경감지가 안됨
  • 간단할 때만 사용가능, 복잡해지면 권장하지 않음

페이징과 정렬

  • 스프링 데이터 JPA가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용가능

  • 레포지토리 메서드에 파라미터로 Pageable을 넣으면 아래와 같은 메서드 호출

  • controller에서 url 파라미터가 바인딩 될 때 pageable이 있으면 pagerequest라는 객체를 생성해서 값을 채워서 주입해줌

  • 반환 타입이 Page이면 count 쿼리도 실행된다.

url 파라미터

  • page : 원하는 페이지 조회, 디폴트는 20개
  • size : 한 페이지에 가져올 데이터 개수
  • sort : 정렬 id,desc

기본값 설정

  • application.yml에 글로벌 설정
  data:
    web:
      pageable:
        default-page-size: 10
  • controller에 파라미터로 설정
@PageableDefault(size = 10)

접두사

  • 페이징 정보가 둘 이상일 때 사용

  • Controller

    @Qualifier("member") Pageable memberPageable
    @Qualifier("order") Pageable orderPageable
  • URL

    /members?member_page=0&order_page=1

Dto 반환

  • page의 map 메서드 사용
  • Entity는 Entity를 봐도 된다. (Dto 클래스 안에 member를 인자로 받는 생성자 생성)

Page를 1부터 시작하기

  • Pageable 커스텀해서 사용

  • PageRequest 객체 사용
    PageRequest request = PageRequest.of(1, 2);

  • spring.data.web.pageable.one-indexed-parameters=true

    • 응답 값들에 오류가 생김 (2페이지인데 pageNumber 값은 1)
    • 응답 값들은 첫 페이지가 0이라고 생각하고 반환된다.
    • 0부터 처리하도록 하는 것 권장

0개의 댓글