[Spring] Entity? DTO? VO?
์คํ๋ง์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ฉด์ 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 ๊ตฌ๋ ๋ก์ง
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๋ ๊ฐ์ ๊ฐ์ฒด๋ก ์ทจ๊ธ