๊ฐ๋จํ ๊ฒ์ํ์ ๋ง๋ค๊ธฐ ์ํด์ 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๋ก ์ค์ ํ์ง ์๋ ํ๋ผ๋ฏธํฐ์ ๋ํด์๋ ์ ๊ทผํ์ฌ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
๋ค์ ํฌ์คํ ์์๋ ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๋ ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค ๐
'BE > ๐ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] Controller์ RestController ์ฐจ์ด์ ResponseBody (2) | 2024.09.22 |
---|---|
Spring boot ํ๋ก์ ํธ์ SSL ์ธ์ฆ์ ์ ์ฉํ๊ธฐ (0) | 2024.07.15 |
[Spring Boot JPA ๊ฒ์ํ ๋ง๋ค๊ธฐ] 2. ํ๋ก์ ํธ ๊ตฌ์กฐ ์ค์ (0) | 2024.04.29 |
IntelliJ ๋ฌด๋ฃ ๋ฒ์ ์ผ๋ก ์คํ๋ง ๋ถํธ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ (1) | 2024.04.18 |
[Spring Boot JPA ๊ฒ์ํ ๋ง๋ค๊ธฐ] 1. ํ๊ฒฝ์ค์ (1) | 2024.04.18 |
๋๊ธ