Spring JDBC 실습1 { DTO, DAO, ConnectionPool, DataSource, 프로젝트 구조 }
Ben의 프로그램2023. 7. 25. 19:53
728x90
DTO 란?
DTO 란 Data Transfer Object 의 약자입니다. 계층간의 데이터 교환을 위한 자바빈즈입니다. 여기서의 계층이란 컨트롤러 뷰, 비즈니스 계층, 퍼시스턴스 계층을 의미합니다. 일반적으로 DTO는 로직을 가지고 있지 않고, 순수한 데이터 객체이다. DTO 는 컨트롤러와 뷰, Entity 는 Repository와 DB 간의 전송을 위해 사용하는 모델입니다.
DTO 의 예시 & 이해하기
DTO는 필드와 getter, setter 를 가지고 있고 toString( ), equals( ), hashCode( ) 등의 Object 메서드를 오버라이딩 할 수 있다. DTO를 간단하게 이해해보겠습니다. 계층 간의 데이터 교환을 하는 자바빈즈가 DTO라고 했습니다. 계층간 이동을 하면서 데이터를 가지고 다닐 때 하나씩 들고 다니면 불편하기 때문에 어떤 하나의 가방처럼 만들어서 데이터들을 한꺼번에 갖고 다니는 용도로 사용한다고 간단하게 이해할 수 있습니다.
DAO 란?
DAO 란 Data Access Object 의 약자로 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체이다. 보통 데이터베이스를 조작하는 기능을 전담하는 목적으로 만들어진다. 객체지향은 하나의 객체가 하나의 일만 수행하는 것을 지향하는데요. DAO 가 바로 그런 예시라고 할 수 있습니다.
ConnectionPool 란?
ConncetionPool 이란 데이터베이스로부터 데이터를 읽고 쓰는 프로그램을 실행시켰을 때 프로그램이 DBMS에게 접속하는 시간이 오래 걸리는 것을 볼 수 있는데, 심지어 많은 데이터를 소비하기도 합니다. 이런 현상을 '자원을 많이 소비한다'라고 이야기하는데요. 이 문제를 해결하기 위해서 DBMS와 Connection 을 미리 많이 맺어둔 객체를 사용하는 경우가 있습니다. 이것을 ConnectionPool 이라고 합니다.
위의 그림처럼 ConnectionPool 는 미리 Connection 을 여러 개 맺어 둔다. 클라이언트가 접속하여 Connection 이 필요하면 커넥션 풀에게 빌려서 사용한 후 반납합니다. ConnectionPool 을 사용할 때는 클라이언트들이 Connection 을 최대한 빠르게 사용하고 반납하도록 만들어야 합니다. 그렇지 않으면 프로그램이 늦어지거나 심한 경우 장애가 발생합니다.
DataSource 란?
ConncectionPool 은 여러개가 생성될 수 있는데요. DataSource 는 이렇게 생성된 커넥션 풀을 관리하는 목적으로 사용되는 객체이다. DataSource 를 이용해 커넥션을 얻어오고 반납하는 등의 작업을 수행한다.
Spring JDBC 프로젝트 구조 : Spring JDBC 를 이용한 DAO 작성 실습
우리가 작성할 프로그램의 구조를 살펴보고 시작하겠습니다. Spring Container 인 ApplicationContext 는 설정파일로 ApplicationConfig 라는 파일을 읽어드립니다. ApplicationConfig 에는 @ComponentScan 어노테이션이 DAO 클래스를 찾도록 설정할 겁니다. 찾은 모든 DAO 클래스는 Spring Container 가 관리하게 됩니다. ApplicationConfig 는 DBConfig 클래스를 import 하게 됩니다. DBConfig 클래스는 dataSource 와 transactionManager 객체를 생성합니다. DAO 는 필드로 NamedParameterJdbcTemplate 과 SimpleJdbcInsert 를 가지게 될 거구요. 두 개의 객체는 모두 dataSource 를 필요로 할 겁니다. 두 개의 객체 모두 SQL의 실행을 편리하게 하도록 스프링 JDBC에서 제공하는 객체인데요. 두 객체가 그런 특징을 갖는 이유는 DB 연결을 위해서 내부적으로 dataSource 를 사용하기 때문입니다. 이 두 개의 객체는 RoleDao 생성자에서 초기화를 하게 되구요. RoleDao 생성자에서 초기화된 두 개의 객체를 이용해서 RoleDao 의 메서드들을 사용하게 됩니다. Spring JDBC를 사용하는 사용자는 Parameter 와 SQL 을 가장 많이 신경써야 합니다. SQL 은 RoleDao 객체에 상수로 정의를 해놓음으로써 나중에 SQL 이 변경될 경우에 좀 더 편하게 수정할 수 있도록 하였습니다. 그리고 한 건의 Role 정보를 저장하고 전달할 목적으로 Role DTO 가 사용되고 있는 것을 볼 수 있습니다. 우리가 만들 프로그램의 구조가 어떻게 생겼는지 숙지를 하시고 이 부분들을 참고하시면 도움이 되실 것 같습니다.