백엔드 개발자
[#2] 스프링 데이터 JPA 본문
Auditing
등록일, 수정일 같은 공통으로 필요한 속성들을 class 로 정의하여 추가할 수 있도록 해준다.
보통 createdDate 이나 updateDate을 추가해 줄 때 많이 사용한다. (등록자, 수정자도 가능)
기본 jpa에서는 @PrePersist 나 @PreUpdate를 사용해서 구현하는데 스프링 데이터 jpa는
클래스에 @EntityListeners(AuditingEntityListenner.class) 를 추가해주고 각 필드에
@CreateDate, @LastModifiedDate를 추가해 주면 된다.
@EntityListeners(AuditingEntityListenner.class)
@MappedSuperclass
@Getter
public class BaseEntity{
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
이 클래스를 상속받아서 사용할 수 있는데 정말 상속 개념이 아닌 이 속성들만 추가해 주려면
@MappedSuperclass 를 사용하면 된다.
Auditing을 사용하려면 스프링부트 설정 클래스에 @EnableJpaAuditing을 추가해주어야 한다.
Web 도메인 클래스 컨버터
- controller 에서 사용자의 아이디를 받아올 때 id를 바로 Member 엔티티로 받아올 수 있다
- 도메인 클래스 컨버터가 레파지토리를 사용해 엔티티를 찾고 객체를 반환해 준다.
- 트랜잭션이 없는 범위에서 사용되었으므로 엔티티를 변경해도 DB에 반영되지 않는다.
@GetMapping("/member/{id}")
public void findMember(@PathVariable("id") Long id){
}
@GetMapping("/member/{id}")
public void findMember(@PathVariable("id") Member member){
}
Web 페이징
- controller에서 바로 Pageable 을 받을 수 있다.
@GetMapping("/members")
public void findMember(@Pageable pageable){
}
이렇게 바로 받아서 사용할 수 있고 파라미터로 page, size, sort 값 등을 넘기면 Pageable 객체로 만들어 넘겨준다.
/members?page=0&size=3&sort=id,desc&sort=username,desc
- page 값 만 넘겨줄 경우 기본 사이즈는 20이다.
- @PageableDefault(size=5) 를 지정할 수 있다. (page, sort 도 가능)
- 페이징 할 대상이 2개 이상인 경우 페이징 할 대상의 이름과 함께 지정할 수 있다.
- ex) member_page=2
엔티티 save 동작
새로운 엔티티이면 persist, 아니면 merge한다.
- 새로운 엔티티인지 판단하는 기준은 pk가 null 이면 새로운 엔티티라고 생각한다.
- JPA 식별자 생성 전략이 @GenerateValue 이면 save() 호출 시점에 pk는 null이다.
식별자 생성 전략이 직접 할당하는 방식이면 식별자 값이 있는 상태로 save()를 호출 하고, merge()를 호출하게 된다.
- DB를 호출해서 값을 확인하는데 값이 없으므로 다시 persist() 요청을 하게 된다. ⇒ 비효율적
Persistable 인터페이스를 구현하여 새로운 엔티티인지 판단하는 로직을 직접 구현할 수 있다.
@Entity @EntityListeners(AuditingEntityListener.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Item implements Persistable<String>{ @Id private String itemId; @CreateDate private LocalDateTime createDate; @Override public String getId(){ return itemId; } @Override public boolean isNew() { return createDate == null; } }
- CreateDate 속성을 추가하여 이것이 null 인지 아닌지로 판단하도록 할 수 있다.
'스프링 > 스프링 데이터 JPA' 카테고리의 다른 글
[#1] 스프링 데이터 JPA (0) | 2023.09.10 |
---|
Comments