🔷 마이바티스-스프링 연동 모듈은 둘을 간편하게 연동하도록 도와준다.
mybatis-spring
연동 라이브러리가 필요💡 늘 그래왔듯이 jar 파일을 추가하거나 pom.xml을 통해 추가한다.
🖥 pom.xml
<!-- jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 커넥션 관리용 dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>
🔷 MyBatis 실행에 필요한 객체를 Spring Bean으로 등록하여 사용한다.
dataSource
(db 연결정보), sqlSessionFactory
❗ 실습에서는 dataSource 대신 Apache 재단에서 제공하는 커넥션 관리를 위한 dbcp2를 등록한다.
<!-- dataSource 가지고와서 빈으로 등록 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/bzeromo_board?serverTimezone=UTC"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="username" value="bzeromo"/>
<property name="password" value="1234"/>
</bean>
<!-- 공장을 세워 마이바티스를 사용하기 위해서 sqlSessionFactoryBean 을 등록 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 프로퍼티의 name은 Setter 이름, ref는 위에서 가지고온 dataSource를 가리킨다. -->
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mappers/*.xml"/>
<property name="typeAliasesPackage" value="com.bzeromo.board.model.dto"/>
</bean>
<!-- 마이바티스-스프링 에서 제공하는 scan을 통해서 dao 인터페이스 위치를 지정 -->
<mybatis-spring:scan base-package="com.bzeromo.board.model.dao"/>
🔷 DAO 작성
Mapper
인터페이스를 스프링 빈으로 직접 등록
Mapper scanner
를 사용하여 등록
💡 basePackage 에 설정된 패키지의 하위의 모든 매퍼 인터페이스가 자동으로 bean으로 등록된다.
❗ ssafy에서 제공한 데이터베이스와 코드 일부를 사용하였기 때문에 이곳에 모든 코드를 게시할 수는 없다...
👍 이전에 설정해놓은 Spring legacy 프로젝트에 어제 실습한
mybatis-config
설정들 및boardMapper
를 합친 상태에서 진행하였다. 즉,boardMapper.xml
은 지난번 실습 파일과 동일하다. 또한 Board와 BoardDao 역시 동일하다.
👍 웹 디자인을 위해
bootstrap
을 사용한다. common 파일에bootstrap.jsp
를 넣어두자.
🔷 bootstrap.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
crossorigin="anonymous">
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"
crossorigin="anonymous"></script>
🔷 com.bzeromo.board.controller.BoardController
package com.bzeromo.board.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 org.springframework.web.bind.annotation.PostMapping;
import com.bzeromo.board.model.dto.Board;
import com.bzeromo.board.model.service.BoardService;
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
// @RequestMapping(value = "/", method = RequestMethod.GET)
@GetMapping("/")
public String index() {
//현재로써는 index.jsp 가 없어서 (대문페이지) 바로 리스트로 요청을 다시 하게끔 돌려보냄.
return "redirect:list";
}
@GetMapping("list")
public String list(Model model) {
List<Board> list = boardService.getList();
model.addAttribute("list", list);
return "/board/list";
}
@GetMapping("detail")
public String detail(Model model, int id) {
Board board = boardService.getBoard(id);
model.addAttribute("board", board);
return "/board/detail";
}
@GetMapping("writeform")
public String writeform() {
return "/board/writeform";
}
@PostMapping("write")
public String write(Board board) {
boardService.writeBoard(board);
return "redirect:list";
}
@GetMapping("updateform")
public String updateform(Model model, int id) {
//id 게시글 가져와서 모델에 실어놓고 폼으로 보내야겠다.
model.addAttribute("board", boardService.getBoard(id));
return "/board/updateform";
}
@PostMapping("update")
public String update(Board board) {
System.out.println(board);
boardService.modifyBoard(board);
return "redirect:detail?id="+board.getId();
}
@GetMapping("delete")
public String delete(int id) {
boardService.removeBoard(id);
return "redirect:list";
}
}
🔷 com.bzeromo.board.model.service.BoardService
package com.ssafy.board.model.service;
import java.util.List;
import com.ssafy.board.model.dto.Board;
//사용자 친화적으로 작성
public interface BoardService {
// 게시글 전체 조회
List<Board> getList();
// 게시글 등록
void writeBoard(Board board);
// 게시글 상세 조회
Board getBoard(int id);
// 게시글 수정
void modifyBoard(Board board);
// 게시글 삭제
void removeBoard(int id);
}
🔷 com.bzeromo.board.model.service.BoardServiceImpl
package com.bzeromo.board.model.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bzeromo.board.model.dao.BoardDao;
import com.bzeromo.board.model.dto.Board;
@Service
public class BoardServiceImpl implements BoardService {
private BoardDao boardDao;
@Autowired
public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}
@Override
public List<Board> getList() {
System.out.println("모든 게시글을 가지고 왔습니다.");
return boardDao.selectAll();
}
@Override
public void writeBoard(Board board) {
System.out.println("게시글을 작성합니다.");
boardDao.insertBoard(board);
}
@Override
public Board getBoard(int id) {
System.out.println(id+"번 글을 읽었습니다.");
boardDao.updateViewCnt(id);
return boardDao.selectOne(id);
}
@Override
public void modifyBoard(Board board) {
boardDao.updateBoard(board);
}
@Override
public void removeBoard(int id) {
System.out.println(id+"번 글을 삭제 했습니다.");
boardDao.deleteBoard(id);
}
}
❗ controller -> service -> dao 의 순서를 항상 기억해라!
❗ 뷰와 관련된 jsp 코드들은 생략한다. 이전의 스프링 프로젝트에서 부트스트랩만 적용한 코드이다.
🖨 결과물
붉은색 마크는 조회수를 의미한다.
수정을 할 때 조회수가 올라가버린다. 이는 수정해야할듯.
삭제도 되고
게시글 등록도 된다.
익숙해질 때까지 쳐다보고 마이그레이션해보기!