๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BE/๐Ÿƒ Spring

[Spring Boot JPA ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] 3. Entity ์ƒ์„ฑ

by ํ‹ด๋”” 2024. 5. 8.
728x90
๋ฐ˜์‘ํ˜•

๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Board๋ผ๋Š” Entity ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์ž๋ฐ”์˜ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ORM์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ORM์€ Object Relational Mapping์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์˜ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ์ˆ ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. JPA๋Š” ORM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

 

 ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Entity

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ๊ณตํ†ต์ ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ปฌ๋Ÿผ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ์ผ๊ณผ ์ˆ˜์ •์ผ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ •์˜ํ•  ๋•Œ ๋งˆ๋‹ค ๋งค๋ฒˆ ์ •์˜ ํ•˜์ง€ ์•Š๊ณ  ๊ณตํ†ต Entity ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋จผ์ € BaseTime์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ด…์‹œ๋‹ค!

 

import lombok.Getter;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public abstract class BaseTime {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

 

์ƒ์„ฑ์ผ, ์ˆ˜์ •์ผ ์ž๋™ ์ฑ„์›€

@EntityListeners(value = AuditingEntityListener.class)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JPA์—์„œ ์ž๋™์œผ๋กœ ๊ทธ ๊ฐ’์„ ์ฑ„์›Œ ์ค๋‹ˆ๋‹ค. ์ƒ์„ฑ์ผ์—๋Š” @CreatedDate ์• ๋„ˆํ…Œ์ด์…˜์„ ๋ช…์‹œํ•ด ์ฃผ๊ณ , ์ˆ˜์ •์ผ์—๋Š” @LastModifiedDate๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”. ์ƒ์„ฑ์ผ์˜ ๊ฒฝ์šฐ ํ•œ๋ฒˆ ์„ค์ •๋˜๊ณ  ๋‚œ๋’ค ์ˆ˜์ •๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ Column์˜ uptable๋ฅผ false๋กœ ์„ค์ •ํ•ด ์ค๋‹ˆ๋‹ค. 

 

 

์ฒ˜์Œ Entity ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋ฉด created_date, modified_date๋Š” ๋™์ผํ•œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๊ฐ€์งˆ๊ฑฐ์—์š”. ์ดํ›„์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”ฐ๋กœ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ JPA์—์„œ ์ž๋™์œผ๋กœ modified_date๋ฅผ ์ˆ˜์ •ํ•ด ์ค๋‹ˆ๋‹ค. 

์ฒซ๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด created_date์™€ modified_date๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒ์„ฑ ํ›„ ์ˆ˜์ •ํ–ˆ๊ณ  ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. 

 

 Board Entity ์ƒ์„ฑ

 

board ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•œ Board๋ผ๋Š” Entity class๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.AccessLevel;
import lombok.Builder;

 

์ž„ํฌํŠธํ•ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Board extends BaseTime {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    private String author;

    @Builder
    public Board(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }

    public void updateBoard(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

 

@Entity์— ๋”ฐ๋กœ ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค์˜ ์ด๋ฆ„์œผ๋กœ ์ž๋™ ๋งคํ•‘ ๋ฉ๋‹ˆ๋‹ค. 

@NoArgsConstructor(access = AccessLevel.PROTECTED)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

Board myBoard = new Board(); // ์‚ฌ์šฉ๋ถˆ๊ฐ€

 

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ protected ๋ ˆ๋ฒจ๋กœ ์ง€์ •๋˜์–ด ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ์ƒ์„ฑ์ž๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. 

 

@Setter ์—†์ด @Getter๋งŒ ์ง€์ •ํ•œ ์ด์œ ๋Š” id์™€ ๊ฐ™์ด ์ง์ ‘ ์ง€์ •ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ํ•„๋“œ๋„ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Getter๋งŒ ์‚ฌ์šฉํ•˜๊ณ 

    @Builder
    public Board(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }

 

๋กฌ๋ณต์˜ @Builder๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์ •ํ•ด ์ค๋‹ˆ๋‹ค

 

        Board board = Board.builder()
                .title(title)
                .content(content)
                .author(author)
                .build();

 

์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋กฌ๋ณต์˜ builder๋กœ ๊ฐ’์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๊ณ , @Builder๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 

 

 ๋งˆ์น˜๋ฉฐ

 

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ™Œ

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€