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>