봉봉의 개인 블로그

2017-07-07-P 본문

학원에서 배운것들/TEA - P

2017-07-07-P

봉봉이네 2017. 7. 7. 11:11

Spring 으로 board 예제 만들어보기

먼저 sts를 켜줍니다. 그다음으로 새로운 Spring Legacy Project를 만들어줍니다.

그다음 java 버전을 1.8로 변경해줍니다 (빌드패스)

그다음으로 톰캣라이브러리를 추가해줍니다.(빌드패스)

다음으로는 Maven 에 관련된 설정을 해주기 위해서 pom.xml 파일에 설정을 바꿔줍니다.

먼저 이부분의 내용을 java 버전을 맞춰주고 Springframework 의 버전도 맞춰줍니다.

그다음으로

내리다보면 이런부분이 나옵니다. 이부분은 원래 jstl 이라고 적혀 있지 않고 servlet 이라고 적혀있는데 그부분의 jstl 부분만 남겨두고 지워줍니다.

 

다음으로는 위와같은 문구를 추가해줍니다. 이부분은 MVNrepository 에서 Maven 을 따온것입니다.

설명을 하기전에 먼저 흐름을 보자면 먼저 jdbc를 즉 DB를 사용할것입니다. 그러면 db가 있어야합니다. 그후 그 db에 커넥션 풀을 만들고 사용할것입니다. 그러기 때문에 connection pool 의 라이브러리가 있어야하며, 그 jdbc를 Spring 에서 관리를 하게끔 만들것입니다 그렇기 떄문에 Spring 에서의 jdbc 관련해서 라이브러리가 필요하고 mybatis 를 통해 쿼리를 날리고 jdbc를 사용할것이기 때문에 mybatis가 필요하며,mybatis 와 spring 을 같이 사용할것이기 때문에 mybatis 와 spring 을 연결할수 있는 라이브러리도 필요하게 됩니다.

위에서부터 설명하자면 1번째는 mybatis 와 spring 을 연동시켜주는것이고

2번째는 mybatis 라이브러리를 추가해준것이고

3번째는 spring jdbc를 추가한것이고 

4번째는 connection pool 을 사용하기 위해서 dbcp 를 추가한것이고

5번째는 jdbc 를 추가한것이다.

이렇게 하게 되면 maven 관련 즉 pom.xml 파일의 설정이 끝나게 된다.

다음으로 할것은 web.xml 파일에 관련된 설정을 할것이다.

web.xml 파일을 위와 같이 적어줍니다

먼저 맨위에 2~4번째 줄가지는 원래는 저렇게 적혀있지 않다. 버전이 낮은 버전으로 되어있엇기 때문에 버전이 높은 버전으로 맞춰준것이다.

Servlet 2.2


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC

"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app />



Servlet 2.3


 SERVLET-2_3-FCS-SPEC.PDF


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app />



Servlet 2.4


DTD 에서 스키마로 바뀌었습니다.


 SERVLET-2_4-FR-SPEC.PDF


<?xml version="1.0" encoding="UTF-8"?>

<web-app id="servlet-2_4" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


</web-app>



Servlet 2.5


 SERVLET-2_5-MREL2-SPEC.PDF

 

 WEB.XML.PDF

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="servlet-2_5" version="2.5">


</web-app>



Servlet 3.0


 SERVLET-3_0-FINAL-SPEC.PDF


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">


</web-app>



Servlet 3.1


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">

</web-app>

이런것을 따와서 바꿔준 것이다.

다음으로 바꿔줄것은 리스너의 부분을 지워준다음에 필터 부분을 생성하였습니다.

여기서 개념만 쪼금 설명하자면 servlet 이 있고 filter 가 있고 listener 가 있다

servlet 은 요청을 처리하는것이고 filter 는 요청을 하긴하는데 servlet 으로 가기전에 filter 를 거치는것이고

listener 같은 경우에는 톰캣등에 이벤트가 발생햇을때 실행되게 되어있다.

여기서 filter 를 추가하는 이유는 Spring에서는 servlet 을 관리하지 않기 때문에 filter 를 통해서 미리 요청을 받을 때 모든 요청에 대한 encoding 을 한것이다.

그리고 또 encoding 할게 더 남아있다.

window ->preferences 를 들어가서 encoding 을 여서 저기 web 부분과 workspace, xml 파일의 인코딩을 맞춰줘야 한다 . 여기서는 utf-8로 다 맞춰 놓앗다.

여기 까지 하게 되면 web.xml 파일의 설정이 다 된것이다. 다음으로 할것은 이제 servlet-context.xml 파일을 설정해 주어야 합니다.

이 사진과 같이 바꿔줍니다. 다른부분은 손댈 부분이 별로없고 주인을 먼저 mvc 주인에서 beans 로 바꿔줍니다.

그다음 이제 커넥션 connection pool 을 사용할거였기 때문에 미리

여기서 <bean>객체를 생성해줘야 합니다 먼저 커넥션 풀 bean생성 부분의 내용을 작성해줍니다.

이렇게 적어주게 되면 커넥션 풀 객체가 생성이 되는것입니다.

그후 만들어진 커넥션 풀 객체를 sqlSessionFactory 라는 곳에 담아야합니다. mybatis 설정을 통해서 먼저 sqlSessionFactory 를 만들어준다음에 그안에 sqlSessionFactory 생성시 사용할 dataSuorce 즉 커넥션풀을 주입시켜 줍니다.

그다음으로 그 sqlSessionFactory 가 생성후 쿼리를 실행 시킬때 사용할 쿼리 위치를 설정해줘야합니다.

value 부분에 보면 설정이 되어있습니다(이부분은 실제로 쿼리문을 맵핑할 xml 파일의 위치로 설정해주면된다)

그다음 그 sqlSessionFactory 사용하기 쉽게 하기 위해서 템플릿을 만들어줍니다. 즉 sqlSessionFactory 를 결국 다시 sqlSessionTemlate 안에 담으면 된다. 이렇게 하고 나면 servlet-context.xml파일까지 설정을 완료한것이다. 그럼 여기서 이제 쿼리문을 맵핑해놓은 문서가 필요하게 된다.

아까 정해진 패키지를 만들고 그안에 BoardMapper.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
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
56
57
58
59
60
61
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="naver.eun.board.service.BoardMapper">
    <update id="updateBoard" parameterType="naver.eun.board.service.Board">
        UPDATE board 
            SET board_title = #{boardTitle}
            , board_content = #{boardContent} 
        WHERE board_no = #{boardNo} 
        AND board_pw = #{boardPw}
    </update>
    
    <delete id="deleteBoard" parameterType="naver.eun.board.service.Board">
        DELETE FROM board 
        WHERE board_no = #{boardNo} 
        AND board_pw = #{boardPw}
    </delete>
    
    <select id="getBoard" parameterType="int" resultType="naver.eun.board.service.Board">
        SELECT
            board_no AS boardNo 
            ,board_title AS boardTitle
            , board_content AS boardContent
            , board_user AS boardUser
            , board_date AS boardDate
        FROM board 
        WHERE board_no=#{boardNo}
    </select>
    
    <select id="getBoardList" parameterType="java.util.Map" resultType="naver.eun.board.service.Board">
        SELECT 
            board_no AS boardNo
            , board_title AS boardTitle
            , board_user AS boardUser
            , board_date As boardDate
        FROM board 
        ORDER BY board_date DESC 
        LIMIT #{beginRow}, #{pagePerRow}
    </select>
    
    <select id="getBoardCount" resultType="int">
        SELECT COUNT(*) FROM board
    </select>
    
    <insert id="insertBoard" parameterType="naver.eun.board.service.Board">
        INSERT INTO board(
            board_pw
            , board_title
            , board_content
            , board_user
            , board_date) 
        VALUES(
            #{boardPw}
            , #{boardTitle}
            , #{boardContent}
            , #{boardUser}
            ,now()
        )
    </insert>
</mapper>
cs

위와같이 만들어줍니다.

그다음 여기서 result 값으로 Board라는 객체를 리턴해주기 때문에 Board라는것이 필요해지게 됩니다.

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
package naver.eun.board.service;
 
public class Board { 
    private int boardNo;
    private String boardPw;
    private String boardTitle;
    private String boardContent;
    private String boardUser;
    private String boardDate;
    public int getBoardNo() {
        return boardNo;
    }
    public void setBoardNo(int boardNo) {
        this.boardNo = boardNo;
    }
    public String getBoardPw() {
        return boardPw;
    }
    public void setBoardPw(String boardPw) {
        this.boardPw = boardPw;
    }
    public String getBoardTitle() {
        return boardTitle;
    }
    public void setBoardTitle(String boardTitle) {
        this.boardTitle = boardTitle;
    }
    public String getBoardContent() {
        return boardContent;
    }
    public void setBoardContent(String boardContent) {
        this.boardContent = boardContent;
    }
    public String getBoardUser() {
        return boardUser;
    }
    public void setBoardUser(String boardUser) {
        this.boardUser = boardUser;
    }
    public String getBoardDate() {
        return boardDate;
    }
    public void setBoardDate(String boardDate) {
        this.boardDate = boardDate;
    }
    @Override
    public String toString() {
        return "Board [boardNo=" + boardNo + ", boardPw=" + boardPw + ", boardTitle=" + boardTitle + ", boardContent="
                + boardContent + ", boardUser=" + boardUser + ", boardDate=" + boardDate + "]";
    }
}
cs

Board를 위와같이 채워줍니다.

이렇게 하고 나면 커넥션 풀을 사용할준비가 다 된것입니다. 이제 controller 를 통해서 Dao 를 호출하고 Dao에서 커넥션을 가지고 와서 처리 과정을 처리를 해야합니다.  그렇기 때문에 먼저 controller 를 만들어줍니다.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package naver.eun.board.controller;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
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.bind.annotation.RequestParam;
 
import naver.eun.board.service.Board;
import naver.eun.board.service.BoardDao;
@Controller
public class BoardController {
    @Autowired
    private BoardDao boardDao;
    
    // 글 수정 폼 요청
    @RequestMapping(value="/boardModify", method = RequestMethod.GET)
    public String boardModify(Model model
                            , @RequestParam(value="boardNo", required=trueint boardNo){
        Board board  = boardDao.getBoard(boardNo);
        model.addAttribute("board", board);
        return "boardModify";
    }
    
    // 글 수정 요청
    @RequestMapping(value="/boardModify", method = RequestMethod.POST)
    public String boardModify(Board board){
        boardDao.updateBoard(board);
        return "redirect:/boardView?boardNo="+board.getBoardNo();
    }
    
    // 글 삭제 폼 요청(비밀번호 입력 폼)
    @RequestMapping(value="/boardRemove", method = RequestMethod.GET)
    public String boardRemove(@RequestParam(value="boardNo", required=trueint boardNo) {
        return "boardRemove";
    }
    // 글 삭제 요청
    @RequestMapping(value="/boardRemove", method = RequestMethod.POST)
    public String boardRemove(@RequestParam(value="boardNo", required=trueint boardNo
                            , @RequestParam(value="boardPw", required=trueString boardPw) {
        boardDao.deleteBoard(boardNo, boardPw);
        return "redirect:/boardList";
    }
    
    // 글 상세 내용 요청 
    @RequestMapping(value="/boardView", method = RequestMethod.GET)
    public String boardView(Model model
                            , @RequestParam(value="boardNo", required=trueint boardNo) {
        Board board = boardDao.getBoard(boardNo);
        model.addAttribute("board", board);
        return "/boardView";
    }
    
    // 리스트 요청
    @RequestMapping(value={"/","/boardList"}, method = RequestMethod.GET)
    public String boardList(Model model
                            , @RequestParam(value="currentPage", required=false, defaultValue="1"int currentPage) {
        int boardCount = boardDao.getBoardCount();
        int pagePerRow = 10;
        int lastPage = (int)(Math.ceil(boardCount / pagePerRow));
        List<Board> list = boardDao.getBoardList(currentPage, pagePerRow);
        model.addAttribute("currentPage", currentPage);
        model.addAttribute("boardCount", boardCount);
        model.addAttribute("lastPage", lastPage);
        model.addAttribute("list", list);
        return "/boardList";
    }
    
    
    // 입력(액션) 요청
    @RequestMapping(value="/boardAdd", method = RequestMethod.POST)
    public String boardAdd(Board board) { //커맨드 객체
        System.out.println(board);
        boardDao.insertBoard(board);
        return "redirect:/boardList"// 글입력후 "/boardList"로 리다이렉트(재요청)
    }
    // 입력페이지 요청
    @RequestMapping(value="/boardAdd", method = RequestMethod.GET)
    public String boardAdd() {
        System.out.println("boardAdd 폼 요청");
        return "boardAdd";
    }
}
cs

이런식으로 만들어줍니다. 여기서 따로 설명할 내용은 먼저 커맨드 객체를 받게 됩니다. 객체를 통해서 insert 등 처리를 하게 되고 특이한점은 60번줄과같이 parameter 값을 하나만 받아올수 있습니다.(model에 대해서 알아보기)

뒤에 value 는 키값이 되는것이고 required=false 이라는소리는 값이 꼭 존재하지 않아도 된다는 소리고 그 뒤에 defultvalue 의 값은 존재하지 않을때 기본적으로 들어가는 값이 됩니다.

다음으로 필요한것은

Dao 가 필요하게 됩니다 그렇기 때문에 BoardDao.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
package naver.eun.board.service;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
@Repository
public class BoardDao { 
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    
    public int updateBoard(Board board) {
        return sqlSessionTemplate.update("naver.eun.board.service.BoardMapper.updateBoard", board);
    }
    
    public int deleteBoard(int boardNo, String boardPw) {
        Board board = new Board();
        board.setBoardNo(boardNo);
        board.setBoardPw(boardPw);
        return sqlSessionTemplate.delete("naver.eun.board.service.BoardMapper.deleteBoard", board);
    }
    
    public Board getBoard(int boardNo) {
        return sqlSessionTemplate.selectOne("naver.eun.board.service.BoardMapper.getBoard", boardNo);
    }
 
    public List<Board> getBoardList(int currentPage, int pagePerRow) {
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("beginRow", (currentPage-1)*pagePerRow);
        map.put("pagePerRow", pagePerRow);
        return sqlSessionTemplate.selectList("naver.eun.board.service.BoardMapper.getBoardList", map);
    }
    
    public int getBoardCount() {
        return sqlSessionTemplate.selectOne("naver.eun.board.service.BoardMapper.getBoardCount");
    }
 
    public int insertBoard(Board board) {
        return sqlSessionTemplate.insert("naver.eun.board.service.BoardMapper.insertBoard", board);
    }
}
cs

이런식으로 해서 적어주게 되면 됩니다 . 특이한 점은 map 이라는 어트리뷰트 같은 영역안에 set 을한다는것입니다. 이렇게 set 을 하기 때문에 view 에서도 그 영역에 set 되어 있는 값을 불러올수 있게 되는것입니다.  map은 request 와 비슷하고 생명주기가 같고 키값의 형태로 값을 담을수가 있다.

'학원에서 배운것들 > TEA - P' 카테고리의 다른 글

2017-07-14-P(IoC)  (0) 2017.07.14
2017-07-13-P(의존성 주입)  (0) 2017.07.13
2017-07-06-P  (0) 2017.07.06
2017-06-27-P  (0) 2017.06.27
2017-06-26-P  (0) 2017.06.26
Comments