- Spring-Data Access 기술 이해
- DataSource 이해와 설정
- 스프링에서 사용 가능한 데이터 접근 기술에 대해서 이해한다.
- DataSource 개념을 이해하고 설정한다.
DAO 디자인 패턴이란, Business Layer와 DB에 접근하는 DAO Lyaer를 분리한 패턴입니다. Business Layer가 시스템의 실제 기능이 구현되어 있는데, DB에 접근해야합니다. DB에 접근하는 행위들 즉, CRUD는 DAO라는 클래스에 따로 구현합니다.
- 데이터베이스와 Business Layer 가운데 위치
- CRUD 작업 수행
- 자바에서의 관계형 데이터 베이스 접속 기술
- JDK 레벨에서 지원하며, 다른 고수준 기술의 기반이 됨
자바에서의 데이터 엑세스 기술 중 가장 low한 기술이 JDBC입니다.
JDBC는 데이터베이스와 Java가 연결되는 인터페이스로 볼 수 있습니다.
JDBC는 데이터베이스 종류과 상관없이 연동을 해줄 수 있는데, 왜냐하면 웬만한 DB에서는 JDBC Driver를 지원하기 때문입니다. JDBC는 아래 설명드릴 데이터 엑세스 기술에 비해서는 코드가 복잡한 편이라고 볼 수 있습니다.
- 스프링 자체적으로 지원하는 JDBC Wrapper
Spring에서 제공하는 JDBC 기술입니다. 그냥 알고 넘어가시면 됩니다.
우리는 아래 Mybatis를 사용할 것이기 때문입니다.
- Third-party 자바-관계형DB 매핑 라이브러리
- 자바 Object와 SQL문을 자동으로 매핑 - SQL Mapper
Mybatis는 Spring JDBC가 나오기 전부터 있던 기술입니다. 가장 핵심적으로 SQL문과 JAVA 소스를 분리해서 사용할 수 있도록 SQL Mapper를 제공합니다.
- Java ORM 표준 인터페이스
JAVA와 DB 연동 기술 중에서 가장 추상화된 기술입니다. 이 기술을 우리가 ORM 기술이라고 합니다. 근본적으로 서로 들어맞지 않는 JAVA Object와 DB relation(table)을 매핑시켜주는 기술입니다.
Mybatis는 객체와 테이블 컬럼을 하나하나 수동으로 매핑해줘야 합니다.
이 작업이 DB 연동 핵심 작업입니다. 이 핵심 작업을 자동으로 매핑해주니 정말 편리할겁니다.
예를 들어, DB에 insert할 때 자바 객체를 생성하면 그 자체로 insert가 됩니다. 즉, 데이터 CRUD를 자바 객체 단에서 처리하는 것입니다.
- 자바 ORM 구현체
Hibernate도 JAVA와 DB 연동 기술 중에서 가장 추상화된 기술입니다.
JPA를 실제로 구현한 종류 중 하나가 Hibernate입니다.
ORM는 처음엔 어렵지만, 적응 후에는 오히려 더 쉬워진다고 합니다.
개발자가 DB에 종속적이지 않아도 됩니다.
- 스프링 프레임워크에 포함된 스프링 공식 데이터베이스 연동 라이브러리
- 유연한 Transaction 처리를 위해 Connection 단의 높은 추상화를 제공함
- 내부적으로 Connection-Pool을 지원하고, Result Mapper의 추상화를 사용해 쿼리를 편리하게 수행할 수 있음
- Mybatis, Hibernate 등도 내부적으로는 Spring-JDBC를 사용함
먼저 Spring-JDBC 개념에 대해 살펴보겠습니다.
Spring-JDBC도 강력한 라이브러리지만, 현실은 Mybatis를 더 많이 씁니다.
- XML을 별도 파일로 분리하고 자바 객체와 SQL 매핑을 지원하는 프레임워크
- 별도의 라이브러리로 존재하고 스프링과 연동모듈을 지원한다
- mybatis-spring 라이브러리 필요
- 스칼라 Mybatis, .NET Mybatis 등이 있음
자바 코드 안에 SQL이라는 프로그래밍 언어 코드가 임베디드 되는 것은 사실 부담스러운 일입니다. 테스팅 하거나 수정 후 재빌드 할 때 등등...
Mybatis가 이런 부담을 해소 시켜줍니다.
Mybatis는 Java뿐만 아니라 스칼라, .NET에서도 지원 가능합니다.
- Connection 확보 - DB에 연결
- 데이터소스는 Connection을 가져오기 위한 기술
- 스프링은 DataSource를 통해 Connection을 제공
어떤 DB를 연동하던, 어떤 연동 기술을 사용하던, 반드시 필요한 것이 DataSource입니다. DB 연동에서 가장 핵심적인 것이 Connection입니다.
Java에서는 어떤 DB와 연결됐다라는 의미는 "Connection객체가 확보됐다" 라고 말합니다.
이 Connection를 확보하기 위해서 Spring은 DataSource라는 별도의 기술을 사용합니다. DataSource를 빈으로 처리해서 사용합니다. 그래서 DataSource 빈을 사용해서 Connection을 제어할 수 있는 것이죠!
DataSource는 선언을 통해서 설정할 수 있고 그 방법은 아래 2가지가 있습니다.
- DriverManager를 사용하는 방법
- DriverManagerDataSource 클래스를 사용
- Connection Pool이나 JNDI를 사용할 수 없는 경우 사용
- Connection Pool을 사용하는 방법
- 데이터베이스 커넥션을 미리 여러 개를 확보해두고 클라이언트의 요청에 따라 제공하고 반납받는 시스템
- 매번 물리적으로 커넥션을 생성하지 않아 성능이 좋아짐
일반적으로는 Connection Pool를 사용합니다. 이를 사용하지 않으면 DB에 매번 요청할 때 마다 Connection를 새로 생성하고 끊어내는 부담스러운 작업을 해야합니다.
그래서 Connection Pool를 사용해서 여러 개의 Connection을 확보해두고 클라이언트 요청이 왔을 때 Connection을 빌려주고, 반납받는 식으로 활용합니다.
Connection Pool은 상용 WAS에서도 많이 내장되어 있는데, 톰캣도 이를 지원합니다.
두 방법의 성능 차이는 있지만, 개발자 입장에서 코딩 방법은 동일합니다.
- 프로퍼티 파일로 분리한 정보는 ${}(프로퍼티 치환자)을 이용하여 설정함
- ${} 값을 치환해주는 기능은 < context:property-placeholder> 태그에 의해 자동으로 등록되는 PropertyPlaceHolderConfigurer Bean이 담당함
DataSource는 Bean으로 설정합니다. 이 Bean 안에 정의하는 Property 태그 내용들이 중요합니다. 우리가 DB를 연동한다는 것은 실제 물리적인 DB환경을 지정해줘야한다는 것입니다. 따라서 driverClass, url, username, password 값을 DB에 맞게 잘 설정해주면 됩니다.
그런데 개발 서버와, 운영 서버 DB 환경이 다른 경우는 프로퍼티 값을 바꿔줘야겠죠? 이런식으로 DB 환경 값을 바꿔줘야하는 경우에는 프로퍼티 파일에 DB 환경 값들을 지정해줍니다. 그리고 context:property-placeholder 태그 사용해서 DB 환경 값을 지정해뒀던 프로퍼티 파일 위치를 지정해주면 됩니다.
- 반면에 프로퍼티 값으로 제공되는 일부 설정정보(예-DataSource Bean이 사용하는 DB 연결정보)는 애플리케이션이 동작하는 환경(개발, 테스트, 스테이징, 운영)에 따라서 자주 바뀔 수 있음
- 환경에 따라 자주 변경될 수 있는 내용은 properties 파일로 분리하는 것이 가장 깔끔하다. XML처럼 복잡한 구성이 필요 없고 키-값 쌍(Key-Value)으로 구성하면 됨
프로퍼티 파일은 단순한 텍스트 파일로 작성하면 됩니다.
↑ pom.xml에 spring JDBC 라이브러리 Dependency를 추가합니다.
↑ DB 연동 설정은 두 가지 방법이 있습니다.
dataSource 빈 등록은 두 가지 방법 모두 해야합니다.
다만, (2)방법의 경우, DB 환경 설정 값을 다른 파일에 따로 저장해두고 빈과 설정 파일을 연결하는 것입니다.
↑ 파일을 하나 만들고, DB 환경 설정 값을 저장합니다.
이후, 서버를 가동했을 때 문제가 없으면 서버가 잘 started 됩니다.