๐ก
1. ๊ธฐ์กด์ MVC ๋ ์ด์ด ๊ธฐ๋ฐ ํจํค์ง ๊ตฌ์กฐ์ ์ต๊ทผ ๋๋ฉ์ธ ์ค์ฌ ํจํค์ง ๊ตฌ์กฐ์ ๋ํ ๊ฐ๋ ์ ๋ง ํ ์ ์๋ค.
2. JPA๋ก ์ํฐํฐ๋ฅผ ์์ฑ์ํฌ ์ ์๋ค.
๋ธ๋ก๊ทธ ํ ์ด๋ธ ๊ตฌ์กฐ ํ์ธ
์ปฌ๋ผ๋ช ์๋ฃํ null ํ์ฉ ํค ์ค๋ช
์ปฌ๋ผ๋ช | ์๋ฃํ | null ํ์ฉ | ํค | ์ค๋ช |
id | BIGINT | N | ๊ธฐ๋ณธํค | ์ผ๋ จ๋ฒํธ, ๊ธฐ๋ณธํค |
title | VARCAR(255) | N | ๊ฒ์๋ฌผ ์ ๋ชฉ | |
content | VARCAR(255) | N | ๋ด์ฉ |
์คํ๋ง ๋ถํธ์ JPA ํ๋ก์ ํธ์์ ํจํค์ง ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ๋ ํธ๋ ๋๋ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(Domain-Driven Design, DDD)์ ์์น์ ์ฌ์ฉํ๋ ์ฌ๋ก๊ฐ ๋ง์ด ๋ณด์ธ๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฅ์ด๋ ์ญํ ์ ๋ฐ๋ผ ๋๋๊ธฐ๋ณด๋ค๋, ๋๋ฉ์ธ ์ค์ฌ์ผ๋ก ๋๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๋ ค๋ ์๋๋ ๋ฐฉ์์ด๋ค.
(์ฌ๊ธฐ์ ๋๋ฉ์ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๊ฒฐํ๋ ค๋ ํน์ ๋น์ฆ๋์ค ๋ฌธ์ ๋ ํ์ค ์ธ๊ณ์ ๋ฌธ์ ๋ฅผ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด, ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ "๊ณ์ข", "๊ณ ๊ฐ", "๊ฑฐ๋"๋ ์ค์ํ ๋น์ฆ๋์ค ๊ฐ๋ ์ด๋ฉฐ, ์ด๊ฒ๋ค์ด ๋ฐ๋ก ๊ทธ ์ ํ๋ฆฌ์ผ์ด์ ์ "๋๋ฉ์ธ" ์ด ๋๋ค.)
DDD ๋ฐฉ์์ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ง๋ค์ด ๋ณด๊ธฐ
1. ๋๋ฉ์ธ๋ณ๋ก ํจํค์ง ๊ตฌ์ฑ
๊ฐ ๋๋ฉ์ธ์๋ ๊ทธ ๋๋ฉ์ธ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ํฐํฐ, ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ, DTO ๋ฑ์ด ํฌํจ๋ฉ๋๋ค.
2. ๊ณตํต ํจํค์ง (์ค์ , ์ ํธ๋ฆฌํฐ ๋ฑ)
๋๋ฉ์ธ๊ณผ๋ ๋ณ๊ฐ๋ก, ์ค์ ๊ด๋ จ ํจํค์ง๋ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์ ํธ๋ฆฌํฐ ํจํค์ง๋ฅผ ํฌํจํฉ๋๋ค.
Article ์์ฑํ๊ธฐ
// ๋ฐ๋์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์ด์ผ ๋๋ค.
@Entity(name = "tb_article")
@NoArgsConstructor // ๊ธฐ๋ณธ ์์ฑ์
@Data
public class Article {
// ํน์ ์์ฑ์์๋ง ๋น๋ ํจํด์ ์ถ๊ฐํ ์ ์๋ค.
@Builder
public Article(String title, String content) {
this.title = title;
this.content = content;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //db๋ก ์์
@Column(name = "id", updatable = false)
private Long id;
@Column(name = "title", nullable = false) // not null
private String title;
@Column(name = "content", nullable = false) // not null
private String content;
}