rabo93 2025. 2. 27. 22:57

์Šคํ”„๋ง์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ VO๋งŒ ์จ์™”๋Š”๋ฐ.. ๊ฐ‘์ž๊ธฐ DTO๋Š” ์–ธ์ œ ์ผ๋”๋ผ? ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค..

์ •ํ™•ํ•œ ๊ฐœ๋…์„ ์•Œ๊ณ  ๊ฐ€์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๐Ÿ’ก

 

Spring์˜ ๊ธฐ๋ณธ 3๊ฐ€์ง€ ๊ณ„์ธต(+๋„๋ฉ”์ธ ๋ชจ๋ธ ํด๋ž˜์Šค)
  • ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต(@Controller) : ์›น ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ฒ˜๋ฆฌ, ์ตœ์ข… UI์—์„œ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ์„œ๋น„์Šค ๊ณ„์ธต(@Service) : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ, ๋น„์ฆˆ๋‹ˆ์Šค์™€ ๊ด€๋ จ๋œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์ ํ•ฉ์„ฑ ๊ฒ€์ฆ, ์–‘์ชฝ์˜ ๊ณ„์ธต๋“ค๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  • ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค(=Persistence) ๊ณ„์ธต(@Repository, ORM, Mybatis ํ”„๋ ˆ์ž„์›Œํฌ..) : DB์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• , ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ์ ์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ, CRUD ์ˆ˜ํ–‰
  • ๋„๋ฉ”์ธ ๋ชจ๋ธ ํด๋ž˜์Šค(VO, DTO ๊ฐ์ฒด) : ์œ„ 3๊ฐœ์˜ ๊ณ„์ธต ์ „์ฒด์— ๊ฑธ์ณ ์‚ฌ์šฉ๋จ, private๋กœ ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋ณ€์ˆ˜, getter/setter ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค

 


Spring MVC ํŒจํ„ด์˜ ๊ตฌ์กฐ

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง(Controller)

: ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›๊ณ , ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ์‘๋‹ต๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์ด์–ด์ฃผ๋Š” ํ๋ฆ„ ์—ญํ• 

 

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Service)

: Controller๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต์— ์ง‘์ค‘ํ•˜๊ณ , ์ค‘๊ฐ„ ๊ณผ์ •์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ฝ”์–ด์ ์ธ ์ž‘์—…์€ Service์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹(์ฝ”๋“œ์˜ ์ดํ•ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ด)

์ฆ‰, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ์†ํ•˜๋Š” ๊ฐœ๋…์ด๋ฉด์„œ๋„, ์ „์ฒด ํ๋ฆ„๋ณด๋‹ค๋Š” ๊ตฌ์ฒด์ ์ธ ์ž‘์—…์„ ๊ฐ•์กฐํ•˜๋Š” ์˜์—ญ

 

ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋กœ์ง(View)

: ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐํŽ˜์ด์Šค(UI)์„ ๋‹ด๋‹นํ•˜๋Š” ์˜์—ญ, ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๋žœ๋”๋งํ•˜๋Š” ์˜์—ญ, ๋˜ํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

: ์˜ˆ) HTML, CSS, Javascript

 

* ์ฐธ๊ณ ) Spring MVC ๊ตฌ๋™ ๋กœ์ง

https://rabo93.tistory.com/11

 


Entity(์—”ํ‹ฐํ‹ฐ)
  • Entity ํด๋ž˜์Šค๋Š” ์‹ค์ œ DB์™€ 1:1๋กœ ๋งคํ•‘๋˜๋Š” ํด๋ž˜์Šค๋กœ, DB ๋‚ด์— ์กด์žฌํ•˜๋Š” attribute๋งŒ ์†์„ฑ(ํ•„๋“œ)๋กœ ๊ฐ€์ ธ์•ผํ•œ๋‹ค!
  • ๋„๋ฉ”์ธ ๋กœ์ง๋งŒ ๊ฐ€์ง€๊ณ , ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋กœ์ง(View)๋ฅผ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋œ๋‹ค.
  • ์š”์ฒญ/์‘๋‹ต์‹œ Entityํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ.

 

DTO(Data Transfer Object) : ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด
  • ๊ฐ ๊ณ„์ธต๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ
  • ๋ณ„๋„์˜ ๋กœ์ง ์—†์ด getter/setter๋งŒ ์กด์žฌ
  • DTO๋Š” ์ฃผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ (View์™€ ํ†ต์‹ )
public class MemberDTO {
	private String name;
	private int age;
	
	//getter,setter ์ •์˜
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}

View์— ์žˆ๋Š” form์—์„œ name ํ•„๋“œ ๊ฐ’์„ ํ”„๋กœํผํ‹ฐ์— ๋งž์ถ”์–ด ๋„˜๊ธด๋‹ค๋ฉด, ์ด๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ๊ณณ์—์„œ๋Š” ์ผ์ผํžˆ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒƒ์ด ์•„๋‹Œ name ์†์„ฑ์˜ ์ด๋ฆ„์ด๋ž‘ ๋งค์นญ๋˜๋Š” ํ”„๋กœํผํ‹ฐ์— ์ž๋™์œผ๋กœ DTO๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋˜์–ด MemberDTO๋ฅผ Type์œผ๋กœ ํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค!

 

์—ฌ๊ธฐ์„œ ์˜๋ฌธ.
์™œ Entity๊ฐ€ ์žˆ๋Š”๋ฐ DTO๋ฅผ ๋”ฐ๋กœ ์“ฐ์ง€?

=> DB(๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต)๊ณผ View(ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต)์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ!

Entity๋Š” ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋ฏ€๋กœ, ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ์‰ฝ๋‹ค.

DTO๋Š” ์ฃผ๋กœ View์™€ ํ†ต์‹ ํ•˜๋ฉฐ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

VO (Value Object) : ๊ฐ’ ๊ฐ์ฒด
  • DTO์™€ ๋น„์Šทํ•˜์ง€๋งŒ Read Only ์†์„ฑ์„ ๊ฐ€์ง
  • ์ƒ์„ฑ์ž๋ฅผ ์ œ์™ธํ•˜๊ณ , set ์„ฑ๊ฒฉ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค!
  • VO ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ํ•„๋“œ ๋‚ด์˜ ๋ชจ๋“  ๊ฐ’๋“ค์ด ๊ฐ™์€ ๊ฒฝ์šฐ, ๋™์ผํ•œ ๊ฐ์ฒด

 

๋”ฐ๋ผ์„œ,
DTO์™€ VO์˜ ์ฐจ์ด์ ?

 

DTO๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ฃผ ๋ชฉ์ ์ด๊ณ ,

VO๋Š” ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ฃผ ๋ชฉ์ .

=> ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ํ•  ๊ฒฝ์šฐ DTO๋กœ, DB์—์„œ ๊ฐ€์ ธ์˜ค๋Š” Data๋Š” VO๋กœ ์ •์˜ํ›„ ์‚ฌ์šฉ

DTO๋Š” ์†์„ฑ ๊ฐ’์ด ๊ฐ™์•„๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด, VO๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰