Certification/Spring(2V0-72.22, SCP)

Spring MVC - 게시판 만들기(C)RUD - feat.입문편

엘호리스 2018. 8. 12. 14:02

Spring MVC - 게시판 만들기 feat.입문편

http://lhoris.tistory.com/33



그럼 전편에 이어 게시판의 기본기능 하나씩 구현해 나가보자.

위 전편 포스팅에 기본적인 틀 구조를 잡은 소스코드가 있으니 다운로드 받아 사용하는 것도 한 방법이다.


이번 포스팅에서는 게시글 작성하는 기능을 구현할 것이다.(CRUD의 Create에 해당한다.)

우선 DB툴에서 쿼리를 작성해보고 정상 작동하는지 확인해보자.

1
2
insert into board (bno, title, content, writer )
values ((select nvl(max(bno)+1,1from board), '글제목''내용''작성자')
cs

위 SQL문이 정상 작동하는걸 확인했고 '글제목', '내용', '작성자' 부분을 변수 처리하면 되겠다는 결론을 내릴 수 있다.

Mapper.xml 파일에 작성하도록 하자. 여기서 주의할 점은 $가 아닌 #을 사용한다는 점이다.


boardMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="board">
 
    <!-- 게시글 목록 불러오기 -->
    <select id="boardList" resultType="com.board.example.dto.BoardDTO">
        select bno,title,writer,regdate,viewcnt
        from board order by bno desc
    </select>
 
    <!-- Create 부분에 해당하는 글 쓰기 쿼리 -->
    <insert id="boardWriter">
        insert into board (bno, title, content, writer )
        values ((select nvl(max(bno)+1,1) from board), #{title}, #{content}, #{writer})
    </insert>
    
</mapper>
cs



그리고  mybatis 컨피그 파일에 다음 소스 코드를 좀 넣어두자.

(이것은 매핑되는 파라미터에 Null 값이 있는 경우 발생하는 에러에 대비하기 위한 코드다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- null값이 파라미터로 전달될 때 오류나지 않게 NULL 처리 -->
        <!-- 이거 하면 #{parameter, jdbcType=VARCHAR} 이렇게 안해도 된다 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
    <typeAliases>
        <package name="com.board.example" />
    </typeAliases>
 
</configuration>
cs



Mapper에 SQL문도 추가했고 설정도 해줬고... DAO도 구현해보자.

네임스페이스나 id 를 잘못 입력하는 경우가 잦으니 만들 때 같이 구현하도록 하자.


BoardDAO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.board.example.dao;
 
import java.util.List;
 
 
import com.board.example.dto.BoardDTO;
 
public interface BoardDAO {
    // 게시물 목록 보기
    public List<BoardDTO> boardList() throws Exception;
    // 게시물 작성
    public void writerBoard(BoardDTO bdto) throws Exception;
}
cs



BoardDAOImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.board.example.dao;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.board.example.dto.BoardDTO;
 
@Repository
public class BoardDAOImpl implements BoardDAO {
    @Inject
    SqlSession sqlSession;
    // 게시물 목록 불러오기
    @Override
    public List<BoardDTO> boardList() throws Exception {
        return sqlSession.selectList("board.boardList"); 
    }
    // 게시물 글쓰기
    @Override
    public void writerBoard(BoardDTO bdto) throws Exception {
        sqlSession.insert("board.boardWriter", bdto);
    }
}
cs



이제 뷰를 구현해보도록 하자. 그냥 게시판 글 작성할 수 있는 폼 형식을 가진 페이지를 만들어 보는 것이다.

우선 view 단에서 간단하게 form 태그를 포함한 페이지를 작성해보자.

아래와 같은 페이지를 만들 것이다. 동시에 board_list.jsp 파일에 테이블 소스코드 나오기 전에

1
<a href="${path}/board/writer_page">글쓰기</a>
cs

소스코드를 추가해줘서 글쓰기 page로 이동할 수 있는 a 태그를 추가해주자.


writer_page.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%@ include file="../include/menu.jsp" %>
    <h2>writer_page 페이지입니다.</h2>
    <form name="bdto" method="post" action="${path}/board/insert.do">
        <div>제목<input name="title" id="title" size="80" placeholder="글 제목 입력"></div>
        <div>내용<textarea name="content" id="content" rows="8" cols="80" placeholder="글 내용 입력"></textarea></div>
        <div>이름<input name="writer" id="writer" placeholder="이름 입력"></div>
        <div style="width:650px; text-align:center;">
            <input type="submit" value="확인">
        </div>
    </form>
</body>
</html>
cs



글쓰기 a 태그를 클릭해 페이지 이동이 잘 이뤄지기 위해 컨트롤러 작성을 하자.


BoardController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.board.example.controller;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
import com.board.example.dto.BoardDTO;
import com.board.example.service.BoardService;
import com.sun.media.jfxmedia.logging.Logger;
 
 
@Controller
@RequestMapping("/board/*")
public class BoardController {
    @Inject
    BoardService boardService;
    
    // 과거 ModelAndView를 활용한 방법
//    @RequestMapping("list.do")
//    public ModelAndView boardMenu() throws Exception {
//        List<BoardDTO> list = boardService.boardList();
//        ModelAndView mav = new ModelAndView();
//        mav.setViewName("board/board_list");
//        mav.addObject("list", list);
//        return mav; // board/board_list.jsp로 이동
//    }
    
    // 현재 자주 쓰는 Model 클래스를 DI 하는 방법
    @RequestMapping("list.do")
    public String boardList(Model model) throws Exception {
        List<BoardDTO> list = boardService.boardList(); // list 변수에 결과 값을 담는다
        model.addAttribute("list", list); // model에 데이터 값을 담는다
        return "board/board_list"// board/board_list.jsp로 이동
    }
    
    // writer_page.jsp 매핑
    @RequestMapping("writer_page")
    public String writerpage() {
        return "board/writer_page";
    }
    
    // 게시글 from 데이터 처리
    @RequestMapping(value="insert.do", method=RequestMethod.POST)
    public String boardWriter(BoardDTO bdto) throws Exception {
        boardService.writerBoard(bdto);
        return "redirect:list.do";
    }
    
}
cs



글쓰기 a 태그를 통해 writer_page.jsp 로 잘 이동이 되는 것을 확인할 수 있다.


사실 Service 구현 없이 DAO 로도 접근할 수 있지만....

패턴을 맞추고 나중에 추가될 가능성이 있는 비즈니스 로직(게시글 쓰면 포인트를 준다던가....)을 고려해서

Service 도 구현해주도록 하자.


BoardService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.board.example.service;
 
import java.util.List;
 
import com.board.example.dto.BoardDTO;
 
public interface BoardService {
    // 게시물 목록 조회
    public List<BoardDTO> boardList() throws Exception;
    // 게시물 글 쓰기
    public void writerBoard(BoardDTO bdto) throws Exception;
}
 
cs


BoardServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.board.example.service;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Service;
 
import com.board.example.dao.BoardDAO;
import com.board.example.dto.BoardDTO;
 
@Service
public class BoardServiceImpl implements BoardService {
    @Inject
    BoardDAO boardDao;
    // 게시물 목록 불러오기
    @Override
    public List<BoardDTO> boardList() throws Exception {
        return boardDao.boardList(); 
    }
    // 게시물 글 쓰기
    @Override
    public void writerBoard(BoardDTO bdto) throws Exception {
        boardDao.writerBoard(bdto);
    }
}
 
cs



이렇게 클라이언트에서 post 방식의 데이터를 전송하기 위한 준비가 되었다.


게시글을 쓰고 나면 데이터가 정상적으로 등록이 되고 바로 게시글 목록 페이지로 리다이렉트 되는 모습을 확인할 수 있다.