today_is

[ spring ] mybatis mapper 이용 본문

spring

[ spring ] mybatis mapper 이용

ye_rang 2023. 12. 28. 14:57

오늘의 목표

 

jsp 프로젝트에서 많은 실습을 해봤던 게시판 기능을

이번에는 spring 프로젝트로도 구현해보자 !

 


 

BoardDTO  

IDX NOT NULL NUMBER
TITLE NOT NULL VARCHAR2(500)
WRITER   VARCHAR2(100)
CONTENT NOT NULL VARCHAR2(4000)
WRITEDATE   DATE
ISNOTICE   CHAR(1)

 

 

 

 

 

BoardController

유의할 점

[ 게시글을 삭제할 수 있는 조건 ]

1) 로그인이 되어있는 상태일 때     2) 내가 작성한 게시글일 때

 

 

 

[ 추가 코드 ]

컨트롤러에 들어오는 요청을 가로채서 특정 작업(예를 들어 로그인 여부 파악)을 수행하고
기존 경로로 계속 안내하거나, 처리를 중단하고 새로운 응답을 반환하는 스프링 빈이 필요하다

 

 

로그인이 되어있지 않다면 

-> if(session.getAttribute("login") == null) {

 

로그인 페이지로 redirect
-> return "redirect:/member/login"; }

 

package com.itbank.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 org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.itbank.model.BoardDTO;
import com.itbank.service.BoardService;

@Controller
@RequestMapping("/board")
public class BoardController {
	
	@Autowired private BoardService boardService;

	@GetMapping("/list")
	public ModelAndView list() {
		ModelAndView mav = new ModelAndView();
		List<BoardDTO> list = boardService.getBoardList();
		mav.addObject("list", list);
		return mav;
	}
	
	@GetMapping("/view/{idx}")
	public ModelAndView view(@PathVariable("idx") int idx) {
		ModelAndView mav = new ModelAndView("/board/view");
		BoardDTO dto = boardService.getBoard(idx);
		mav.addObject("dto", dto);
		return mav;
	}
	
	@GetMapping("/write")
	public void write() {}
	
	@PostMapping("/write")
	public String write(BoardDTO dto) {
		int row = boardService.write(dto);
		System.out.println(row != 0 ? "작성 성공" : "작성 실패");
		return "redirect:/board/list";
	}
	
	@GetMapping("/delete/{idx}")
	public ModelAndView delete(@PathVariable("idx") int idx) {
		// if(session.getAttribute("login") == null) {
		//		return "redirect:/member/login";
		// }
		// 컨트롤러에 들어오는 요청을 가로채서 특정 작업(예를 들어 로그인 여부 파악)을 수행하고
		// 기존 경로로 계속 안내하거나, 처리를 중단하고 새로운 응답을 반환하는 스프링 빈이 필요하다
		
		ModelAndView mav = new ModelAndView("alert");
		int row = boardService.delete(idx);
		String url = "/board/list";
		String msg = row != 0 ? "삭제 성공" : "삭제 실패";
		mav.addObject("url", url);
		mav.addObject("msg", msg);
		return mav;
	}
}

 

 

BoardService

package com.itbank.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.itbank.model.BoardDTO;
import com.itbank.repository.BoardDAO;

@Service
public class BoardService {

	@Autowired private BoardDAO dao;
	
	public List<BoardDTO> getBoardList() {
		return dao.selectList();
	}

	public BoardDTO getBoard(int idx) {
		return dao.selectOne(idx);
	}

	public int write(BoardDTO dto) {
		return dao.insert(dto);
	}

	public int delete(int idx) {
		return dao.delete(idx);
	}

}

 

 

BoardDAO

package com.itbank.repository;

import java.util.List;

import com.itbank.model.BoardDTO;

public interface BoardDAO {

	List<BoardDTO> selectList();

	BoardDTO selectOne(int idx);

	int insert(BoardDTO dto);

	int delete(int idx);

}

 

 

 


 Mybatis 사용하기 

 

root-context.xml

: board-mapper.xml 등록해두기

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.100:1521:xe" />
		<property name="username" value="c##itbank" />
		<property name="password" value="it" />
	</bean>
	
	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikariConfig" />
	</bean>
	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis/config.xml" />
		<property name="mapperLocations">
			<list>
				<value>classpath:mybatis/board-mapper.xml</value>
			</list>
		</property>
	</bean>
	
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory" />
	</bean>
	
	<context:component-scan base-package="com.itbank.service" />
	<context:component-scan base-package="com.itbank.component" />
	
	<mybatis-spring:scan base-package="com.itbank.repository" />
	<!-- 지정한 패키지에서 인터페이스 형태의 DAO를 스캔한다 -->
		
</beans>

 

 

config.xml

: board-mapper 를 편리하게 이용하기 위해서 alias 등록

alias 는 별칭을 의미한다

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC 
	"-//mybatis.org//DTD Config 3.0//EN" 
	"https://mybatis.org/dtd/mybatis-3-config.dtd">
	
<configuration>
	<typeAliases>
		<typeAlias type="com.itbank.model.BoardDTO" alias="board" />
	</typeAliases>
</configuration>

 

 

board-mapper.xml

: BoardDAO 에서 사용된 sql문

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC 
	"-//mybatis.org//DTD Mapper 3.0//EN" 
	"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
	
<mapper namespace="com.itbank.repository.BoardDAO">
	
	<select id="selectList" resultType="board">
		select * from board3 
			order by isNotice desc, idx desc
	</select>
	
	<select id="selectOne" resultType="board" parameterType="int">
		select * from board3
			where
				idx = #{idx}
	</select>
	
	<insert id="insert" parameterType="board">
		insert into board3 (title, writer, content, isNotice)
			values 
				(#{title}, #{writer}, #{content}, #{isNotice})
	</insert>
	
	<delete id="delete" parameterType="int">
		delete board3 where idx = #{idx}
	</delete>
	
</mapper>

 

 

 

write.jsp

 

[ 공지등록은 관리자만 가능하도록 한다 ]

 

현재 로그인된 계정의 userid 가 admin 일때

->   <c:if test="${login.userid == 'admin' }">

 

해당 게시글을 공지로 등록할 수 있도록 input 태그가 등장한다

-> <input type="checkbox" name="isNotice" value="1">공지로 등록하기</label>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../header.jsp" %>

<h3>게시글 작성</h3>
<form method="POST">
	<table>
		<tr>
			<td><input type="text" name="title" placeholder="제목"></td>
		</tr>
		<tr>
			<td><input type="text" name="writer" value="${login.userid }" readonly></td>
		</tr>
		<tr>
			<td><textarea name="content" placeholder="내용을 작성하세요"
						  style="resize: none; width: 600px; height: 200px;"></textarea></td>
		</tr>
		<c:if test="${login.userid == 'admin' }">
			<tr>
				<td>
					<label>			
						<input type="checkbox" name="isNotice" value="1">공지로 등록하기
					</label>
				</td>
			</tr>
		</c:if>
	</table>
	
	<input type="submit" value="작성완료">
</form>

</body>
</html>

 

 

 

view.jsp

: 게시글 상세보기

 

[ 공지글 표시 ]

 

isNotice 컬럼값을 이용하여, 값이 1일때에는 title 앞에 [공지] 라는 문자열이 나오도록 한다 

->   <td>${dto.isNotice == 1 ? '[공지]' : dto.idx } ${dto.title }</td>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../header.jsp" %>

<h3>게시글 조회</h3>

<table>
	<tr>
		<td>${dto.isNotice == 1 ? '[공지]' : dto.idx } ${dto.title }</td>
	</tr>
	<tr>
		<td>작성자 : ${dto.writer } | ${dto.writeDate }</td>
	</tr>
	<tr>
		<td>
			<pre>${dto.content }</pre>
		</td>
	</tr>
</table>

<div style="display: flex; width: 800px; margin: 20px auto; justify-content: space-between;">
	<div></div>
	<div>
		<a href="${cpath }/board/delete/${dto.idx}"><button>삭제</button></a>
	</div>
</div>

</body>
</html>

 


 

study_reivew

mybatis 의 역할을 단번에 이해하기 어려웠다

 

 

 

앞선 실습에서도 mapper 없이 곧바로 DAO 에 sql 문을 쓰기도 했기 때문에

 

mybatis의 필요성을 느끼지 못하겠다.

 

 

처음부터 mybatis 없이 실습하다보니까, 

오히려 mybatis 를 사용하는게 더 불편한 것 같다

 

그래도 실무에서는 마이바티스를 활용하는 것이, 더 빠르고 효율적으로 sql문을 작성할 수 있을 것 같다

 

 

마이바티스와 친해질 수 있도록 노력해야겠다 

'spring' 카테고리의 다른 글

[ spring ] 어노테이션 문법정리  (0) 2024.01.02
[ spring ] Interceptor  (0) 2024.01.01
[ spring ] HashComponent 이용하기  (0) 2023.12.28
[ spring ] 스프링과의 첫만남  (0) 2023.12.27
[ spring ] 스프링 구조파악  (0) 2023.12.26