본문 바로가기
WebProgramming/SPRING

spring framework 정리 2

by Dogf 2019. 5. 8.
반응형

스프링 + MyBatis + Oracle의 설정

스프링을 이용한 개발 중 국내에서 가장 많이 쓰이는 형태는 MyBatis와의 연동 작업을 통해서 SQL 처리에 대한 개발 생산성을 높이는 형태로 사용되는 것입니다.

 

Presentation Layer - UI를 담당하는 구성 요소들이 들어갑니다. 웹인지 모바일 앱인지에 따라서 사용되는 기술이 변경됩니다. Presentation Layer의 경우는 JSP와 같은 뷰(View)를 구성하는 부분과 Controller라는 부분으로 분리되어서 작성됩니다.

 

Business Layer - 서비스 계층이라고도 하며, 고객의 요구사항을 반영하는 계층입니다. 사용자의 환경이 아닌 기능적인 요구사항을 구현한 곳입니다. 즉, 비즈니스 계층은 어떤 형태의 데이터가 필요하고, 반환될 것인지를 결정합니다. (Service)

 

Data Access Layer - 흔히 Persistense Layer라고 하기도 하는데, 데이터 처리를 전문적으로 담당합니다. Data Access Layer의 경우는 MyBatis가 추가됩니다. Data Access Layer를 구성하는 DAO(Data Access Object)의 경우 MyBatis를 호출하고 사용하는 구조로 만들어집니다.

 

스프링은 다양한 프레임워크와의 융합에 그 장점이 있습니다. 스프링을 중심으로 하고, 다양한 프레임워크를 융합해서 사용할 수 있기 때문에 다양한 기존 환경을 그대로 흡수할 수 있다는 장점도 있습니다.

 

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코드에서 분리시킬 수가 있습니다.

 

프로젝트 내에 src/main/webapp/WEB-INF/spring/root-context.xml 파일은 STS가 스프링 프로젝트를 생성할 때 만들어 주는 파일에서 가장 중요한 파일입니다.

 

이 파일은 스프링과 관련된 설정을 할 때, 쉽게 말해 웹 자원과 관련되지 않은 모든 자원의 설정을 위해서 존재합니다. (웹과 관련된 설정은 appServlet 폴더 내에 있는 servlet-context.xml 파일로 분리합니다.).

 

root-context.xml 파일에서 스프링 프레임워크에 다양한 설정을 하기 위해서는 STS상에서 Namespaces(이라 네임스페이스) 탭을 이용해 사용 가능한 XML 태그의 폭을 넓혀 줘야 합니다(XML 네임스페이스는 간단히 말하면 XML 문서 내에 어떤 태그나 속성을 적을 수 있는지 명시해 주는 역할을 합니다. STS에서는 이를 이용해서 Ctrl+Space 등의 단축키로 필요한 태그나 속성을 추가할 수 있습니다.).

 

<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="oracle.jdbc.driver.OracleDriver"></property>
	<property name="url" value="jdbc:oracle:thin:@localhost:orcl"></property>
	<property name="username" value="scott"></property>
	<property name="password" value="tiger"></property>
</bean>

설정에 보이는 class 속성의 값을 보면 'org.springframework.jdbc.xxx'로 시작하는 것을 볼 수 있습니다.

이 속성의 값에 해당하는 클래스가 존재해야 하기 때문에 이전 단 게에서 spring-jdbc 모듈을 추가해 준 것입니다.

MySQL과의 연결 설정에 사용된 정보를 보면 이전 장의 MySQL 연동 정보와 동일합니다.

id라는 속성은 스프링 내에서 특정한 객체(빈)를 찾기 위해서 사용하는 일종의 가명(alias)에 속합니다. 뒤에 이 속성의 값을 이용해서 다른 객체와 연결하는 모습을 볼 수 있습니다.(dataSource 값을 그대로 사용하는 것이 향후에 에러가 발생할 가능성이 적습니다.).

 

클래스 선언의 맨 위에 있는 @RunWith, @ContextConfiguration 애노테이션은 현재 테스트 코드를 실행할 때 스프링이 로딩되도록 하는 부분입니다.

 

@ContextConfiguration의 locations 속성 경로에 xml 파일을 이용해서 스프링이 로딩됩니다.

 

인스턴스 변수의 @Inject 애노테이션 처리된 DataSource는 스프링이 생성해서 주입해 주므로 개발자가 객체 생성 혹은 다른 작업을 하지 않아도 됩니다.

 

스프링의 spring-test 모듈은 위의 코드와 같이 간단한 애노테이션의 설정으로 실제 스프링의 동작을 확인할 수 있는 좋은 방법입니다. 특히 WAS의 실행이 매번 상당히 많은 시간이 드는 환경에서는 필수적이라고 할 수 있습니다.

 

MyBatis 연결

DataSource의 연결은 MyBatis의 설정과는 관계있으므로 먼저 설정하고 테스트해야 합니다. DataSource가 정삭적으로 설정된 이후의 작업은 MyBatis와 MySQL을 연동시키는 작업입니다.(스프링은 한 개의 설정이 잘못되는 경우 실행 자체에 문제가 생기므로 하나씩 설정하고 테스트하는 습관을 가져야만 합니다. MyBatis의 연결 설정 작업 역시 이전의 DataSource 연결 설정이 정상적으로 이루어진 후에 진행해야 합니다.).

 

SqlSessionFactory 객체 설정

MyBatis와 스프링 연동 작업에서의 핵심은 Connection을 생성하고, 처리하는 SqlSessionFactory의 존재입니다.

SqlSessionFactory는 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체입니다.

 

스프링을 이용할 때는 SqlSessionFactory를 생성해 주는 특별한 객체를 설정해 주는데 SqlSessionFactoryBean이라는 클래스를 사용합니다. SqlSessionFactoryBean은 프로젝트의 'root-context.xml'을 이용해서 다음과 같이 등록합니다.

 

<bean id ="sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<!-- MyBatis 설정 파일의 위치를 지정합니다. -->
	<property name="configLocation" value = "classpath:/mybatis-config.xml"></property>
	<!-- SQL 파일의 위치를 지정합니다. -->
	<property name="mapperLocations" value = "classpath:/mappers/**/*Mapper.xml"></property>
</bean>

추가된 객체(빈)의 class 속성 값을 보면 'org.mybatis.spring.xxx' 클래스입니다. 이 클래스는 MyBatis-Spring 모듈을 다운로드하아야만 사용할 수 있습니다.

 

mybatis-config.xml 파일을 추가

MyBatis는 SQL Mapping 프레임워크로 별도의 설정 파일을 가질 수 있습니다. 이를 이용하면 스프링의 설정과 별도로 사용하는 모든 MyBatis의 설정 기능을 활용할 수 있습니다. 지금 당장은 아니지만 나중을 위해서라도 MyBatis의 설정 파일을 하나 추가해 주는 것이 편리합니다.

 

만들어진 파일을 편하게 사용하기 위해서는 XML 파일의 DTD나 XML 스키마라는 것이 필요합니다. 'mybatis config dtd'라는 키워드로 인터넷을 검색하면 만들어진 파일의 상단에 들어갈 DTD라는 것을 알아낼 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
	<configuration>
	<typeAliases>

	</typeAliases>
	</configuration>

 

반응형

댓글