본문 바로가기
Today I learned

1월10일

by soheemon 2019. 1. 10.

*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.


//BoardMapper.java

간단한 쿼리는 xml파일이 아니라 Mapper파일(Mapper state?)에서 어노테이션방식으로 선언해봤다.

인자는 #{}로 가져온다는게 조금 헷갈렸다.

형식도 조금 헷갈렸다.

@insert("쿼리")

맵핑할 메서드();

public interface BoardMapper {

 

           @Insert("INSERT INTO sh_board VALUES(sh_board_seq.nextval, #{writer},#{contents},sysdate)")

           int insertBoard(Board board);

 

           @Select("SELECT * FROM sh_board order by seq desc")

           List<Board> listBoard();

 

           @Delete("DELETE FROM sh_board WHERE seq = #{seq}")

           int deleteBoard(int seq);

 

           @Select("SELECT * FROM sh_board where seq = #{seq}")

           Board detailBoard(int seq);

 

           @Update("UPDATE SH_BOARD SET writer = #{writer}, contents = #{contents}, regdate = sysdate WHERE seq = #{seq}")

           int updateBoard(Board board);

 

}


//BoardDAO

-Mapper파일의 메서드와 맵핑되는 메서드.

아직 맵핑하는 원리는 이해가 잘 안됐다;/


해당 메서드를 JAVA파일에서 호출하면

메서드내에서 또다시 Mapper파일에서 맵핑한 메서드를 호출하는 방식인것같다.

(.xml에 선언하면 id와 Mapper파일에 선언한 메서드를 맵핑하는방식으로!)


예전에는 바로 JDBC를 접근했었는데, 세션을 1회용으로 쓰고 바로 버리면 메모리를 낭비하는 비효율적인 방법이라 한다.

그래서 세션풀 방식으로 WAS에서 세션을 미리 만들어 둔 후, 요청시 쓰고 반납하는 방식을 사용한다고함.


mybatis.config.xml파일을 참고해서 세션을 생성 한 후 SqlSessionFactoryBuilder객체의 build메서드후

openSession메서드로 세션을 생성하는것 같다.


또한 DML 쿼리같은 경우는 결과에 따라 commit과 rollback을 해야함을 유의하자

public class BoardDao {

        //싱글톤 패턴

        public static BoardDao dao = new BoardDao(); //최초 1 생성

        public static BoardDao getInstance() {

               return dao;

        } //static이라 메모리에 계속 떠있으면서 재사용 가능하다.

       

        private BoardDao() {}//생성자 사용 막음.

       

public SqlSessionFactory getSqlSessionFactory() {

        String resource = "mybatis-config.xml";

        InputStream in = null;

       

        try {

               in = Resources.getResourceAsStream(resource);

        } catch (Exception e) {

               e.printStackTrace();

        }

        return new SqlSessionFactoryBuilder().build(in);

}

 

public int insertBoard(Board board) {

        int queryResult = -1;

        SqlSession sqlSession = null;

               sqlSession = getSqlSessionFactory().openSession();       

       

        try {

               queryResult = sqlSession.getMapper(BoardMapper.class).insertBoard(board);

              

               if(queryResult > 0) {

                       sqlSession.commit();

               }else {

                       sqlSession.rollback();

               }

              

        } catch (Exception e) {

               e.printStackTrace();

        }

        return queryResult;

}

 

public int deleteBoard(int seq) {

        int queryResult = -1;

        SqlSession sqlSession = null;

               sqlSession = getSqlSessionFactory().openSession();       

       

        try {

               queryResult = sqlSession.getMapper(BoardMapper.class).deleteBoard(seq);

              

               if(queryResult > 0) {

                       sqlSession.commit();

               }else {

                       sqlSession.rollback();

               }

              

        } catch (Exception e) {

               e.printStackTrace();

        }

        return queryResult;

}

 

public List<Board> listBoard() {

        List<Board> list = null;

        SqlSession sqlSession = null;

               sqlSession = getSqlSessionFactory().openSession();       

       

        try {

               list = sqlSession.getMapper(BoardMapper.class).listBoard();

              

        } catch (Exception e) {

               e.printStackTrace();

        }

        return list;

}

 

public Board detailBoard(int seq) {

        Board board = null;

        SqlSession sqlSession = null;

               sqlSession = getSqlSessionFactory().openSession();       

       

        try {

               board = sqlSession.getMapper(BoardMapper.class).detailBoard(seq);

              

        } catch (Exception e) {

               e.printStackTrace();

        }

        return board;

}

public int boardUpdate(Board board) {

        int queryResult = -1;

        SqlSession sqlSession = null;

               sqlSession = getSqlSessionFactory().openSession();       

       

        try {

               queryResult = sqlSession.getMapper(BoardMapper.class).updateBoard(board);

              

               if(queryResult > 0) {

                       sqlSession.commit();

               }else {

                       sqlSession.rollback();

               }

              

        } catch (Exception e) {

               e.printStackTrace();

        }

        return queryResult;

}


//BoardService

Controll에서 호출하는 부분이고

해당 클래스에서 DAO를 호출하여 서비스(비즈니스로직)를 처리한다.<Model에 해당>

DAO, BoardService클래스는 재사용을 위해서 싱글톤 방식으로 생성한다.

객체생성을 막기위해서 기본생성자를 private 로 선언했다.

public class BoardService {

        //dao 만들기

        public static BoardDao dao = BoardDao.getInstance();

        public static BoardService service = new BoardService();

        public static BoardService getInstance(){

               return service;

        }

        private BoardService(){};

       

        public void BoardInsertService(HttpServletRequest request, HttpServletResponse response){

               Board newBoard = new Board();

               

               newBoard.setWriter(request.getParameter("writer"));

               newBoard.setContents(request.getParameter("contents"));

               dao.insertBoard(newBoard);

        }

        public void ListBoardService(HttpServletRequest request, HttpServletResponse response){

               List<Board> list = dao.listBoard();

               request.setAttribute("list", list);

        }

       

        public void DetilBoardService(HttpServletRequest request, HttpServletResponse response){

               int seq = Integer.parseInt(request.getParameter("seq"));

               Board boardDetail = dao.detailBoard(seq);

 

               request.setAttribute("boardDetail", boardDetail);

        }

       

        public void DeleteBoardService(HttpServletRequest request, HttpServletResponse response){

               int seq = Integer.parseInt(request.getParameter("seq"));

               dao.deleteBoard(seq);


        }

        public void BoardUpdateService(HttpServletRequest request, HttpServletResponse response){

               Board updateBoard = new Board();

               updateBoard.setWriter(request.getParameter("writer"));

               updateBoard.setContents(request.getParameter("contents"));

               updateBoard.setSeq(Integer.parseInt(request.getParameter("seq")));


               dao.boardUpdate(updateBoard);

        }

}


-게시판리스트 뷰 (Boardlist.jsp)

//전체코드

<%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>블로그</title>

<style>

.singleBoard {

        padding-top: 50;

        padding-bottom: 50;

        border-color: black;

        border-style: double;

        border-width: thin;

        width: 400px;

}

 

.Boardmenu {

        padding-top: 10;

}

</style>

</head>

<body>

        <!-- Form submit 설정 -->

 

        <c:choose>

               <c:when test="${boardDetail != null}">

                       <c:set var="writer" value="${boardDetail.writer}" />

                       <c:set var="contents" value="${boardDetail.contents}" />

 

                       <c:set var="subm" value="Boardupdate.do?seq=${boardDetail.seq}" />

               </c:when>

               <c:otherwise>

                       <c:set var="writer" value="" />

                       <c:set var="contents" value="" />

 

                       <c:set var="subm" value="Boardinsert.do" />

               </c:otherwise>

        </c:choose>

        <form action="${subm}" method="post" style="width: 620; margin: auto;">

               <input type="text" name="writer" style="width: 200;" value="${writer}">

               <textarea rows="6" cols="70" name="contents">${contents}</textarea>

               <input type="submit" value="등록">

        </form>


      <!-- 게시글 표시 및 게시글 수정 삭제-->

        <div align="center">

               <c:forEach var="board" items='${list}'>

                       <div class="singleBoard">

                              <div>

                                      <span>${board.writer}</span> <span>${board.regdate}</span>

                              </div>

                              <div id="contents">

                                      <p>${board.contents}</p>

                              </div>

 

                              <div class="Boardmenu">

                                      <span><a href="BoardupdateAction.do?seq=${board.seq}">수정</a></span>

                                      <span><a href="BoarddeleteAction.do?seq=${board.seq}">삭제</a></span>

                              </div>

                       </div>

               </c:forEach>

        </div>

</body>

</html>


-Form submit설정

Form을 사용하는 기능에는 두가지가 있다.

하나는 초기에 게시글을 등록하는 기능이고

두번째는 '수정' 버튼을 클릭했을때 해당 글에 해당하는 글내용을 Form에 뿌려주고

submit을 하면 수정한 내용을 DB에 업데이트 하는 기능이다.


두가지 기능을 구분하는 방법.

사용자가 '수정' 버튼을 클릭하면 DB에 글번호를 보내서 글번호에 해당하는 board정보(글쓴이, 글내용 등..)를 

boardDetail이라는 이름으로 request scope에 저장한다.


따라서 사용자가 새로운 글을 등록하려고 하는지/기존글을 수정하려는지 구분 여부는

boardDetail Attribute 존재여부를 확인하는방법이다.

boardDetail에 따라 submit할 URI도 당연히 달라지게 된다.


이를 판단하기 위한 로직이 JSTL(choose)를 사용하는 부분이다.

        <!-- Form submit 설정 -->

 

        <c:choose>

               <c:when test="${boardDetail != null}">

                       <c:set var="writer" value="${boardDetail.writer}" />

                       <c:set var="contents" value="${boardDetail.contents}" />

 

                       <c:set var="subm" value="Boardupdate.do?seq=${boardDetail.seq}" />

               </c:when>

               <c:otherwise>

                       <c:set var="writer" value="" />

                       <c:set var="contents" value="" />

 

                       <c:set var="subm" value="Boardinsert.do" />

               </c:otherwise>

        </c:choose>

        <form action="${subm}" method="post" style="width620marginauto;">

               <input type="text" name="writer" style="width200;" value="${writer}">

               <textarea rows="6" cols="70" name="contents">${contents}</textarea>

               <input type="submit" value="등록">

        </form>


-게시글 표시 및 게시글 삭제

게시글은 list라는 Attribute에 List<Board>형태로 존재한다.

따라서 JSTL로 list를 하나씩 board에 담아와서 게시글을 뿌려준다.

수정,삭제 command에 해당하는 BoardupdateAction.do로 요청을 해주고, 글번호를 전달인자로 건네준다.


 <!-- 게시글 표시 및 게시글 수정 삭제-->

        <div align="center">

               <c:forEach var="board" items='${list}'>

                       <div class="singleBoard">

                              <div>

                                      <span>${board.writer}</span> <span>${board.regdate}</span>

                              </div>

                              <div id="contents">

                                      <p>${board.contents}</p>

                              </div>

 

                              <div class="Boardmenu">

                                      <span><a href="BoardupdateAction.do?seq=${board.seq}">수정</a></span>

                                      <span><a href="BoarddeleteAction.do?seq=${board.seq}">삭제</a></span>

                              </div>

                       </div>

               </c:forEach>

        </div>


*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.




*게시판 CRUD 복습

-복습을 위해 처음부터 끝까지 짜봤다.





'Today I learned' 카테고리의 다른 글

PL/SQL에서 변수명과 프로시저명이 같으면 안된다.  (0) 2019.01.12
12월4일  (0) 2019.01.10
1월7일  (0) 2019.01.07
1월3일  (0) 2019.01.03
2019년 1월2일  (0) 2019.01.02

댓글