도메인은 애플리케이션이 다루는 데이터 구조와 책임을 표시하고, 실제 DB에 저장되는 물리적 데이터 구조

 

package com.project.project1.domain;

import jakarta.persistence.*;
import lombok.*;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.time.LocalDateTime;

@Entity
@Table(name = "T_USER")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
public class User {
    @Id
    @GeneratedValue //AutoIncrement
    private Long id;
    private String username;
    private String password;
    private String email;
    private LocalDateTime createTime;
    private LocalDateTime modifyTime;

    @PrePersist
    protected void onCreate() {
        this.createTime = LocalDateTime.now();
        this.modifyTime = LocalDateTime.now();
    }

    @PreUpdate
    protected void onUpdate() {
        this.modifyTime = LocalDateTime.now();
    }

    public void encodePassword(PasswordEncoder passwordEncoder) {
        this.password = passwordEncoder.encode(this.password);
    }

}

 

1.@Entity

-> JPA Entity라는 것을 의미, 이 클래스를 기반으로 테이블 매핑

 

2.Table()

-> 테이블 명시적 매핑, 생략 시 클래스명으로 테이블 매핑

 

3.Lombok

@Getter : getter 자동 생성 -> Entity는 setter를 열어두지 않음

@NoArgsConstructor(access = AccessLevel.PROTECTED) -> 기본 생성자 protected로 생성
@AllArgsConstructor + @Builder -> 모든 필드를 받는 생성자 생성, Builder 패턴으로 객체 생성 가능

 

Builder 패턴

User user = User.builder()
        .name("남기문")
        .loginId("ngm011")
        .password("1234")
        .email("ngm011@naver.com")
        .createTime(LocalDateTime.now())
        .build();

 

 

4.  @PrePersist, @PreUpdate 

-> Entity의 상태가 변경될 때 호출하여 JPA 내부에서만 사용하는 생명주기 메서드

Entity가 새로 생성될 때, 수정될 때 각각 동작한다.

하지만 모든 Entity마다 공통된 컬럼을 PrePersist, PreUpdate를 사용하여 관리하는 경우 불필요한 코드가 반복된다.

이 때, Auditing를 사용한다면 엔티티를 직접 구현하지 않고 공통 규칙으로 처리할 수 있다.

 

+ Recent posts