Spring 05 (23.04.12)

Jane·2023년 4월 12일
0

IT 수업 정리

목록 보기
103/124

1. MyBatis 사용하는 Spring MVC Board (이어서)

1-1. content 내용 보기

BoardMapper.java

  • read 함수 추가
package edu.global.ex.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import edu.global.ex.vo.BoardVO;

@Mapper
public interface BoardMapper {
	public List<BoardVO> getList();
	public BoardVO read(int bid);
}

BoardMapper.xml

  • read 함수에 대한 select 태그 추가
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.global.ex.mapper.BoardMapper">
	<select id="getList" resultType="edu.global.ex.vo.BoardVO">
  	  <![CDATA[
      select * from mvc_board order by bgroup desc, bstep asc
   ]]>
	</select>

	<select id="read" resultType="edu.global.ex.vo.BoardVO">
  	  <![CDATA[
     select * from mvc_board where bid = #{bid}
   ]]>
	</select>
</mapper>

BoardService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.BoardVO;

public interface BoardService {
	public abstract List<BoardVO> getList();
	public BoardVO get(int bid);
}

BoardServiceImpl.java

package edu.global.ex.service;

import java.util.List;

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

import edu.global.ex.mapper.BoardMapper;
import edu.global.ex.vo.BoardVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper mapper;

	@Override
	public List<BoardVO> getList() {
		log.info("getList()..");

		return mapper.getList();
	}

	@Override
	public BoardVO get(int bid) {
		log.info("get()..");
		return mapper.read(bid);
	}

}

BoardController.java

package edu.global.ex.controller;

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.RequestMapping;

import edu.global.ex.service.BoardService;
import edu.global.ex.vo.BoardVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/jboard/*")
@RequiredArgsConstructor
public class BoardController {

	@Autowired
	private BoardService boardService;

	@GetMapping("/list")
	public String view_list(Model model) {
		log.info("view_list()...");

		model.addAttribute("boards", boardService.getList());
		return "/board/list";
	}

	@GetMapping("/content_view")
	public String content_view(BoardVO boardVO, Model model) {
		log.info("content_view()...");
		
		int bid = boardVO.getBid();
		
		boardVO = boardService.get(bid);

		model.addAttribute("content_view", boardVO);
		return "/board/content_view";
	}

}
  • localhost:8282/jboard/list에서 링크를 누르면
    content_view에서 해당 아이디의 내용글을 볼 수 있다.

1-2. content 수정하기

  • content_view에서 수정 버튼을 누르면 modify로 이동한다.
  • Mapper ~ Service ~ Controller 순으로?
    Controller ~ Service ~ Mapper 순으로?

BoardController.java

package edu.global.ex.controller;

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 org.springframework.web.bind.annotation.RequestMapping;

import edu.global.ex.service.BoardService;
import edu.global.ex.vo.BoardVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/jboard/*")
@RequiredArgsConstructor
public class BoardController {

	@Autowired
	private BoardService boardService;

	@GetMapping("/list")
	public String view_list(Model model) {
		log.info("view_list()...");

		model.addAttribute("boards", boardService.getList());
		return "/board/list";
	}

	@GetMapping("/content_view")
	public String content_view(BoardVO boardVO, Model model) {
		log.info("content_view()...");

		int bid = boardVO.getBid();

		boardVO = boardService.get(bid);

		model.addAttribute("content_view", boardVO);
		return "/board/content_view";
	}

	@PostMapping("/modify")
	public String modify(BoardVO boardVO, Model model) {
		log.info("modify()...");

		int rn = boardService.modify(boardVO);

		log.info("modify()... result number : " + rn);

		return "redirect:list";
	}

}

BoardService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.BoardVO;

public interface BoardService {
	public List<BoardVO> getList();
	public BoardVO get(int bid);
	public int modify(BoardVO boardVO);
}

BoardServiceImpl.java

package edu.global.ex.service;

import java.util.List;

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

import edu.global.ex.mapper.BoardMapper;
import edu.global.ex.vo.BoardVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper mapper;

	@Override
	public List<BoardVO> getList() {
		log.info("getList()..");

		return mapper.getList();
	}

	@Override
	public BoardVO get(int bid) {
		log.info("get()..");
		return mapper.read(bid);
	}

	@Override
	public int modify(BoardVO boardVO) {
		log.info("modify()..");
		return mapper.update(boardVO);
	}

}

BoardMapper.java

package edu.global.ex.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import edu.global.ex.vo.BoardVO;

@Mapper
public interface BoardMapper {
	public List<BoardVO> getList();
	public BoardVO read(int bid);
	public int update(BoardVO boardVO);
}

BoardMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="edu.global.ex.mapper.BoardMapper">
     
     <select id="getList" resultType="edu.global.ex.vo.BoardVO">
     <![CDATA[
      select * from mvc_board order by bgroup desc, bstep asc
   ]]>
     </select>
  
    <select id="read" resultType="edu.global.ex.vo.BoardVO">
     <![CDATA[
        select * from mvc_board where bid = #{bid}
   ]]>
     </select>
     
     <update id="update">
     <![CDATA[
        update mvc_board set bname=#{bname}, btitle=#{btitle}, bcontent=#{bcontent} 
             where bid =#{bid}
   ]]>
     </update>
  
  </mapper>

1-3. 게시글 delete 하기

content_view.jsp 태그 수정

<a href="delete?bid=${content_view.bid}">삭제</a>

BoardController.java (함수 추가)

@GetMapping("/delete")
	public String delete(BoardVO boardVO, Model model) {
		log.info("delete()...");

		int bid = boardVO.getBid();

		int rn = boardService.delete(bid);

		log.info("delete()... result number : " + rn);
		return "redirect:list";
	}

BoardService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.BoardVO;

public interface BoardService {
	public List<BoardVO> getList();

	public BoardVO get(int bid);

	public int modify(BoardVO boardVO);

	public int delete(int bid);
}

BoardServiceImpl.java (delete 함수 추가)


	@Override
	public int delete(int bid) {
		log.info("delete(int bid)..");
		return mapper.remove(bid);
	}

BoardMapper.java

package edu.global.ex.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import edu.global.ex.vo.BoardVO;

@Mapper
public interface BoardMapper {
	public List<BoardVO> getList();

	public BoardVO read(int bid);

	public int update(BoardVO board);

	public int remove(int bid);
}

BoardMapper.xml (delete 태그 추가)

	<delete id="remove">
     <![CDATA[
       delete mvc_board where bid = #{bid}
   ]]>
	</delete>

1-4. 글 작성하기

BoardController.java (write_view 이동 추가)

	@GetMapping("/write_view")
	public String write_view(BoardVO boardVO, Model model) {
		log.info("write_view()...");

		return "/board/write_view";
	}
  • write_view.jsp 만들기
<body>
	<form action="/jboard/write" method="post">
		<table width="500" cellpadding="0" cellspacing="0" border="1">
			<tr>
				<td>이름</td>
				<td><input id="input_bname" type="text" name="bname" size="50">
				</td>
			</tr>
			<tr>
				<td>제목</td>
				<td><input id="input_btitle" type="text" name="btitle"
					size="50"></td>
			</tr>
			<tr>
				<td>내용</td>
				<td><textarea id="input_bcontent" name="bcontent" rows="10"></textarea>
				</td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="입력">
					&nbsp;&nbsp; <a href="list">목록보기</a></td>
			</tr>
		</table>
	</form>
</body>

BoardController.java (write 이동 추가)

	@PostMapping("/write")
	public String write(BoardVO boardVO) {
		log.info("write()...");

		int rn = boardService.register(boardVO);
		log.info("register()... result number : " + rn);
		return "redirect:list";
	}

BoardService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.BoardVO;

public interface BoardService {
	public List<BoardVO> getList();

	public BoardVO get(int bid);

	public int modify(BoardVO boardVO);

	public int delete(int bid);

	public int register(BoardVO boardVO);
}

BoardServiceImpl.java

	@Override
	public int register(BoardVO board) {
		log.info("register()..");
		
		return mapper.insert(board);
	}

BoardMapper.java

package edu.global.ex.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import edu.global.ex.vo.BoardVO;

@Mapper
public interface BoardMapper {
	public List<BoardVO> getList();

	public BoardVO read(int bid);

	public int update(BoardVO board);

	public int remove(int bid);

	public int insert(BoardVO board);
}

BoardMapper.xml

	<insert id="insert">
	<![CDATA[
       insert into mvc_board (bid, bname, btitle, bcontent, bhit, bgroup, bstep, bindent) 
            values (mvc_board_seq.nextval, #{bname}, #{btitle}, #{bcontent}, 0, mvc_board_seq.currval, 0, 0) 
   ]]>
	</insert>

1-5. 답변 글 작성하기

BoardController.java (reply_view 추가)

	@GetMapping("/reply_view")
	public String reply_view(BoardVO boardVO, Model model) {
		log.info("reply_view()...");

		model.addAttribute("reply_view", boardService.get(boardVO.getBid()));
		
		return "/board/reply_view";
	}
  • reply_view.jsp 만들기

BoardController.java (reply 추가)

	@PostMapping("/reply")
	public String reply(BoardVO boardVO) {
		log.info("reply()...");

		boardService.registerReply(boardVO);
		return "redirect:list";
	}

BoardService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.BoardVO;

public interface BoardService {
	public List<BoardVO> getList();

	public BoardVO get(int bid);

	public int modify(BoardVO boardVO);

	public int delete(int bid);

	public int register(BoardVO boardVO);

	public void registerReply(BoardVO boardVO);
}

BoardServiceImpl.java (void registerReply 함수 추가)

	@Override
	public void registerReply(BoardVO board) {
		log.info("registerReply()..");
		
		mapper.updateShape(board);
		mapper.insertReply(board);
	}

BoardMapper.java

package edu.global.ex.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import edu.global.ex.vo.BoardVO;

@Mapper
public interface BoardMapper {
	public List<BoardVO> getList();

	public BoardVO read(int bid);

	public int update(BoardVO board);

	public int remove(int bid);

	public int insert(BoardVO board);

	public void updateShape(BoardVO board);

	public void insertReply(BoardVO board);
}

BoardMapper.xml (추가하기)

	<!--댓글을 하나씩 미뤄서 정렬을 해줘야 하기 때문에 세로 정렬을 bstep에 +1로 한칸씩 미뤄내줘야한다. -->
	<update id="updateShape">
      <![CDATA[
          update mvc_board set bstep = bstep + 1 where bgroup =#{bgroup} and bstep > #{bstep}
      ]]>
	</update>

	<insert id="insertReply">
   <![CDATA[
      insert into mvc_board (bid, bname, btitle, bcontent, bgroup, bstep, bindent) 
      values (mvc_board_seq.nextval, #{bname}, #{btitle},#{bcontent}, 
                #{bgroup}, #{bstep}+1, #{bindent}+1)
   ]]>
	</insert>

  • 두 개 이상의 mapper 코드가 들어가게 되면 @Transactional을 넣는다.
  • 코드에 문제가 생기면 rollback을 실행한다.

BoardServiceImpl.java (registerReply에 Annotation 추가)

	@Transactional
	@Override
	public void registerReply(BoardVO board) {
		log.info("registerReply()..");
		
		mapper.updateShape(board);
		mapper.insertReply(board);
	}

2. Spring Boot 설정 변경 (로그 보여주는 방식 변경)

  • 파일 2개를 resource에 넣기

  • application.properties 설정 변경

3. MyBatis를 적용한 EMP Board

EmpController.java

package edu.global.ex.controller;

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.RequestMapping;

import edu.global.ex.service.EmpService;
import edu.global.ex.vo.EmpVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/emp/*")
@RequiredArgsConstructor
public class EmpController {

	@Autowired
	private EmpService empService;

	@GetMapping("/list")
	public String view_list(Model model) {
		log.info("view_list()...");

		model.addAttribute("emps", empService.getList());
		return "/emp/emp_list";
	}

	@GetMapping("/emp_view")
	public String emp_view(EmpVO empVO, Model model) {
		log.info("emp_view()...");

		int empno = empVO.getEmpno();

		empVO = empService.get(empno);

		model.addAttribute("emp_view", empVO);

		return "/emp/emp_view";
	}

}

EmpService.java

package edu.global.ex.service;

import java.util.List;

import edu.global.ex.vo.EmpVO;

public interface EmpService {
	public abstract List<EmpVO> getList();
	public EmpVO get(int bno);
}

EmpServiceImpl.java




	@Autowired
	private final EmpMapper mapper;
	
	@Override
	public List<EmpVO> getList() {
		log.info("getList()..");
		return mapper.getList();
	}

	@Override
	public EmpVO get(int bid) {
		log.info("get()..");
		return mapper.read(bid);
	}

EmpMapper.java

package edu.global.ex.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import edu.global.ex.vo.EmpVO;

@Mapper
public interface EmpMapper {
	public List<EmpVO> getList();

	public EmpVO read(int bid);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.global.ex.mapper.EmpMapper">
	<select id="getList" resultType="edu.global.ex.vo.EmpVO">
     <![CDATA[
      select * from emp
   ]]>
	</select>
	<select id="read" resultType="edu.global.ex.vo.EmpVO">
     <![CDATA[
     select * from emp where empno = #{empno}
   ]]>
	</select>

</mapper>
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글