Table of Contents

Spring Boot 가이드: Entity

Table of Contents

이번 포스트에서는 Spring Boot에서 Entity의 간단한 사용법에 대해서 알아보겠습니다.

Github에서 샘플 프로젝트의 전체 코드를 확인할 수 있습니다.

GitHub - xvzc/spring-test: spring test repo


Sample

다음은 샘플 엔티티 USER의 코드입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Entity
@Table(name = "USER")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true, length = 30)
    private String username;

    @Valid
    @Embedded
    private Password password;

    @Column(nullable = false, unique = true, length = 30)
    private String nickname;

    @Column(nullable = false, length = 191)
    private String bio;

    @Valid
    @Embedded
    private Email email;
    /**
     * 만약 컬럼명이 Email 클래스에 정의된 것과 다르다면
     * @AttributeOverride(name="value", column=@Column(name="mail"))로 덮어쓰기 가능
     */

    @CreatedDate
    private LocalDateTime created;

		... // 생략
}

Password 의 경우 해당 컬럼만의 특정한 기능이 필요합니다. 예를들면 암호화, 해싱, 단일 컬럼 업데이트 등이 이에 속합니다. 이러한 경우 새로운 클래스를 정의해서 Embeded 컬럼으로 사용하는 것이 좋습니다.

JPA Auditing

JPA Auditing을 사용하면 생성 및 수정 날짜를 직접 입력하지 않고도 자동으로 최신화 시킬 수 있습니다. 아래는 샘플 엔티티인 Post 클래스에서 JPA Auditing을 사용한 예시입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Entity
@Table(name = "POST")
public class Post {

		... // 생략

    @CreatedDate
    private LocalDateTime created;

    @LastModifiedDate
    private LocalDateTime modified;

    @PrePersist
    public void onPrePersist(){
        this.created = LocalDateTime.parse(
                LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        );
        this.modified = this.created;
    }

    @PreUpdate
    public void onPreUpdate(){
        this.modified= LocalDateTime .parse(
                        LocalDateTime.now() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
                        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                );
    }
}