일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 홈텐딩에가니쉬는사치
- 칵테일
- 지거
- JAVA 강좌
- 조심한다고될일일까
- 자동차앞유리교체
- 홈텐딩
- 폴라로이드 수리
- 바스푼
- SX-70 수리
- 골드자동차유리
- 스크류드라이브
- 뭐든공부가필요해
- 술먹고멘붕
- 얼음집게
- 올리는게늦어지네
- Java
- 홈텐딩세트
- 칵테일이름은독특해
- Autowired
- 아이리쉬카밤
- 플로팅은어려워
- 사진잘찍고싶다
- 푸어러
- 어술취
- 말많은거보니취했네
- 셰이커
- 카메라를꺼내자
- 잔을사야하나
- 폴라존
- Today
- Total
초리의 블로그
Spring Mybatis 연동하기 본문
안녕하세요~ 이렇게 저의 블로그에 방문해 주셔서 감사합니다.
이 포스팅에선 Spring 프로젝트에 Mybatis를 연동하기를 해보겠습니다.
스프링 시작하기.(Hello World를 출력해 봅시다.) (http://chori84.tistory.com/32)에 이어서 시작을 할거에요.
사용하는 DB는 mysql이니 DB에 따라 Driver를 바꿔주시면 됩니다.
Java 클래스를 이용한 설정도 가능하지만,
여기서 저는 xml을 이용하여 설정 및 mapper를 이용하는 방법을 포스팅하겠습니다.
먼저, maven repository(https://mvnrepository.com)에서 Spring JDBC, mysql, mybatis 관련 dependency를 검색해서 pom.xml 파일에 추가할게요.
그리고 테스트를 위하여 spring test도 넣겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> | cs |
Controller 외에 Repository와 Service를 bean으로 등록하기 위해 전에 만들어 두었던 applicationContext-application.xml에 component-scan을 추가 했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.chori.springStudy"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" /> <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" /> </context:component-scan> </beans> | cs |
그리고 데이터베이스 접속을 설정을 위한 dataSource를 등록합니다.
저는 applicationContext-datasource.xml 를 만들어 추가했습니다.
추가적으로 datasource.properties를 만들어 database를 접속하는 개인적인 정보를 가려줬구요.
관련 내용은 util:properties를 이용한 프로퍼티 사용(http://chori84.tistory.com/18)을 참조해 주세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <util:properties id="datasourceProperties" location="classpath:datasource.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="#{datasourceProperties['mysql.url']}" /> <property name="username" value="#{datasourceProperties['mysql.userId']}" /> <property name="password" value="#{datasourceProperties['mysql.userPassword']}" /> </bean> </beans> | cs |
그 후에 애플리케이션 컨텍스트에 SqlSessionFactory를 추가해주고 sqlSession을 사용하기 위해 SqlSessionTemplate도 추가해줬습니다.
SqlSessionFactory 빈의 프로퍼티에 dataSource를 넣어주고, mybatis-config.xml와 Mapper.xml 파일들도 넣어주었습니다. (곧 만들거에요~)
이건 applicationContext-persistence.xml을 만들어 추가했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mapper/mybatis-config.xml" /> <property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> </beans> | cs |
mybatis-config.xml은 mybatis 설정 정보입니다.
1 2 3 4 5 6 7 | <?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> <typeAlias alias="user" type="com.chori.springStudy.user.domain.User"></typeAlias> </typeAliases> </configuration> | cs |
현재는 기본 셋팅을 사용하기 위해 다른 설정들은 하지 않았고, User 도메인만 user로 별칭을 줘서 mapper에서 패키지를 다 적을 필요 없이 user만으로 사용 가능합니다.
Mapper 파일에서 쿼리를 적어줍니다.
userMapper.xml 이에요.
mybatis-config.xml에서 별칭을 줬기 때문에 resultType을 그냥 user로 사용할 수 있어요.
1 2 3 4 5 6 7 8 9 10 | <?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="mapper.com.chori.springStudy.userMapper"> <select id="findAll" resultType="user"> SELECT name, company, computer from USER </select> </mapper> | cs |
지금까지 파일 구조는 아래 처럼 했어요.
이제 설정이 잘 되었는지 테스트 해봅시다!
User 테이블은 아래 처럼 되있구요. 데이터는 한 줄만 넣어놨어요.
User 도메인 클래스구요. (mybatis-config.xml에서 별칭을 준 클래스죠.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package com.chori.springStudy.user.domain; public class User { String name; String company; String computer; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } public String getComputer() { return computer; } public void setComputer(String computer) { this.computer = computer; } } | cs |
UserDao 클래스입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.chori.springStudy.user.dao; import com.chori.springStudy.user.domain.User; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.sql.DataSource; import java.util.List; @Repository public class UserDao { @Autowired SqlSession sqlSession; public List<User> findAll() { return sqlSession.selectList("mapper.com.chori.springStudy.userMapper.findAll"); } } | cs |
UserDaoTest 클래스를 만들어서 테스트를 해봅시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.chori.springStudy.user.dao; import com.chori.springStudy.user.domain.User; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({ "classpath:spring/applicationContext-*.xml" }) public class UserDaoTest { @Autowired UserDao userDao; @Test public void findAllTest() { List<User> userList = userDao.findAll(); assertThat(userList.size(), is(1)); userList.forEach(user -> { System.out.println(user.getName()); System.out.println(user.getCompany()); System.out.println(user.getComputer()); }); } } | cs |
테스트를 실행하면 테스트도 잘 통과했고, 조회된 결과도 잘 출력 되네요.
최종 파일 구조는 이렇게 만들었어요~
applicationContext를 저렇게 여러개 만들 수도 있지만 하나에 다 몰아 넣어도 상관 없어요.
다만, Java 개발을 할 때도 역할에 따라 class를 나누듯이 applicationContext 설정 파일도 역할에 따라 나눠 봤습니다.
참조