🌿MVC 기반 MyBatis 적용
- XML 방식
- 인터페이스 방식
🌿XML 방식: 프로젝트 설정
1. 의존성
- Spring Boot DevTools
- Lombok
- MyBatis Framework
- Oracle Driver (ojdbc)
- Spring Web
Oracle Driver가 ojdbc이다. JDBC이기 때문에 Oracle Driver를 추가했고, MyBatis Framework도 추가해 주었다.
2. JSP 설정
<!-- JSP -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
pom.xml에 의존성을 4개 추가해 주었다.
3. application.properties
# 서버 포트
server.port=8090
# JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# JDBC + MyBatis
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=hr
spring.datasource.password=java1234
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=2000000
spring.datasource.hikari.connection-timeout=30000
mybatis.mapper-locations=classpath:/mapper/*.xml
서버 포트 번호를 변경하고, JSP 설정을 해 주었다.
추가적으로 Oracle(JDBC)와 MyBatis 설정을 하도록 한다. 또한, HikariCP를 계속 사용한다.
spring.datasource.hikari.maximum-pool-size=20은 내부적으로 커넥션 객체를 20개까지 만들어서 관리하겠다는 의미이다.
spring.datasource.hikari.idle-timeout=30000는 접속이 없을 때 언제까지 커넥션을 보관해 놓을지를 의미한다.
현재 작성해 놓은 게 기본값으로, 이미 적용이 되어 있는 상태이기 때문에 주석 처리를 해도 상관없다.
이처럼 Spring Boot를 사용하는 것에 차이가 있긴 하지만, 근본적으로 설정하는 것은 바뀌지 않는다.
4. XML 매퍼 생성
src/main/resources > mapper 폴더 생성
- test.xml
Spring Boot에서 사용하는 mapper는 기존에 사용하면 mapper와 완전히 동일하다.
5. 파일 추가
com.test.mybatis1.controller
- TestController.java
com.test.mybatis1.persist
- TestDAO.java (C)
com.test.mybatis1.domain
- TestDTO.java
src > main > "webapp" > "WEB-INF" > "views"
- test.jsp
🌿전체 코드
TestController.java
package com.test.mybatis1.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.test.mybatis1.domain.TestDTO;
import com.test.mybatis1.persist.TestDAO;
@Controller
public class TestController {
@Autowired
private TestDAO dao;
@GetMapping(value="/test.do")
public String test(Model model) {
List<TestDTO> list = dao.list();
model.addAttribute("list", list);
return "test";
}
}
TestDAO.java (C)
package com.test.mybatis1.persist;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.test.mybatis1.domain.TestDTO;
@Repository
public class TestDAO {
@Autowired
private SqlSessionTemplate template;
public List<TestDTO> list() {
return template.selectList("test.list");
}
}
TestDTO.java
package com.test.mybatis1.domain;
import lombok.Data;
@Data
public class TestDTO {
private String seq;
private String title;
private String author;
private String discount;
private String publisher;
}
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Book</h1>
<ul>
<c:forEach items="${list}" var="dto">
<li>${dto.title} - ${dto.discount} - ${dto.author} - ${dto.publisher}</li>
</c:forEach>
</ul>
</body>
</html>
test.xml
<?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="test">
<select id="list" resultType="TestDTO">
select * from tblBook where rownum <= 10
</select>
</mapper>
🌿인터페이스 방식: 프로젝트 설정
1.의존성
2. JSP 설정
<!-- JSP -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
pom.xml에 의존성을 4개 추가해 주었다.
3. application.properties
# 서버 포트
server.port=8090
# JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# JDBC + MyBatis
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=hr
spring.datasource.password=java1234
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=2000000
spring.datasource.hikari.connection-timeout=30000
# mybatis.mapper-locations=classpath:/mapper/*.xml
mybatis.type-aliases-package=com.test.mybatis2.domain
이전의 설정에서 mybatis.mapper-locations를 삭제해 주었다.
4. XML 매퍼 생성
src/main/resources > com > test > mybatis2 > mapper 폴더 생성
- test.xml
5. 파일 추가
com.test.mybatis2.controller
- TestController.java
com.test.mybatis2.persist
- TestDAO.java (C)
com.test.mybatis2.mapper
- TestMapper.java (I)
com.test.mybatis2.domain
- TestDTO.java
src > main > "webapp" > "WEB-INF" > "views"
- test.jsp
🌿전체 코드
package com.test.mybatis2;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//패키지 스캔 작업 > 메인 클래스
@SpringBootApplication
//@ComponentScan(basePackages = ["com.test.controller"])
@MapperScan(basePackages = "com.test.mybatis2.mapper")
public class Mybatis2Application {
public static void main(String[] args) {
SpringApplication.run(Mybatis2Application.class, args);
}
}
메인 클래스에서 MyBatis 스캔 작업을 해 주었다.
TestController.java
package com.test.mybatis2.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import com.test.mybatis2.domain.TestDTO;
import com.test.mybatis2.persist.TestDAO;
@Controller
public class TestController {
@Autowired
private TestDAO dao;
@GetMapping(value="/test.do")
public String test() {
List<TestDTO> list = dao.list();
return "test";
}
}
TestDAO.java (C)
package com.test.mybatis2.persist;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.test.mybatis2.domain.TestDTO;
import com.test.mybatis2.mapper.TestMapper;
@Repository
public class TestDAO {
//기존 방식 > SqlSessionTemplate
//현재 방식 > InterfaceMapper
@Autowired
private TestMapper mapper;
public List<TestDTO> list() {
return mapper.list();
}
}
TestMapper.java (I)
package com.test.mybatis2.mapper;
import java.util.List;
import com.test.mybatis2.domain.TestDTO;
public interface TestMapper {
List<TestDTO> list();
}
TestDTO.java
package com.test.mybatis2.domain;
import lombok.Data;
@Data
public class TestDTO {
private String seq;
private String title;
private String author;
private String discount;
private String publisher;
}
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Book</h1>
<ul>
<c:forEach items="${list}" var="dto">
<li>${dto.title} - ${dto.discount} - ${dto.author} - ${dto.publisher}</li>
</c:forEach>
</ul>
</body>
</html>
test.xml
<?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="test">
<select id="list" resultType="TestDTO">
select * from tblBook where rownum <= 10
</select>
</mapper>