본문으로 바로가기

Spring 개발 - 게시판 만들기 #글작성

category 공부/Spring 2018. 10. 13. 15:49

글을 작성해서 db에 저장시켜보자. 앞에 있는 #글목록과 연관되어 있다. 그리고 회원가입하는 것과 비슷하다. CRUD가 존재한다면 스프링은 큰 차이가 없는 것 같다. 그래서 그런지 게시판 만들기만 할 줄 알면, 거의 다 충분히 할 수 있다고 생각한다.((((내생각))) 마찬가지로 여기서도 form태그의 action 속성을 이용한다. 간혹 jQuery를 이용해서 form을 넘기기는 분들도 있다. jQuery부분이 익숙치 않아서 그런지 신기하고 좋아보였다.ㅋㅋ 다음엔 jQuery를 이용해서 게시판 만들기를 해봐야지!


1. 글쓰기 버튼 생성

boardList.jsp

1
2
3
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<a href='<c:url value='/board/boardWrite'/>' role="button" class="btn btn-outline-info">글쓰기</a>
cs

게시판 목록에서 '글쓰기'를 누르면 작성할 수 있는 페이지로 넘어가게 할 것이다. 그냥 action 속성에 url을 적어줘도 무방하지만, c태그(<c:url>)을 쓰는것을 추천한다. c태그를 쓰려면 1행을 선언해주어야 한다.



2. BoardController.java ("/board/boardWrite")

BoardController.java

1
2
3
4
    @RequestMapping(value="/board/boardWrite")
    public String boardWrite() throws Exception {
        return "/board/boardWrite";
    }
cs

글쓰기 버튼을 누르면, 글을 작성할 수 있는 페이지로 이동시켜주는 컨트롤러이다. 글을 작성하는 페이지에 딱히 보내야 할 것이 없어서 그냥 String을 이용해서 페이지 이동을 시켰다. ModelAndView를 이용해서 글 작성 페이지에 어떠한 정보를 넘겨줘도 된다. 기본을 만들고 차차 넣고 싶은 기능을 넣으면 된다. 



3. 글작성 페이지

boardWrite.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <form action='<c:url value='/board/boardInsert'/>' method="post">
        <div class="form-group">
              <label for="exampleFormControlInput1">제목</label>
            <input type="text" class="form-control" id="exampleFormControlInput1" name="title" placeholder="제목을 작성해주세요.">
          </div>
        <div class="form-group">
            <label for="exampleFormControlInput1">작성자</label>
            <input type="text" class="form-control" id="exampleFormControlInput1" name="crea_id" placeholder="이름을 적어주세요.">
          </div>
          <div class="form-group">
            <label for="exampleFormControlTextarea1">내용</label>
            <textarea class="form-control" id="exampleFormControlTextarea1" name="contents" rows="10"></textarea>
          </div>
        <button type="submit" class="btn btn-info">등록하기</button>
        <button type="button" class="btn btn-secondary">목록으로</button>
    </form>
cs

나는 부트스트랩을 이용해서 css를 입혔다. 그래서 다 볼 필욘 없고, 꼭 중요한.. 필요한 부분만 언급을 하겠다.

- 1행: form 태그안에 action 속성의 url을 지정한다. c태그를 이용해서 작성한다.

- 4, 8, 12행: input태그 안의 내용들을 컨트롤러로 보내주기 위해, 각각의 파라미터 이름(name) 속성을 지정해주어야한다. sql을 작성할 때 사용하는 것이기 때문에, 대소문자 구분 혹은 스펠링에 유의하자. 제발.. 정말 허무하게 이런 곳에서 오류가 많이 난다ㅠㅠ

- 14행: form 태그를 전송할 submit 타입을 지정한다. type이 submit이여야 한다.



4. 확인

글쓰기 버튼이 있는 곳으로 가보자. 나는 게시판 목록에 글쓰기 버튼이 있다.


글쓰기 버튼을 눌러보자.


글 작성 페이지가 나온다. 지금은 글 작성해도 별 소용없다. 이제부터가 중요하다.


글을 작성하고 '등록하기'버튼을 누르게 되면 form태그안의 name 속성으로 지정한 값들이 컨트롤러로 갈 것이다. 컨트롤러에서 이 파라미터 값들을 받아 sql을 작성하여 db에 글을 등록하고, 등록이 완료되면 게시판 목록으로 리다이렉트되어 작성된 글을 확인 할 수 있게 만들 것이다. 



5.  BoardController.java ("/board/boardInsert")

글 작성 페이지에서 글을 작성한 뒤, '등록하기'를 누르면 form태그의 action속성의 url로 이동한다.


BoardController.java

1
2
3
4
5
6
    @RequestMapping(value="/board/boardInsert")
    public ModelAndView boardInsert(CommandMap commandMap) throws Exception {
        ModelAndView mav = new ModelAndView("redirect:/board/boardList");
        boardService.insertBoard(commandMap);
        return mav;
    }
cs

- 1행: form태그의 action 속성에 있는 url 이다.

- 2행: form태그의 파라미터를 CommandMap으로 받았다. CommandMap은 이전에 handlerMethodArgument를 할때 만든 것이다. 이게 없다면 BoardVO를 만들어 VO형태로 받아도 된다.

- 3행: 컨트롤러가 끝나고 보내질 페이지이다. 등록을 완료하면 게시글 목록으로 다시 이동시키려고 리다이렉트를 사용한다.

- 4행: 컨트롤러에 들어온 파라미터를 게시판 DB에 등록한다.


여기서부터는 이제 어떤 것을 할지 감이 잡힐 것이다. 밑줄 그인 메소드에 마우스를 가져다대어, create method 혹은 오버라이드하면 된다. 물흐르듯이~

6. BoardService.java

1
void insertBoard(CommandMap commandMap);
cs



7. BoardServiceImple.java

1
2
3
4
5
6
    @Override
    public void insertBoard(CommandMap commandMap) {
        // TODO Auto-generated method stub
        boardDAO.insertBoard(commandMap);
    }
 
cs


8. BoardDAO.java

1
2
3
4
    public void insertBoard(CommandMap commandMap) {
        // TODO Auto-generated method stub
        insert("board.insertBoard", commandMap.getMap());        
    }
cs

나는 AbstractDAO라는 클래스를 상속받았기때문에 이렇게 썼다. AbstractDAO가 없다면, sqlSession을 이용해서 작성하면 된다.

- 3행: query id (board.insertBoard)에 유의하자. sql의 id로도 쓰이기 때문에 오타가 있으면 안된다. 제발 제발 두번 세번 확인하자. 정말 허무한 오타오류가 이런 곳에서 자주 발생한다. 그냥 여기서 쓴 쿼리 id를 복사해서 sql에 사용하길 빈다.. board.inserBoard에서 board는 namespace이고, insertBoard는 id가 될 것이다.



9. board_sql.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<mapper namespace="board">
    <insert id="insertBoard" parameterType="hashmap">
        <![CDATA[
            INSERT INTO TB_BOARD
            (
                TITLE,
                CONTENTS,
                HIT_CNT,
                DEL_CHK,
                CREA_DATE,
                CREA_ID
            )
            VALUES
            (
                #{ title},
                #{ contents},
                0,
                'N',
                SYSDATE(),
                #{ crea_id}
            )
        ]]>
    </insert>
</mapper>
cs

- 1~2행: namespace와 id에 주의하자!!! 제발 제발!!! dao에서 사용한 board.insertBoard 쿼리id에 유의하라고 했었다. 그 쿼리 id를 여기와 똑같이 작성해주면 된다.

- 3~22행: sql문을 작성한다. #{ }안에 있는 것은 form 태그안의 name의 이름과 같아야한다(대소문자 구분함).



10. 실행

글을 작성하고 '등록하기'를 눌러보자.


글목록으로 자동으로 이동되며, 6번에 방금 작성한 글이 있는 것을 확인할 수 있다. 와우! 끝!

이라고 끝내지말고 그래도 예의상 콘솔로 흐름을 보자.


첫 시작인 목록 리스트이다. 지금 5개의 목록이 나오는 것이 확인된다. 


글 작성 페이지에 진입하고, 글을 작성하고 난뒤 '등록하기'버튼을 누르면 이렇게 쿼리가 동작되어 db에 저장된다.


db에 저장된 후, 게시글 목록으로 리다이렉트 되면서, 다시 목록을 불러오는데 이때 내가 작성한 글이 등록된 것을 확인할 수 있다.


콘솔까지 확인 완료했으면 진짜 글 작성 부분은 끝났다! 유후!

내 개인적인 생각으론 글 작성 부분을 완성시켰다면 나머지 수정, 삭제 부분은 매우 쉬울 것이다. 비슷비슷-