[Spring boot] DAO์ DTO
์คํ๋ง ๋ถํธ๋ฅผ DB์ ๊ฐ์ด ์ด์ฉํ๋ฉด์, DAO, DTO๋ผ๋ ๋จ์ด๋ฅผ ๊ณ์ ์ฌ์ฉํ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก DAO, DTO๊ฐ ๋ฌด์์ธ์ง ์ด๋ฒ ํฌ์คํธ์์ ํ ๋ฒ ์ ๋๋ก ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
DAO
DAO๋ Data Access Object์ ์ฝ์๋ก ์ฝ๊ฒ ๋งํ์๋ฉด DB์ data์ ์ ๊ทผํ๊ธฐ ์ํ ๊ฐ์ฒด์ ๋๋ค. ์ด๊ฒ์ด ์ ํ์ํ ๊น์?
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก DB์ ์ ๊ทผํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ์ SQL ์ฝ๋์ ๋๋ค. ๊ทธ๋ฌ๋ Java์์ ์ง์ ์ ์ผ๋ก SQL ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Connection์ ์์ฑํ๊ณ PrepareStatement๋ฅผ ๋ง๋ค๊ณ , ์ง์ SQL ์ฝ๋๋ฅผ ์์ฑํ์ฌ Connection์ ๋ซ๋ ๋ณต์กํ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฅผ ์ํํ ๋๋ง๋ค ์ปค๋ฅ์ ์ ์์ฑํ๋ ๊ฒ๋ถํฐ ์์ํ์ฌ ๋ณต์กํ ๊ณผ์ ์ ๋ฐ๋ณตํด์ ์ฝ๋ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋ฒ๊ฑฐ๋กญ๊ณ ์ฝ๋์ ๊ฐ๋ ์ฑ๋ฅผ ๋จ์ด๋จ๋ฆฌ๋ ์์ธ์ด ๋ฉ๋๋ค. ๊ทธ๋์ Java์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ ์ด์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ DB ๋ก์ง์ ๊ฐ์ฒด ํ๋์ ๋ฉ์๋๋ก ๊ตฌํํ์ฌ Controller๋ Service์์ ํ์ํ ๋, ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ๋ชจ์์ง์ DAO๋ผ๊ณ ํฉ๋๋ค.
์ฝ๊ฒ ๋งํ๋ฉด, MyBatis์์ ์์ ์ฝ๋๋ฅผ DAO๋ผ๊ณ ๋งํ๊ณ , ์ฐ๋ฆฌ๋ DB์ ์ ๊ทผ์ด ํ์ํ๋ฉด, ํด๋น ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด์ฃ . ๊ฐ์ฒด๋์? ๊ทธ๊ฒ์ Spring์ ์ฅ์ ์ธ IoC ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ๋ฉด ๋๊ฒ ์ฃ ?
JPA์์๋ CRUDRepository๋ JpaRepository๋ฅผ ์ด์ฉํด์ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ DAO๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ๋ ํ ๊ฐ์ง ์ค์ํ ์ ์ด ์์ต๋๋ค. ๊ทธ๊ฑด ๋ฐ๋ก ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํจ์ธ๋ฐ์. ์ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์ฌ๋๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ๋ค์ค์ ์ฌ์ฉ์๊ฐ ์ ์์ํ์ฌ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๋งค๋ฒ ํด๋ฆญํ ๋๋ง๋ค DB์์ I/O ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ JDBC๋ผ๋ฉด, ์ฌ์ฉ์๊ฐ ๊ฒ์ํ์ ์ ์ํ ๋๋ง๋ค DB I/O๊ฐ ๋ฐ์ํ๊ณ , ๊ฒ์๊ธ์ ์กฐํ, ์์ , ์ญ์ ๋ง๋ค DB I/O๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ปค๋ฅ์ ์ ๋ช ๊ฐ๋ฅผ ๋ง๋ค์ด์ผ ํ ๊น์? ์ปค๋ฅ์ ํ์ ์์ฒญ๋๊ฒ ๋ง์ ์ปค๋ฅ์ ์ด ์๊ธฐ๊ฒ ๋๋๋ฐ, ์ค์ ์ด์์ฒด์ ์์ ์ปค๋ฅ์ ํ๋๋ฅผ ๋ง๋๋ ๋ฐ, ํ์ผ 1๊ฐ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๋์ผํ ์์คํ ์ฝ ํจ์๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฆฐ ๋ฐ์ ์๋๋ฅผ ๋ง๋๋ ์์ธ์ด ๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ์กด์ฌํ๋ ๊ฒ์ด ๋ฐ๋ก DAO์ ๋๋ค. DAO๋ ์์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ Action์ผ๋ก ๋ฐ์ํ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ์ค์ง 1๊ฐ์ ์ปค๋ฅ์ ๋ง์ ์ด์ฉํ์ฌ ๋ค์์ ์ฌ์ฉ์๋ค์ ์์ฑ, ์กฐํ, ์์ , ์ญ์ ๋ฑ์ DB I/O ์ญํ ์ ๋ชจ๋ ์ํํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ ์ด์์ ๋ณด์ฅํ ์ ์๋ ๊ฒ์ด์ฃ .
DTO
DTO๋ Data Transfer Object์ ์ฝ์๋ก ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ์ํ Java Beans๋ฅผ ๋งํ๋ฉฐ VO(Value Object)๋ผ๊ณ ๋ ๋งํฉ๋๋ค. ๊ณ์ธต ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ? ๋ฌด์จ ๋ง์ผ๊น์?
Spring boot๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๊ฐ์ ๊ณ์ธต์ ์ง๋๊ณ ์์ต๋๋ค. ์๋ง ์ ๊ฐ ์์ฑํ ์ด์ ํฌ์คํธ์์ ๋ค๋ฃฌ ๋ด์ฉ์ผ ๊ฒ์ด์ง๋ง ์ด๋ค์ ๋ชจ๋ ์ ๋ฆฌํ์ฌ ํ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ธ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
๋ณต์ต ์ฐจ์์์ ๊ฐ๋จํ ์ค๋ช ์ ๋๋ฆฌ์๋ฉด, MVC ํจํด์ผ๋ก ๋ดค์ ๋ Presentation Layer๊ฐ Controller, Business Layer๋ Service, Persistence Layer๋ JDBC, ORM, Database๊ฐ ์ฌ๋ฌ๋ถ๋ค์ด ์ฌ์ฉํ๋ MySQL, PostgreSQL์ ์ด์ผ๊ธฐ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด DTO๋ ์ ํ์ํ ๊ฒ์ผ๊น์? ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด ์๋์ SQL ์ฝ๋๋ฅผ ๋ณด๋๋ก ํ์ฃ .
select * from member;
์ด SQL ์ฝ๋๋ ์์ฃผ ๊ฐ๋จํฉ๋๋ค. member๋ผ๋ ํ ์ด๋ธ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฝ๋์ ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์์ธํ ๋ณด๋ฉด ์ด ์ฝ๋์๋ ์ด๋ ํ ์๊ตฌ ์ฌํญ๋ ์์ต๋๋ค.
select * from member where userid = 'neonkid';
๊ทธ๋ฐ๋ฐ, ์ด ์ฝ๋๋ ์ด๋จ๊น์? ์ด ์ฝ๋๋ member๋ผ๋ ํ ์ด๋ธ์์ userid๊ฐ neonkid์ธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฝ๋์ ๋๋ค.
์์ ์ฝ๋์ฒ๋ผ ์ด๋ ํ ๋์ ์ธ ์กฐ๊ฑด, ํน์ INSERT, UPDATE ์์ ์ด ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ, ์๋ก์ด ์์ฑํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ ๊ฐ ์นผ๋ผ์ ๋ค์ด๊ฐ์ผ ํ ๋ด์ฉ, ์์ ํ๊ณ ์ถ๋ค๋ฉด, ๊ธฐ์กด์ ๋ด์ฉ ํน์ ์์ ํ๊ณ ์ ํ๋ ๋ด์ฉ์ด ์์ด์ผ ํฉ๋๋ค.
์ด ์ธ์๋, ์ด๋ค์ ์์ ํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์๋ก ํ๋ ํ์ ์๊ตฌ ์ฌํญ๋ค์ด ์์ฃ ์ด๋ฅผ ์ฐ๋ฆฌ๋ DTO๋ผ๊ณ ์ด์ผ๊ธฐ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๊ทธ์ธํ๊ธฐ ์ํด์๋ UserID์ Password๊ฐ ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ํด๋นํ๋ DTO๋ฅผ ์์ฑํ๊ณ , ๊ทธ์ ํด๋นํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ค์ผ ํ๋ฏ๋ก, ์ด์ ๋ํ DTO๋ ์์ฑํด์ผ๊ฒ ์ฃ ?
์ต์ข ์ ์ผ๋ก Controller์์ ์ด๋ฌํ ํํ๋ก ์ฌ์ฉํ์ฌ, ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ์ ๋, ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์์, ๋๋ ค ๋ฐ์ ์์์ ์ ์ํด์ฃผ๋ ๊ฒ์ด DTO๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ์ต๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง ์์ฃผ ๊ฐ๋จํ๊ฒ DAO์ DTO์ ๋ํด์ ์์๋ดค์ต๋๋ค. Spring Boot์์๋ Google Gson, Jackson์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ํ๋์์ ๋ด์ฅ๋์ด ์์ด, REST API์ ์์ฒญ๊ณผ ์๋ต์ ๋ํด์๋ ์๋์ผ๋ก Converting์ด ์ด๋ฃจ์ด์ง๋๋ค. ๋ฐ๋ผ์ DTO๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ํ์ฌ API๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ์์ฒญ์ JSON์ผ๋ก ์์ฒญํ๋ฉด ๋ฉ๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] JPA์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ (0) | 2020.06.23 |
---|---|
[Spring boot] ์ ํ๋ฆฌ์ผ์ด์ ์ Docker ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ธฐ Old & New (0) | 2020.06.04 |
[Spring Data] Hibernate, JPA ๊ทธ๋ฆฌ๊ณ Spring Data JPA (0) | 2020.05.23 |
[Spring boot] JDBC์ Spring JDBC ๊ทธ๋ฆฌ๊ณ MyBatis (0) | 2020.05.22 |
[Spring boot] Spring Data Rest๋ฅผ ์ด์ฉํ REST API ๊ฐ๋ฐ 2 (1) | 2020.05.20 |