์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[JPA] ๋ธ”๋กœ๊ทธ ์—”ํ‹ฐํ‹ฐ ๋งŒ๋“ค๊ธฐ - 2

๋ฏธ๋กœ910 2024. 10. 2. 12:16
๐Ÿ’ก
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;
	

}