본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] Mybatis

by 김코더 김주역 2021. 1. 26.
반응형

이전에 Spring에서 제공하는 데이터베이스 관리 객체인 JdbcTemplate에 대해 다룬 적이 있다.

kimcoder.tistory.com/241

 

[Spring] JdbcTemplate

JdbcTemplate는 DriverManager에 드라이버를 로드하고, Connection, Statement, ResultSet 관련 작업, 자원 해제 작업을모두 담당 해주기 때문에 상당한 소스코드를 줄일 수 있게 된다. 이제 Spring JdbcTemplate..

kimcoder.tistory.com

 

 

이번 포스팅에서 다룰 Mybatis는 JDBC API 호출 없이도 데이터베이스를 관리할 수 있으며, JdbcTemplate보다 간단하다. 필자도 개인적으로 JdbcTemplate보다는 Mybatis를 선호한다.

 

이제 사용법을 소스코드와 함께 설명할 것인데 꽤 간단하기 때문에 쉽게 따라올 수 있을 것이다.

 

아래 사진은 프로젝트 구성인데, 쿼리 설정 파일인 Dao.xml이 이번 포스팅의 핵심 파일이다.

 

 

1. Dependency 추가

pom.xml에 mybatis, mybatis-spring 두 라이브러리를 추가해준다.

<dependencies>  
  ...
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.1.1</version>
  </dependency>
  
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.2</version>
  </dependency>
</dependencies>

 

 

 

2. 설정 파일에 bean 생성

<servlet-context.xml>

- "sqlSessionFactory" bean : SqlSession bean을 생성해주는 팩토리 빈이다. mapperLocations 프로퍼티에는 com.example.demo.mapper 패키지에 있는 모든 xml 파일을 mapper으로 지정해주었는데, 이 xml 파일들이 쿼리 설정 파일이다. 쿼리 설정 파일은 잠시 후에 다루기로 한다.

- "sqlSession" bean : 바로 위에 생성한 "sqlSessionFactory" bean을 참조하도록 했다. 하나만 참조할 경우 index 속성은 생략 가능하다.

<beans:beans ...
  ...
  <beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <beans:property name="username" value="DB아이디"/>
    <beans:property name="password" value="DB비밀번호"/>
  </beans:bean>

  <beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="mapperLocations" value="classpath:com/example/demo/mapper/*.xml"/>
  </beans:bean>

  <beans:bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <beans:constructor-arg index="0" ref="sqlSessionFactory"/>
  </beans:bean>
  
  <context:component-scan base-package="com.example.demo" />
  
</beans:beans>

 

 

 

3. 쿼리 설정파일 연동

<Dao.java>

com.example.demo 패키지에 속하며, 인터페이스로 생성해야 Mybatis를 사용하는 의미가 있다.

인터페이스에 선언한 메소드들을 쿼리 설정 파일과 연동할 수 있다.

package com.example.demo;

import java.util.ArrayList;

public interface Dao {
	public ArrayList<User> list();
	public void signup(String id, String password);
}

 

 

<User.java>

DTO 클래스이다.

package com.example.demo;

public class User {
	private String id;
	private String pw;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
}

 

 

<Dao.xml>

com.example.demo.mapper 패키지에 있는 쿼리 설정 파일이다.

2~4줄은 문서에 DTD설정을 해준 부분인데, 반드시 버전에 맞추어야 한다.

이 프로젝트는 3.1.1 버전이기 때문에 3.1로 작성했다.

mapper의 namespace에 Dao Interface 경로를 지정해주고, mapper안에 적절한 SQL문법 태그(select, insert, update, delete)로 Dao Interface에서 선언한 메소드와 연동시켜주면 되는 것이다. 반드시 Dao Interface에서 선언한 메소드명과 SQL문법 태그의 id를 일치 시켜야 하며, 반환 값이 있다면 resultType을 추가로 설정해준다. resultType에 넣을 수 있는 값들을 잘 정리해둔 포스팅 링크를 본문 아래에 첨부할 것이다.

SQL의 parameter은 Dao Interface에서 선언한 해당 메소드의 매개 변수 순서대로 "param" 뒤에 번호순을 붙여 적용하면 된다. 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Config 3.1//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="com.example.demo.Dao">
	<select id="list" resultType="com.example.demo.User">
		SELECT * FROM MEMBER
	</select>
	
	<insert id="signup">
		INSERT INTO MEMBER (ID, PW) VALUES (#{param1}, #{param2})
	</insert>
	
</mapper>

※ 상세한 Mybatis 쿼리 설정파일 작성 방법은 https://goodteacher.tistory.com/249를 참고하면 도움이 될 것이다.★

 

 

 

4. Controller 작성

<HomeController.java>

@Autowired 어노테이션을 이용하여 servlet-context.xml에서 생성한 SqlSession bean을 가져와서, 이 SqlSession 객체의 getMapper메소드를 이용하여 쿼리 설정 파일과 완전히 연동된 Dao 객체를 가져오면 된다.

list 메소드에서는 dao.list()의 반환 값을 받아서 "users" 이라는 속성명으로 list.jsp로 전달할 것이다.

package com.example.demo;

import javax.servlet.http.HttpServletRequest;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	@Autowired
	private SqlSession sqlSession;
	
	@RequestMapping("/list")
	public String list(Model model) {
		Dao dao = sqlSession.getMapper(Dao.class);
		model.addAttribute("users", dao.list());
		return "list";
	}
	
	@RequestMapping("/sign_up")
	public String sign_up(Model model) {
		return "sign_up";
	}
	
	@RequestMapping("/sign_up_DB")
	public String sign_up_DB(HttpServletRequest request, Model model) {
		Dao dao = sqlSession.getMapper(Dao.class);
		dao.signup(request.getParameter("id"), request.getParameter("password"));
		return "redirect:list";
	}
}

 

 

 

5. View

<home.jsp>

메인 페이지이나, 이번 포스팅에서는 의미가 없다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1> HOME! </h1>
</body>
</html>

 

<sign_up.jsp>

데이터베이스에 추가할 계정 정보를 입력한다. form은 HomeController의 /sign_up_DB로 매핑되어 전달된다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>SIGN UP</h1>
	<form action="sign_up_DB" method="post">
		<p>ID : <input type="text" name="id"><br></p>
		<p>PASSWORD : <input type="password" name="password"><br></p>
		<input type="submit" value="SIGN UP">
	</form>
</body>
</html>

 

<list.jsp>

유저 계정 리스트를 전송받아 출력한다.

<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1> USERS </h1>
	<c:forEach items="${users}" var="user" varStatus="status">
		<strong> ${status.count}. id : ${user.id}, pw : ${user.pw} </strong><br>
	</c:forEach>
</body>
</html>

 

 

 

6. 실행

ID, PASSWORD 입력

 

 

정상적으로 데이터가 추가 되었음을 확인

 

 

 

 

(타블로그) resultType에 넣을 수 있는 값 정리

java119.tistory.com/45

 

[MyBatis] resultType에 넣을 수 있는 값 정리

resultType 문법 예시 쿼리 내용... 쿼리 내용... 쿼리 내용... 별칭(alias) 데이터 형태(data type) string String date Date map Map hashmap HashMap list List arraylist ArrayList decimal BigDecimal bigdec..

java119.tistory.com

 

 

반응형

댓글