[Spring] mybatis mapper

2024. 10. 9. 18:04Spring

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"; }

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

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

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>

아직까지는 mybatis가 굳이 왜 필요한지 잘 모르겠다.

mapper를 사용하지 않고 DAO에 바로 sql문을 작성하던게 버릇이 돼서 그럴 수도 있는데,

아직까진 mybatis 사용이 더 불편하게 느껴진다.

 

나중에 실무로 들어가게 되면 더 효율적이라고 느낄 수 있지 않을까 싶다.

'Spring' 카테고리의 다른 글

[Spring] annotaion  (1) 2024.10.09
[Spring] Interceptor  (1) 2024.10.09
[Spring] HashComponent  (1) 2024.10.09
[Spring] 스프링 시작하기  (1) 2024.10.09
[Spring] Spring이 뭘까?  (3) 2024.10.09