- Develop OS : Windows10 Ent, 64bit - WEB/WAS Server : Tomcat v9.0 - DBMS : MySQL 5.7.29 for Linux (Docker) - Language : JAVA 1.8 (JDK 1.8) - Framwork : Spring 3.1.1 Release - Build Tool : Maven 3.6.3 - ORM : Mybatis 3.2.8 |
[ Mybatis ]
- 자바에서 제공하는 JDBC를 보다 편리하게 사용할 수 있도록 해주는 프레임워크
- SQL 쿼리문을 코드 내에서 쓰지 않고 Mapper 파일에서 관리함으로써 코드와 SQL 쿼리를 분리
- SQL 쿼리 수정 시 코드를 직접 수정하지 않아도 돼 유지보수 시 안정성을 높임
- 코드를 간소화하여 가시성을 높여줌
간단히 자바와 스프링에서 DB를 다루는 JDBC를 좀 더 편하고 깔끔하게 다루기 위한 DB 연동 프레임워크 또는 라이브러리라고 보면 될 것 같습니다. 특히 스프링에서는 Mybatis를 사용하기 위한 모듈을 제공하므로 더욱 편하게 사용할 수 있습니다. DAO를 대신할 mapper를 만들 때 매우 편리합니다.
스프링 MVC의 동작 구조를 알면 좀 더 이해가 쉬울 것 같습니다.
[Spring MVC/- 기본 상식] - 스프링(Spring) MVC 동작 구조 및 스프링 컨테이너
1. 메이븐 "pom.xml"에 DB연동에 필요한 라이브러리 의존 설정 추가
- MySQL Connector
- Mybatis
- Mybatis-spring (스프링에서 Mybatis 연동을 위한 모듈)
- spring-jdbc (기본 자바 JDBC가 아닌 스프링의 JDBC)
- common-dbcp2 (톰캣에서 커넥션풀을 이용할 수 있도록 아파치에서 제공해주는 라이브러리)
- spring-test (스프링에 Mybatis가 정상적으로 연동되었는지 확인 용도)
MySQL 커넥터 버전은 아래 링크에서 찾으면 됩니다. DB 버전과 동일하게 맞춰주면 좋은데 저같은 경우는 5.7버전이 없어 그냥 5.1.39 버전으로 맞추니 잘 돌아가네요.
https://mvnrepository.com/artifact/mysql/mysql-connector-java
<!-- Mysql Connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- Mybatis-Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- Spring-JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- common-dbcp -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- Spring Test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
저는 새 프로젝트라 spring-test와 junit을 사용하지 않고 그냥 컨트롤러에서 테스트 했습니다. junit도 사용법이 어렵지 않고, 어차피 프로젝트가 커지다보면 쓸 일이 많으니 아래 링크를 참조해서 한 번 해보시는 것도 좋을 것 같습니다.
[Spring MVC/- 개발 TIP] - jUnit, Spring-Test 라이브러리 사용법
2. 루트 컨테이너에 "BasicDataSource" 클래스의 빈(Bean) 객체 의존 설정 (커넥션풀 사용)
스프링 MVC 구조에서 다뤘듯이 root-context.xml 파일을 참조해 생성되는(다른 xml 파일을 param으로 추가할 수도 있음) 루트 컨테이너는 웹과 관련 없는 자원을 빈(Bean)으로 관리해주는 용도로 주로 사용됩니다. DB 또한 웹과 관련이 없는 자원이므로 루트 컨테이너에 자원을 생성해 관리합니다. 물론 다른 컨테이너를 이용해도 되지만 루트 컨테이너 사용이 일반적입니다.
BasicDataSource 클래스는 아파치에서 제공해주는 클래스로 커넥션풀을 사용할 수 있도록 해줍니다. 스프링에서 제공해주는 DataSource 클래스보다 커넥션풀을 사용하는 것이 나을 수 있습니다. 라이브러리는 아래 링크에서 찾으면 됩니다.
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2
일단 DB와 연결작업을 담당할 객체를 루트 컨테이너에 생성하도록 합니다. 이렇게 해두면 어플리케이션 내 딱 하나(싱글톤)의 DataSource 객체만 빈(Bean)으로 생성되어 사용됨으로써 DB작업 시 계속 새로운 객체를 생성하지 않아도 됩니다. 이는 생명주기가 어플리케이션과 동일하게 맞춰진 다른 컨테이너를 사용해도 마찬가지입니다.
* root-context.xml 파일에 의존 설정 (Bean 등록)
먼저 NameSpaces 탭에서 아래와 같이 필요한 부분들을 체크해줍니다. xml 파일을 'Spring configure Editor'로 열어야 탭이 보입니다.
- 추가로 체크할 곳 : jdbc, mybatis
그리고 DataSource 클래스를 빈(Bean) 객체로 등록해줍니다. Property로 전달할 매개변수 값도 넣어줍니다.
DriverClassName의 값으로 넣어주는 "mysql.jdbc" 라이브러리는 "pom.xml"에서 의존설정 해줬으므로 자동으로 받아줍니다. 메이븐 사용 전에는 직접 파일을 받아서 넣어줘야 했었는데 메이븐은 역시 짱입니다. 혹시 테스트하다 빈생성 실패와 같은 예외가 발생하면 해당 클래스가 실제로 잘 있는지 확인해봐야 합니다.
그리고 url의 값과 접속 계정 또한 자신의 환경에 맞게 설정해줘야 합니다. DB서버의 IP와 포트, 그리고 접속할 데이터베이스 이름을 기입해주고 계정 정보를 넣어줍니다. 그냥 복사해서 그대로 쓰면 안됩니다.
나중에 실제 사용할 때는 프로퍼티 파일을 이용해서 연결 정보를 저장한 뒤, xml에서 가져다 쓰는 방식으로도 사용하면 좋습니다. 프로퍼티 파일 사용법을 참조하시면 됩니다.
[Spring MVC/- 기본 문법] - 스프링에서 외부 환경 변수 정보 읽어오기 (Properties 파일)
<!-- 커넥션풀 DataSource 객체 -->
<bean id="dataSource"
class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hsdb?characterEncoding=UTF-8" />
<property name="username" value="codevang" />
<property name="password" value="codevang1!" />
<property name="initialSize" value="0"/>
<property name="minIdle" value="0"/>
<property name="maxIdle" value="10"/>
<property name="maxTotal" value="10"/>
<property name="maxWaitMillis" value="1000"/>
</bean>
password 아래의 프로퍼티 속성은 커넥션풀의 기본 설정들입니다. 생략하면 디폴트 값이 적용됩니다. 아래 커넥션풀에 대한 링크를 참조하시면 됩니다.
[JSP & Servlet/- 기본 문법] - JDBC를 이용한 DB작업_커넥션풀(Connection Pool) [3/3]
그리고 'url' 에는 뒤에 꼭 인코딩 타입을 지정해줍니다. web.xml 등에서 설정한 인코딩 타입은 클라이언트와 통신하는 부분에 대한 인코딩입니다. 이와는 별개로 어플리케이션과 DB가 통신하는 부분이기 때문에 커넥션을 관리하는 Datasource 객체에 인코딩 타입을 알려줘야 합니다.
3. 루트 컨테이너에 생성된 DataSource 빈(Bean) 객체 작동 테스트
이제 실제 DB 커넥션이 잘 이루어지는지 테스트를 해봅니다. junit을 이용해서 테스해볼 수 있겠지만 DB 연결을 처음 하는 상황이면 어차피 거의 코드가 없는 상태일테니 그냥 컨트롤러에서 커넥션 객체를 만들어서 잘 만들어지는지 확인해보겠습니다. 예외가 발생하지 않고 커넥션 객체가 잘 생성됐다면 정상적으로 DB에 연결된 것입니다.
@Inject 어노테이션을 사용하면 루트 컨테이너에서 생성된 빈(Bean)을 자동으로 주입받을 수 있습니다. 또는 스프링에서 지원해주는 @Autowired를 사용해도 됩니다. 아래 링크를 참조하시면 됩니다.
[Spring MVC/- 기본 문법] - @Resource, @Inject, @Autowired 사용 (자동 의존성 주입)
주입받는 DataSource 객체에서 실제 DB 커넥션 객체를 생성합니다. 서블릿에서 DB를 다뤄보신 분들은 쉽게 이해하실 것 같습니다.
package com.hsweb.springweb;
import javax.inject.Inject;
import javax.sql.DataSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
@Controller
@RequestMapping(value = "/board")
public class HomeController {
// 루트컨테이너에서 빈(Bean)을 받아와서 자동으로 넣어줌
@Inject
private DataSource dataSource;
// "/list" URI에 대한 요청 처리
@RequestMapping(value = "/list")
public String home2(@ModelAttribute Test test) {
try {
Connection conn = (Connection) dataSource.getConnection();
System.out.println("성공 : " + conn);
} catch (Exception ex){
System.out.println("실패..!");
ex.printStackTrace();
}
return "/board/list";
}
}
4. Mybatis 설정
이제 Mybatis를 사용할 수 있게 설정할 차례입니다. Mybatis는 위에서 생성한 DataSource 객체를 가지고 가서 알아서 DB 연결을 해놓고 개발자가 편하게 DB 작업을 할 수 있도록 해줍니다.
먼저 환경설정 정보를 담을 설정 파일과, SQL 쿼리문을 관리할 매퍼 파일을 만들어줍니다.
4-1. src/main/resources 폴더 내에 mapper 파일 생성하기
쉽게 Mybatis 매핑 파일을 만들고 싶다면 이클립스에서 Mybatis 플러그인을 설치해주면 됩니다. "Help - Eclipse MarketPlace"에 들어가서 "Mybatis"를 검색해 아래 플러그인을 설치하면 됩니다. 그럼 이클립스 우클릭으로 파일 생성할 때 Mybatis 설정 파일 템플릿이 생깁니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.mybatisConfig">
</mapper>
4-2. src/main/resources 폴더 내에 환경설정 파일 생성하기
일단 껍데기만 만들어둡니다. 아래 코드로 xml 파일을 생성하면 됩니다.
<?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>
</configuration>
4-3. 루트 컨테이너에 SqlSessionFactoryBean 클래스 빈(Bean) 등록
그리고 Mybatis를 사용할 수 있게 해주는 SqlSessionFactoryBean 클래스를 루트 컨테이너에 빈(Bean) 객체로 등록해줍니다. 등록할 때 프로퍼티로 위에서 생성한 DataSource 빈(Bean)과 위에서 만든 매핑 설정 파일 위치를 넣어주면 이 객체가 생성될 때 스프링에서 DB 작업을 편하게 할 수 있도록 제반 준비를 자동으로 해줍니다.
추가로 "sqlSessionTemplate"이라는 클래스도 있는데, "sqlSessionFactory" 객체를 가져가서 동기화 처리 등 추가 기능을 제공하는 클래스입니다. 이 객체도 같이 만들어줍니다. 자세한 사용법은 다음 글에서 정리하겠습니다.
<!-- 스프링 DataSource 객체 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hsdb" />
<property name="username" value="codevang" />
<property name="password" value="codevang1!" />
</bean>
<!-- sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis/mybatisConfig.xml" />
<property name="mapperLocations" value="classpath:/mybatis/mybatisMapper.xml" />
</bean>
<!-- SqlSessionTemplate -->
<bean id="sqlSessoinTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
5. Mybatis 최종 테스트
위에서 사용한 코드를 약간 바꿔서 Mabatis의 SqlSessionFactory 객체가 정상적으로 DB 세션을 만들 수 있는지 확인해봅니다. 자세한 사용법은 다음글에서 이어가도록 하겠습니다.
package com.hsweb.springweb;
import javax.inject.Inject;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
@Controller
@RequestMapping(value = "/board")
public class HomeController {
// 루트컨테이너에서 빈(Bean)을 받아와서 자동으로 넣어줌
@Inject
private SqlSessionFactory sqlFactory;
// "/list" URI에 대한 요청 처리
@RequestMapping(value = "/list")
public String home2(@ModelAttribute Test test) {
try {
SqlSession session = sqlFactory.openSession();
System.out.println("성공 : " + session);
} catch (Exception ex){
System.out.println("실패..!");
ex.printStackTrace();
}
return "/board/list";
}
}
'▸Spring MVC > 기본 문법' 카테고리의 다른 글
스프링, Mybatis, MySQL_사용법(Mapper 인터페이스) [3/5] (0) | 2020.03.22 |
---|---|
스프링, Mybatis, MySQL_사용법 [2/5] (0) | 2020.03.22 |
스프링 Restful 서비스(API)_API 구현(XML) [3/3] (0) | 2020.03.21 |
스프링 Restful 서비스(API)_API 구현(JSON) [2/3] (0) | 2020.03.20 |
스프링 Restful 서비스(API)_기본 개념 [1/3] (0) | 2020.03.20 |
댓글