Programming/Spring

[Spring Boot] MVC 기반 MyBatis 적용

Isaac S. Lee 2023. 12. 22. 10:39

🌿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 &lt;= 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 &lt;= 10
	</select>

</mapper>