봉봉의 개인 블로그
2017-07-07-P 본문
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
<?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 에서 스키마로 바뀌었습니다.
<?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
<?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
<?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=true) int 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=true) int boardNo) { return "boardRemove"; } // 글 삭제 요청 @RequestMapping(value="/boardRemove", method = RequestMethod.POST) public String boardRemove(@RequestParam(value="boardNo", required=true) int boardNo , @RequestParam(value="boardPw", required=true) String boardPw) { boardDao.deleteBoard(boardNo, boardPw); return "redirect:/boardList"; } // 글 상세 내용 요청 @RequestMapping(value="/boardView", method = RequestMethod.GET) public String boardView(Model model , @RequestParam(value="boardNo", required=true) int 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 |