Spring/Spring

5. 스프링 게시판 만들기 - CRUD

작은돼지 2023. 1. 4. 15:08

기본적인 CRUD 기능이므로 추가적으로 검증, 예외 상황 처리 등을 해야 함
URL 매핑, HTTP 메소드, 프레임워크의 동작 과정을 생각하며 작성

1. [GET] 사용자가 글 목록을 요청했을 때 보여줄 JSP 페이지
2. [GET] 사용자가 {id}번 글 조회를 요청했을 때 보여줄 JSP 페이지
3. [GET] 사용자가 글 작성을 요청했을 떄 보여줄 JSP 페이지
4. [POST] 글 작성 요청 처리
5. [GET] 사용자가 {id}번 글의 수정 폼을 요청했을 때 보여줄 JSP 페이지
6. [POST] 수정 요청 처리
7. [POST] 사용자가 {id}번 글의 삭제를 요청했을 때 요청 처리

 

1. BoardController.java

@Controller
@RequestMapping("/board")
public class BoardController {

	private final BoardService boardService;

	@Autowired
	public BoardController(BoardService boardService) {
		this.boardService = boardService;
	}

	// 목록
	@GetMapping
	public String getBoardList(Model model) {
		model.addAttribute("boardList", boardService.getBoardList());
		return "/board/getBoardList";
	}

	// 조회
	@GetMapping("/{boardId}")
	public String getBoardById(@PathVariable Long boardId, Model model) {
		model.addAttribute("board", boardService.getBoardById(boardId));
		return "/board/getBoard";

	}

	// 작성
	@GetMapping("/write")
	public String writeBoardForm() {
		return "/board/writeBoard";
	}

	@PostMapping("/write")
	public String writeBoard(Board board) {
		boardService.writeBoard(board);
		return "redirect:/board";
	}

	// 수정
	@GetMapping("/{boardId}/edit")
	public String editBoardForm(@PathVariable Long boardId, Model model) {
		model.addAttribute("board", boardService.getBoardById(boardId));
		return "/board/editBoard";

	}

	@PostMapping("/edit")
	public String editBoard(Board board) {
		boardService.editBoard(board);
		return "redirect:/board";
	}

	// 삭제
	@PostMapping("/{boardId}/delete")
	public String deleteBoard(@PathVariable Long boardId) {
		boardService.deleteBoard(boardId);
		return "redirect:/board";

	}

}

 

2. BoardServiceImpl.java (인터페이스 생략)

@Service
public class BoardServiceImpl implements BoardService {

	private final BoardDAO boardDAO;

	@Autowired
	public BoardServiceImpl(BoardDAO boardDAO) {
		this.boardDAO = boardDAO;
	}

	@Override
	public List<Board> getBoardList() {
		List<Board> boardList = boardDAO.getBoardList();
		return boardList;
	}

	@Override
	public Board getBoardById(Long boardId) {
		return boardDAO.getBoard(boardId);
	}

	@Override
	public int writeBoard(Board board) {
		return boardDAO.writeBoard(board);
	}

	@Override
	public void editBoard(Board board) {
		boardDAO.editBoard(board);
	}

	@Override
	public void deleteBoard(Long boardId) {
		boardDAO.deleteBoard(boardId);
	}

}

 

3. BoardDAO.java (인터페이스 생략)

@Repository
public class BoardDAOImpl implements BoardDAO {

	private final SqlSession sqlSession;
	private final String NAMESPACE = "com.example.board";

	public BoardDAOImpl(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}

	@Override
	public List<Board> getBoardList() {
		return sqlSession.selectList(NAMESPACE + ".getBoardList");
	}

	@Override
	public Board getBoard(Long boardId) {
		return sqlSession.selectOne(NAMESPACE + ".getBoardById", boardId);
	}

	@Override
	public int writeBoard(Board board) {
		int result = sqlSession.insert(NAMESPACE + ".writeBoard", board);
		return result;
	}

	@Override
	public void editBoard(Board board) {
		sqlSession.update(NAMESPACE + ".editBoard", board);
	}

	@Override
	public void deleteBoard(Long boardId) {
		sqlSession.delete(NAMESPACE + ".deleteBoard", boardId);
	}

}

 

4. board-mapper.xml

<?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.example.board">
  	<select id="getBoardList" resultType="Board">
  		SELECT BOARD_ID, TITLE, WRITER, CREATED_AT
  		FROM BOARD
  		ORDER BY BOARD_ID DESC
  	</select>
  	
  	<select id="getBoardById" parameterType="Long" resultType="Board">
  		SELECT BOARD_ID, TITLE, CONTENT, WRITER, CREATED_AT
  		FROM BOARD
  		WHERE BOARD_ID = #{boardId}
  	</select>
  	
  	<insert id="writeBoard" parameterType="Board">
  		INSERT INTO BOARD(BOARD_ID, TITLE, CONTENT, WRITER)
  		VALUES(BOARD_ID_SEQ.NEXTVAL, #{title}, #{content}, #{writer})
  	</insert>
  	
  	<update id="editBoard" parameterType="Board">
  		UPDATE BOARD
  		SET TITLE = #{title}, CONTENT = #{content}, WRITER = #{writer}
  		WHERE BOARD_ID = #{boardId}
  	</update>
  	
  	<delete id="deleteBoard" parameterType="Long">
  		DELETE FROM BOARD
  		WHERE BOARD_ID = #{boardId}
  	</delete>
  	
  </mapper>