2022. 3. 9. 18:22ใBack-End ์์ ์ค/Spring Framework
๐ VO( Value Object )
๐ฝ ๊ฐ๋
Value Object๋ DTO์ ๋์ผํ ๊ฐ๋ ์ด๋ ์ฐจ์ด์ ์ read only ์์ฑ์ ๊ฐ๋ ๊ฒ์ด์์.
Value Object๋ ๊ด๊ณ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ ์ฝ๋์ ๋์๋๋ ์๋ฐ ํด๋์ค์ธ ๊ฒ์ด์์.
ํํ๋ db ๋ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ํ๋๋ค์ Value Object์ Attribute๋ก ํ๊ณ ํด๋น ๋ณ์์ ์ ๊ทผํ ์ ์๋ Getter, Setter ๋ฉ์๋์ ์กฐํฉ์ผ๋ก ํด๋์ค๊ฐ ํ์ฑ๋์ด์ง ํด๋์ค์ธ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ :
JPA์ Entity์์๋ Setter ์ฌ์ฉ์ ์ง์ํ๋, VO๋ ์๋๋ค.
ํน์ฑ์ ๋์ฒด๋ก ๋ถ๋ณ์ฑ์ด๊ณ equlas()๋ก ๋น๊ตํ ๋ ๊ฐ์ฒด์ ๋ชจ๋ ๊ฐ์ ๋น๊ตํด์ผ ํ๋ ๊ฒ์ด์์.
ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ์กฐํ ์์ฒญ์ด ์์ ๋ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ ์กฐํํ๋ ์กฐ๊ฑด์ VO์ ๋ด์์ DAO์ ์์ฒญํ๋ฉด DAO๋ ์ ์ฅ์(์ผ๋ฐ์ ์ผ๋ก Database )๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ์กฐํํ ํ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๊ฒ ๋๋ ๋ฐฉ์ ์ด๋๋๋ค.
VO๋ ๊ฐ๋จํ ๋ ๋ฆฝ์ฒด( Entity )๋ฅผ ์๋ฏธํ๋ ์์ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด์์.
VO์ ๊ฐ์์ ๊ทธ ์ ์ฒด์ฑ์ ์ํด ๊ฒฐ์ ๋์ง ์๋๋ฐ, ๊ทธ ๋ป์ ๋ VO ๋ค์ ๊ทธ ๋ ๊ฐ์ง๊ฐ ๊ฐ์ ๊ฐ์ ๊ฐ๊ณ ์์ ๋ ๊ฐ์ ๊ฒ์ด์ง ๊ฐ์ ๊ฐ์ฒด๋ผ๊ณ ํด์ ๊ฐ์ง ์๋ค๋ ๊ฒ์ด์์.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ ๋ฆฝ์ฒด๋ฅผ ๋๋ณํ๋ ๋ณต์์ ๊ฐ์ VO๋ค์ด ์กด์ฌํ ์ ์๋ต๋๋ค. ๊ฐ๋ ํ๋์ ์ธ์คํด์ค์ ์์กดํ๊ณ ๊ทธ์ ๊ธฐ๋ฐํ ๋ ํผ๋ฐ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ ๊ฐํธํ ์ ์๋ ๊ฒ์ด์์.
โ ํ์์ฑ
Network traffic์ ์ค์์ผ๋ก ์ธํด ํจ๊ณผ์ ์ด๋ค.
โ ๊ธฐ๋ํจ๊ณผ
Network traffic์ด ์ค์ด๋ ๋ค.
โ ์ฅ, ๋จ์
์ฅ์ ์ ๋น ์๋ฒ ์ธก ํด๋ผ์ด์ธํธ๋ ๋คํธ์ํฌ ์ค๋ฒํค๋ ์์ด ์์์ฑ ๋ฐ์ดํฐ์ ์ก์ธ์ค ํ ์ ์๋ค๋ ์ ์ด๋ค.
๋ฐํฐ์ด ์ ๋ฌ์ ์ํด ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด์ง๋ง, ํด๋์ค์ ์ ์ธ์ ์ํด ๋ง์ ์ฝ๋๊ฐ ํ์ํ๋ค.
์ฆ ํ์ผ์๊ฐ ๋ง์์ง๊ฒ ๋๊ณ ๊ด๋ฆฌ๋ ํ๋ค์ด์ง๋ค.
๐ Entity
๐ฝ ๊ฐ๋
Entity๋ ์ค์ DB ํ
์ด๋ธ๊ณผ ๋งคํ๋๋ ํต์ฌ ํด๋์ค์ธ ๊ฒ์ด์์. ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ
์ด๋ธ์ด ์์ฑ๋๊ณ ์คํค๋ง๊ฐ ๋ณ๊ฒฝ ๋๋ต๋๋ค. ๋ฐ๋ผ์, ์ ๋๋ก Entity๋ฅผ ์์ฒญ์ด๋ ์๋ต๊ฐ์ ์ ๋ฌํ๋ ํด๋์ค๋ก ์ฌ์ฉํด์๋ ์ ๋๋ ๊ฒ์ด์์.
Entity๋ id๋ก ๊ตฌ๋ถ๋๋ ๊ฒ์ด์์. ๊ทธ๋ฆฌ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ ์ ์๋ ๊ฒ์ด์์.
Entity๋ DTO์ฒ๋ผ setter๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ ๊ฐ๋ณ ๊ฐ์ฒด๋ก ํ์ฉํ ์ ์๋ ๊ฒ์ด์์.
public class Member {
private final Long id;
private final String email;
private final String password;
private final Integer age;
public Member() {
}
public Member(Long id, String email, String password, Integer age) {
this.id = id;
this.email = email;
this.password = password;
this.age = age;
}
}
๐ DTO( Data Transfer Object : ๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด )
๐ฝ ๊ฐ๋
๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๊ฐ์ฒด๋ฅผ ํ ์์คํ ์์ ๋ค๋ฅธ ์์คํ ์ผ๋ก ์ ๋ฌํ๋ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด์ธ ๊ฒ์ด์์.
Data์ ์ ์ํ๋ ๊ฐ์ฒด์ธ ๊ฒ์ด์์. ์ฌ๊ธฐ์ Data๋ ์ผ๋ฐ์ ์ธ Database๋ ๋ ์ ์๊ณ , ํ์ผ๋ ๋ ์ ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ ์๊ณ , ๊ธฐํ ๋ค๋ฅธ ์ ์ฅ์๋ ๋ ์ ์๋ต๋๋ค.
DTO๋ ํ๋ก์ธ์ค ์ฌ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด์์. ์ด๊ฒ์ ์ด์ฉํ๋ ์ด์ ๋ ํ๋ก์ธ์ค ๊ฐ์ ์ปค๋ฎค๋์ผ์ด์ ์ด ์ฃผ๋ก ๊ฐ๋ณ ํธ์ถ์ด ๋ถ๋ด์ค๋ฌ์ด ์์ ์ผ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์๊ฒฉ ์ธํฐํ์ด์ค(์:์น ์๋น์ค)์ ์ํด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ธ ๊ฒ์ด์์.
๋๋ถ๋ถ์ ๊ฐ๋ณ ํธ์ถ์ด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์๋ณต ์๊ฐ์ ์๋ชจํ๊ธฐ ๋๋ฌธ์, ํธ์ถ ํ์๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ๋ช ๋ฒ์ ํธ์ถ์ ์ํด ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๋ DTO๋ฅผ ์ด์ฉํด์ ํ๋ฒ๋ง ํธ์ถํ๊ฒ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋๋๋ค.
โ VO์ DTO์ ๋น๊ต
DTO์ ๋๋จธ์ง ์์ฑ์ VO์ ๋๊ฐ๋ค๊ณ ์๊ฐํ ์ ์๋ ๊ฒ์ด์์.
Core J2EE Patterns๋ผ๋ ์ฑ ์์๋ Value Object์ Transfer Object๋ฅผ ๋์ผํ ๋ป์ผ๋ก ์ฌ์ฉํ์ง๋ง, ๋ฐ๋๋ก Martin Fowler๋ ์ ์ Patterns of Enterprise Applicatino Architecture์์ ์ฝ๊ฐ ๋ค๋ฅธ ์๋ฏธ๋ก ์ด์ผ๊ธฐ ํ๊ณ ์๋ ๊ฒ์ด์์.
DTO๋ ๋ฉ์๋ ํธ์ถ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ์น๊ตฌ๋ก, VO๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๋์ผ ์ค๋ธ์ ํธ๋ผ๊ณ ๋ณผ ์ ์๋ ๊ฒ์ผ๋ก ํํํ๊ณ ์๋ ๊ฒ์ด์์.
DTO a = new DTO(1);
DTO b = new DTO(1);
์ด๋ผ๊ณ ํ์ ๋, a != b ์ด์ง๋ง,
VO a = VO(1);
VO b = VO(1);
์ด๋ผ๊ณ ํ์ ๋๋ a == b ๋ผ๊ณ ์ ์ํ๋ ํํ์ธ ๊ฒ์ด์์.
๋๋ถ๋ถ์ ๊ฒ์์์ ์ฌ๋๋ค์ VO์ DTO๋ฅผ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ์ด์ผ๊ธฐ ํ๊ณ ์์ด์, ์์ง๋ VO์ DTO๊ฐ "์ด๋ฐ๊ฑฐ๋ค"๋ผ๊ธฐ ๋ณด๋ค ๊ฑฐ์ ๋๊ฐ์ ๊ฐ๋ ์ผ๋ก ์๊ฐํ๊ณ ์๊ณ , ์ฃผ๋ํ๋๋ ์ฐธ ํ๊ฐ๋ฆฌ๋ ๊ฒ์ด์์.
๐ DAO( Data Access Object : ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ์ฒด )
๐ฝ ๊ฐ๋
๋ฐ์ดํฐ ์ ๊ทผ์ ๋ชฉ์ ํ๋ ๊ฐ์ฒด๋๋๋ค. ์ปค๋ฅ์ ๊ฐ์ ๊ฒ์ ํ๋๋ง ๋๊ณ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ DAO์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์๋ฃ์ ์ ๊ทผ ํ๋๋ก ํ๋ ๊ฒ์ด DAO์ ๊ฐ๋ ์ธ ๊ฒ์ด์์.
DB์ ๋ํ insert, update, delete, select๋ฅผ ์ฒ๋ฆฌํ๋ต๋๋ค.
DAO๋ ํน์ ํ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ค๋ฅธ ์ง์์ ์ธ ๋ฉ์ปค๋์ฆ( Persistence Mechanism )์ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด์ธ ๊ฒ์ด์์. ์ดํ๋ฆฌ์ผ์ด์ ํธ์ถ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ถ๋ถ( Persistence Layer )์ ๋งคํํจ์ผ๋ก์จ DAO๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ๋ถ ๋ด์ฉ์ ๋ ธ์ถํ์ง ์๊ณ ํน์ ๋ฐ์ดํฐ ์กฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๊ฒ ํด์ค๋ต๋๋ค. ์ด ๊ณ ๋ฆฝ์ฑ์ ๋จ์ผ ์ฑ ์ ์์น( Single Responsibilty Principle )์ ๊ธฐ๋ฐํ๋ ๊ฒ์ด์์.
์ด ํจํด์ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์, ์์์ฑ์ด ํ์ํ ๋๋ถ๋ถ์ ์ํํธ์จ์ด์, ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ๋ ์ ์๋ ๊ฒ์ด์์.
๋จ์ผ ์ฑ ์ ์์น : ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋ชจ๋ ์ปจํ ์คํธ( ํด๋์ค, ๊ธฐ๋ฅ, ๋ณ์ ๋ฑ )์ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค๋ ๊ฒ์ด๋ฉฐ, ์ด๋ ์ปจํ ์คํธ์ ์ํด ์์ ํ ์บก์ํ ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด์์. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์๋น์ค๋ค์ ํด๋น ์ฑ ์์ ๋ง์ถฐ ์กฐ์ ๋์ด์ผ ํ๋ค๋ ๋ด์ฉ์ด๋๋๋ค.
๋ค๋ฅธ ๋ง๋ก๋ "ํด๋์ค๋ฅผ ์์ ํด์ผ ํ ์ด์ ๋ ์ค์ง ํ๋์ฌ์ผ ํ๋ค"๊ณ ํ๋ ๊ฒ์ด์์.
โ ํ์์ฑ
๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ณตํต์ ์ผ๋ก ์ ์ ํ ์ ์๋ ODBC๊ฐ ๋์์ง๋ง ์ฌ์ ํ ๋ก์ฐ ๋ ๋ฒจ์ API๋ฅผ ํฌํจํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์ฅ๋ฒฝ์ด ๋์๋ ๊ฒ์ด์์.
์ด๋ฐ ์ด์ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ด์ฉํ ์ง์ ์ด์ ์ ๋ง์ถ๊ธฐ ๋ณด๋ค, ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ต๋ฅํ๋์ง์ ๋ ์ด์ ์ ๊ธฐ์ธ์ผ ์ ๋ฐ์ ์์๋ ๊ฒ์ด์์.
์ฆ, ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ ๋ ผ๋ฆฌ์ ๊ณ ๋ฏผ๋ณด๋ค ๊ธฐ์ ์ ๊ณ ๋ฏผ์ ๋ ๋ง์ ์ ๊ฒฝ์ ์ผ์๋ ๊ฒ์ด์์. ์ด๋ฐ ์ด์ ๋ก DAO๋ ๋์์ด ๋์ค๊ฒ ๋์๋ต๋๋ค.
โ ๊ธฐ๋ ํจ๊ณผ
์ฌ์ฉ์๋ ์์ ์ด ํ์ํ interface๋ฅผ DAO์๊ฒ ๋์ง๊ณ DAO๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ์์๊ฒ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ ํ ์ ์๋๋ก ๋ฐํํด์ค ์ ์๋ ๊ฒ์ด์์.
โ ์ฅ, ๋จ์
DB์ ๋ํ ์ ๊ทผ์ DAO๊ฐ ๋ด๋นํ๋๋ก ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค๋ฅผ DAO์์๋ง ํ๊ฒ ๋๋ฉด ๋ค์์ ์๊ฒฉ ํธ์ถ์ ํตํ ์ค๋ฒํค๋๋ฅผ VO๋ DTO๋ฅผ ํตํด ์ค์ผ ์ ์๊ณ , ๋ค์์ DB ํธ์ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ฒ์ด์์. ๋ํ ๋จ์ํ ์ฝ๊ธฐ๋ง ํ๋ ์ฐ์ฐ์ด๋ฏ๋ก ํธ๋์ ์ ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ๊ฐ์ํ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋ฌ๋ Persistent Storage๋ฅผ ๋๋ฌด ๋ฐ์ ํ๊ฒ ๊ฒฐํฉํด์ ์์ฑ์ ํ๊ฒ ๋๋ฉด Persistent Storage๋ฅผ ๋ค์ ์์ฑํ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฐ ์ด๋ฌํ ๊ฒฝ์ฐ ์ ์ง ๋ณด์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์๋ ์๋ค๋ ๊ฒ์ ์ ์ํด์ผ ํ๋ ๊ฒ์ด์์.
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @Transactional๊ณผ rollbackFor ์์ฑ (0) | 2022.03.11 |
---|---|
[Spring] @RequestBody์ @ResponseBody๋? (0) | 2022.03.11 |
[Spring boot - Gradle] JPA ์ฐ๊ฒฐ ์ ๋ณด ์ํธํ(jasypt) (0) | 2021.12.31 |
[Spring Boot] @Order (0) | 2021.12.21 |
[WEB] Interceptor, Sevlet, Filter, Resource Handler ์์๋ณด๊ธฐ (0) | 2021.12.20 |