[Spring] MyBatis (2)

young-gue Park·2023년 10월 17일
0

Spring

목록 보기
7/14
post-thumbnail

⚡ MyBatis (2)


📌 Spring - MyBatis

🔷 마이바티스-스프링 연동 모듈은 둘을 간편하게 연동하도록 도와준다.

  • 해당 모듈은 마이바티스로 하여금 스프링 트랜잭션에 쉽게 연동되도록 처리한다.
  • 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으로 등록된다.

📌 실전 board Web 프로젝트

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 코드들은 생략한다. 이전의 스프링 프로젝트에서 부트스트랩만 적용한 코드이다.

🖨 결과물

붉은색 마크는 조회수를 의미한다.

수정을 할 때 조회수가 올라가버린다. 이는 수정해야할듯.

삭제도 되고

게시글 등록도 된다.


익숙해질 때까지 쳐다보고 마이그레이션해보기!

profile
Hodie mihi, Cras tibi

0개의 댓글