today_is
[ spring ] mybatis mapper 이용 본문
오늘의 목표
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 |