이전에 Spring에서 제공하는 데이터베이스 관리 객체인 JdbcTemplate에 대해 다룬 적이 있다.
이번 포스팅에서 다룰 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에 넣을 수 있는 값 정리
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] Spring Security(4) - 로그인 실패 커스터마이징 (5) | 2021.02.02 |
---|---|
[Spring] Spring Security(3) - DB연동 (0) | 2021.02.01 |
[Spring] Spring Security(2) - 로그인 페이지 구현 (0) | 2021.01.20 |
[Spring] Spring Security(1) - 기본 사용법 (0) | 2021.01.19 |
[Spring] JDBC 트랜잭션 (0) | 2021.01.14 |
댓글