[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. ,
comments powered by Disqus

Tistory Comments 0