스프링 + MyBatis + MySQL의 설정
스프링을 이용한 개발 중 국내에서 가장 많이 쓰이는 형태는 MyBatis와의 연동 작업을 통해서 sql 처리에 대한 개발 생산성을 높이는 형태로 사용되는 것입니다.
Mybatis를 연동하고 테스트 해야 합니다.
- 스프링과 mybatis를 연동하기 위한 라이브러리 설정
- 데이터베이스와의 연결을 담당하는 datasource 객체 설정
- Mybatis의 핵심인 sqlsessionfactory 객체 설정 및 테스트
복잡해 보이지만 실제로는 개발 초기에 한 번만 작업하는 내용일 뿐, 본격적인 개발에 앞서 반드시 선행돼야 하는 일이므로, 순서에 따라 단계별로 작업을 진행해 주면 어렵지 않게 처리할 수 있습니다.
일반적인 스프링 웹 프로젝트의 구성
본격적인 개발에 앞서 스프링을 이용하는 웹 프로젝트가 어떤 형태의 구성을 사용하는지 간단히 살펴볼 필요가 있습니다.
일반적으로 웹 프로젝트는 3개의 레이어(혹은 tier)로 구성합니다.
* Presentation Layer – UI를 담당하는 구성 요소들이 들어갑니다. 웹인지 모바일 앱인지에 따라서 사용되는 기술이 변경됩니다.
* Business Layer – 서비스 계층이라고도 하며, 고객의 요구사항을 반영하는 계층입니다. 사용자의 환경이 아닌 기능적인 요구사항을 구현한 곳입니다.
* Data Access Layer – 흔히 Persistence Layer라고 하기도 하는데, 데이터 처리를 전문적으로 담당합니다.
Service 주입 DAO 주입 SessionTemplate 주입
Presentation Layer의 경우는 JSP와 같은 뷰(View)를 구성하는 부분과 Controller라는 부분으로 분리되어서 작성됩니다.
Data Access Layer의 경우는 MyBATIS가 추가됩니다. Data Access Layer를 구성하는 DAO(Data Access Object)의 경우 MyBatis를 호출하고 사용하는 구조로 만들어집니다.
Mybatis 연동을 위한 준비
스프링은 다양한 프레임워크와의 융합에 그 장점이 있습니다. 스프링을 중심으로 하고, 다양한 프레임워크를 융합해서 사용할 수 있기 때문에 다양한 기존 환경을 그대로 흡수할 수 있다는 장점도 있습니다.
스프링은 다른 프레임워크와의 연동 작업을 위한 별도의 하위 모듈을 많이 가지고 있는데 이번 장에서 사용할 모듈은 spring-jdbc 모듈과 spring-test 모듈입니다.
Spring-jdbc 모듈은 스프링이 그 자체로 가지고 있는 JDBC용 개발 모듈로 이 자체만 이용해서 개발할 수 있지만, MyBatis만큼 개발의 편리함을 제공하지는 못합니다. JDBC를 이용해서 프로그램을 작성하는 것과 비교하면 MyBatis는 다음과 같은 편리함을 제공합니다.
- 간결한 코드의 처리
MyBatis는 통상 sql mapper 라이브러리입니다. 통상적으로 jdbc 작업을 하게 되면 개발자는 많은 코드를 반복 하게 됩니다. 예를 들어 try~catch~finally를 이용하는 처리에서부터, PreparedStatement와 ResultSet의 데이터를 처리하기까지 많은 코드를 직접 작성하게 됩니다. 반면에 mybatis는 이러한 코드를 상당히 많이 줄여 줄 수 있기 때문에 개발의 속도를 향상하는데 크게 기여합니다. 스프링과 mybatis를 같이 결합하게 되면 코드 제작 없이도 JDBC의 처리가 가능하게 됩니다.
- SQL 문의 분리운영
JDBC는 개발자가 SQL 문을 처리하기 위해서 별도의 파일을 작성하는 등의 번거로운 작업이 필요하지만, mybatis의 경우는 xml 혹은 애노테이션 방식으로 sql 문을 별도로 처리하는 작업이 가능하고, 필요한 경우에는 두 가지 방식을 혼합해서 사용하는 것도 가능합니다. 이 책에서는 간단한 sql은 직접 애노테이션을 이용해서 처리하고, 복잡하고 많은 양의 sql에 대해서는 별도의 xml을 작업하는 형태로 간결함을 유지합니다.
- Spring과의 연동으로 자동화된 처리
스프링 프레임워크와 mybatis를 연계하는 mybatis-spring 라이브러리를 이용하면, 개발자는 직접 sql 문의 호출 없이도 원하는 결과를 얻을 수 있습니다. 이는 mybatis-spring 라이브러리가 만들어내는 클래스 덕분인데, 이 때문에 mybatis는 단독으로 사용하는 것보다는 스프링과 연계해서 사용하는 편이 오히려 코드의 양을 줄여주게 됩니다.
- 동적 sql을 이용한 제어 기능
Mybatis는 기본적으로 sql 문을 처리하기는 하지만, 약간의 제어문이나 루프 등의 처리 기능을 가지고 있습니다. 이를 통해서 sql과 관련된 처리를 java 코드에서 분리시킬 수가 있습니다.
Sp: spring, myb-sp:mybatis-spring myba:mybatis
이를 위해 1) pom.xml을 이용해서 필요한 jar 파일들을 다운로드 하는 것과 2) 스프링의 설정 파일을 수정하는 작업입니다.
Spring과 mybatis 사이에는 두 프레임워크의 접착제 역할을 하는 mybatis-spring 모듈이 필요하게 됩니다. 이를 위해서 pom.xml에 다음과 같은 프레임 워크, 라이브러리를 추가해야 합니다.
<!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency>
<!-- MyBatis-Spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency>
<!-- spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency>
<!-- spring-test --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework-version}</version> </dependency> |
Spring-test는 스프링과 mybatis가 정상적으로 연동되었는지를 확인하는 용도로 사용합니다.
위의 설정을 pom.xml에 추가하고 저장해서 라이브러리가 다운로드 되는 것을 확인합니다. 추가한 라이브러리가 정상적으로 다운로드 되었다면 root-context.xml에서는 조금 다양한 태그를 사용할 수 있습니다.
Spring project에서 root-context.xml 파일의 수정
프로젝트 내에 src/main/webapp/WEB-INF/spring/root-context.xml 파일은 STS가 스프링 프로젝트를 생성할 때 만들어 주는 파일에서 가장 중요한 파일입니다. 이 파일은 스프링과 관련된 설정을 할 때, 쉽게 말해 웹 자원과 관련되지 않은 모든 자원의 설정을 위해서 존재합니다. (웹과 관련된 설정은 appServlet 폴더 내에 있는 servlet-context.xml 파일로 분리합니다. )
Root-context.xml 파일에서 스프링 프레임워크에 다양한 설정을 하기 위해서는 STS 상에서 Namespaces(이하 네임스페이스) 탭을 이용해 사용 가능 XML 태그의 폭을 넓혀 줘야 합니다.(XML 네임스페이스는 간단히 말하면 XML 문서 내에 어떤 태그나 속성을 적을 수 있는지 명시해 주는 역할을 합니다. STS에서는 이를 이용해서 Ctrl+Spaces 등의 단축키로 필요한 태그나 속성을 추가할 수 있습니다.)
위의 화면에 다음과 같이 aop, context, jdbc, mybatis-spring(옵션) 네임 스페이스를 추가합니다.
l mysql과의 연결을 담당하는 datasource 설정하기
스프링과 mybatis를 같이 사용하는 경우에는 주로 스프링의 설정으로 jdbc 연결을 처리하는 경우가 많기 때문에 조금 전에 추가한 spring-jdbc 모듈의 클래스를 이용해서 root-context.xml에 다음과 같이 datasource라는 것을 추가합니다.
Datasource는 jdbc의 커넥션을 처리하는 기능을 가지고 있기 때문에 데이터베이스와 연동 작업에 반드시 필요합니다.
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/book_ex?userSSL=false"></property>
<property name="username" value="zerock"></property> <property name="password" value="zerock"></property>
</bean> |
설정에 보이는 class 속성의 값을 보면 ‘org.springframework.jdbc.xxx’로 시작하는 것을 볼 수 있습니다. 이 속성의 값에 해당하는 클래스가 존재해야 하기 때문에 이전 단계에서 spring-jdbc 모듈을 추가해준 것입니다.
l Datasource의 테스트 진행
스프링의 하나의 설정에 문제가 있다면 정상적으로 로딩이 되지 않기 때문에 최대한 빨리 변경된 설정에 대해서 테스트를 진행해야만 합니다. 스프링은 별도의 test 라이브러리를 활용해서 개발자가 손쉽게 테스트할 수 있는 방법을 제공합니다. 스프링의 경우에는 spring-test 모듈의 도움을 받으면 스프링은 was 상에서 동작시키지 않고도, 제대로 동작하는지를 확인해 볼 수 있습니다.
Src/test/java 폴더 내에 DataSourceTest.java 파일을 작성합니다.
package org.zerock.web;
import java.sql.Connection;
import javax.inject.Inject; import javax.sql.DataSource;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
// 현재 테스트 코드를 실행할 때 스프링이 로딩되도록 하는 코드 @RunWith(SpringJUnit4ClassRunner.class) //@ContextConfiguration의 locations 속성 경로에 xml 파일을 이용해서 스프링이 로딩됩니다. @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" }) public class DataSourceTest {
// 인스턴스 변수의 @Inject 애노테이션 처리된 DataSource는 스프링이 생성해서 주입해 주므로 객체 생성 안해도됨. @Inject private DataSource ds;
@Test public void testConection() { try (Connection con = ds.getConnection()) { System.out.println(con); } catch (Exception e) { e.printStackTrace(); }
}
}
|
스프링의 spring-test로 스프링의 동작을 확인할 수 있는 좋은 방법입니다. 특히 was의 실행이 매번 상당히 많은 시간이 드는 환경에서는 필수적이라고 할 수 있습니다.
위의 코드가 정상적으로 실행된다면 스프링이 로딩될 때의 로그들과 Connection 객체가 생성되었다는 것을 확인할 수 있습니다.
스프링 테스트가 정상적으로 실행되기 위해서 jUnit 버전은 4.11 이상을 사용하는 것이 좋습니다
'JAVA > spring' 카테고리의 다른 글
Spring Connection(DataSource) (0) | 2019.06.11 |
---|---|
Spring+mybatis (0) | 2019.06.05 |
spring + mybatis + mysql - 2 (0) | 2019.06.04 |
spring DB connect (0) | 2019.05.28 |
spring Start (1) | 2019.05.07 |
댓글