[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)๋ผ๊ณ ๋„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์ธต ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜? ๋ฌด์Šจ ๋ง์ผ๊นŒ์š”? 

์ถœ์ฒ˜: https://www.javatpoint.com/spring-boot-architecture

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์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments