본문 바로가기

KOSTA

KOSTA 교육 (MVC, CRUD)

배운 내용

  1. MVC 패턴 CRUD 실습

 

1. CRUD

CRUD는 Create, Read, Update, Delete의 약어이다. 즉, 데이터베이스에 데이터를 입력(insert) 하고, 읽어(select) 오고, 수정(update) 하고, 삭제(delete) 하는 DML(Data Manipulation Language) 작업을 의미한다.

  • Client → Controller → Action → DAO → Mybatis → DB 순으로 처리된다.
  • 이전에 했던 예제를 활용하여 MVC 패턴으로 재구성하였다.
  • 게시판 구현을 위한 기본 Setting은 완료되어있다고 가정한다.(안되어있다면 CRUD 시작 날짜에서 참고한다.)

게시글 입력 및 데이터 저장 예제

Insert_form.jsp

  • 게시글을 입력한 후 submit을 통해 Controller에 action을 보낸다.

Board.xml

  • SQL 쿼리문을 작성하여 Mapper와 Mapping한다.
  • DML(insert, update, delete)는 도출된 결과만 전달하기 때문에 resultType를 선언하지 않아도 된다.
  • parameterType은 개발자의 선택에 따라 다르게 주지만 이번 예제는 BoardDTO를 선언하였다.
  • DML에 해당되는 쿼리는 Select태그가 아닌 각 역할에 맞는 DML태그를 선언해야만한다.

BoardMapper.java

  • Mapping할 추상메소드를 선언한다.
  • 위의 메소드는 DAO에서 활용하게 된다.
  • 각 CRUD위 역할에 맞게 return타입과 파라미터를 함께 선언한다.

DAO.java

  • SqlSession을 openSession해주고 re를 활용하여 commit이 되면 return해주어 데이터를 입력한다.
  • finally에 close를 꼭 실행하여 Session을 중단시켜준다.

InsertFormAction.java

  • interface의 추상메소드를 override해서 구현한다.
  • 경로를 파악하기 위해 ActionForward 객체를 생성하고 값이 없기 때문에 sendRedirect로 form.jsp로 이동한다.

Controller.java

  • Controller에서 Client에게 request를 받아 Action 로직을 처리하도록 보낸다.
  • 보낸 로직을 처리하고 forward를 보내면 Controller는 forward를 처리하여 response한다.

insert_form.jsp

  • insertform 형식이 출력된다.

Controller.java

  • form에서 입력한 정보를 List로 저장하기 위해서는 insertAction이 필요하다.
  • Controller를 추가로 생성하여 로직을 진행한다.

insertAction.java

  • BoardDTO 객체를 생성하여 set(request.getParameter())를 통해 Form에 입력된 값을 객체에 담고 DAO 메소드를 실행한다.
  • 값을 가지고 가기 때문에 dispatcher인 false를 선언하고 Controller에게 보낸다.
  • Controller는 로직을 처리하고 DB에 입력한 데이터를 추가할 것이다.

게시글 출력 예제

list_form.jsp

  • BoardDTO객체에 저장된 데이터(list)들을 forEach문을 이용해서 출력하고있다.

Board.xml

  • 게시글 리스트를 출력하기 때문에 resultType이 필요하다.
  • SQL쿼리문은 정렬하여 전체를 출력한다.

Mapper.java

  • BoardDTO의 객체들을 가진 List를 타입, BoardDTO 파라미터를 가진 메소드를 선언한다.

DAO.java

  • list에 데이터를 담아주고 list를 return한다.

ListAction.java

  • list 변수에 DB처리를 한 list를 담고 request.setAttrubute(“list”, list); 로 list에 DB처리한 list를 담고 list_form으로 dispatcher로 보낸다.

Controller.java

  • Controller의 로직 처리 후 response한다.

list_form.jsp

  • 등록된 게시글이 게시판에 표시된다.

작성글 상세보기 예제

detail_form.jsp

  • list_form에서 제목을 클릭하면 상세보기페이지로 넘어가는 구조이다.

Board.xml

  • 세부 내용을 출력하기 때문에 resultType이 필요하다.
  • SQL쿼리문은 seq(시퀀스)를 값으로 하여 전체를 출력한다.

Mapper.java

  • BoardDTO 객체 타입과 int 파라미터를 선언한 메소드를 선언한다.

DAO.java

  • DTO 객체를 생성하여 DTO에 Mapping한 메소드를 getMapper 한다.
  • DTO객체를 return한다.

DetailAction.java

  • seq값으로 내용을 받아오기 때문에 seq를 형변환 해준다.
  • DTO객체를 생성하고 Mapping된 detailBoard를 넣어준다.
  • 넣은 객체를 setAttribute하여 저장하고 detail_form.jsp로 dispatcher한다.

Controller

  • Controller는 forward를 response한다.

작성글 수정하기 예제

detail_form.jsp

  • 상세보기로 들어가면 수정하기 버튼을 클릭하여 BoardDTO 객체의 seq를 가지고 이동한다.
  • update의 경우 Form으로 detail이 가지고 있는 값을 가져가는 로직, 그리고 Form에서 수정한 값을 다시 list로 가져가는 로직 총 2개를 생성해야되겠다.

Board.xml

  • DML로서 태그는 update로 선언하고 resultType은 생략한다.

Mapper.java

  • BoardDTO 파라미터를 가진 메소드를 선언한다.

DAO

  • updateBoard메소드 호출시 Mapping된 DB가 호출된다.

updateFormAction

  • detail에 있는 값을 가져오고 Form으로 이동하는 Action이다.
  • seq(시퀀스)를 기준으로 가져오기 때문에 DTO객체 선언 후 detailBoard 메소드를 선언한다.
  • 그리고 담긴 변수를 setAttribute하여 객체에 저장한다.
  • 그리고 update_form.jsp로 값을 가지고 dispatcher한다.

Controller

  • Controller에서 forward를 response한다.

update_form.jsp

  • 가져온 값을 submit하면 updateAction.work를 Action요청한다.

updateAction.java

  • Form에서 수정된 사항을 다시 list에 표시해야한다.
  • 수정은 DTO 객체에 다시 넣어야하기 때문에 객체를 생성하여 dto.set을 통해서 getParameter로 수정된 값을 set시킨다.
  • set이 되었으면 DAO메소드를 호출하여 DB와 연동한다.
  • list로 가야하기 때문에 ListAction.work, 값을 가져가기 때문에 dispatcher한다.

Controller

  • Controller에서 forward를 response한다.

작성글 삭제하기 예제

detail_form.jsp

  • 상세보기로 들어가면 수정하기 버튼을 클릭하여 BoardDTO 객체의 seq를 가지고 이동한다.

Board.xml

  • DML이므로 resultType은 생략하고 SQL쿼리문을 작성한다.
  • seq를 가져와서 삭제한다.

Mapper.java

  • int seq 매개변수를 가지는 deleteBoard메소드를 선언한다.

DAO

  • re를 선언하여 getMapper로 DB Mapping을 하고 commit후 return시킨다.

deleteAction.java

  • seq를 선언하여 deleteBoard메소드를 선언하여 delete한다.
  • 다음 list로 가야하기 때문에 ListAction.work로 값 가져가는 것 없이 sendRedirect하면 되겠다.

Controller

  • Controller에서 forward를 response한다.

작성글 검색하기 예제

list_form.jsp

  • list 내에 검색하는 form을 생성하고 submit시 searchAction으로 이동한다.

DTO

  • 검색시 검색 기록이 하나가 아닌 중복이 될 수 있기 때문에 배열로 변수를 선언한다.
  • 검색입력창이 필요하기 때문에 입력변수를 선언한다.

Board.xml

  • search는 DML이 아니기 때문에 resultType이 필요하다. BoardDTO의 결과기 때문에 BoardDTO를 선언하고 parameterType은 검색의 역할인 SearchDTO를 선언한다.
  • SQL 쿼리문을 작성하되 동적 쿼리로 선언한다.
  • Form에서 name으로 정의한 배열인 area를 조건으로 선언하고 forEach문으로 item이 OR 연산자이면서 괄호가 쳐지게 한다.
  • 마지막으로 정렬상태로 출력한다.

Mapper.java

  • BoardDTO 객체를 가진 list가 있어야 하겠고 SearchDTO 파라미터를 가진 searchBoard 메소드를 선언한다.

DAO

  • List를 null로 생성한 후 DB와 Mapping을 통해 list에 담고 list를 return하여 메소드가 호출되면 DB Mapping된 list가 return될 것이다.

searchAction.java

  • 검색 객체를 생성하고 검색 시 입력된 값을 가져오기 위해 객체의 set을 호출하여 getParameterValues를 통해 배열인 area를, getParameter를 통해 검색값을 담는다.
    이때 SQL에 LIKE를 사용하였기 때문에 SQL에 따로 선언하기 불편하지 않게 set시 처음부터 %를 처음과 끝에 붙여 searchKey가 포함될 시 출력되게끔 조치하였다.
  • 그리고 set된 DTO객체를 list에 담고 setAttribute를 통해서 list에 담아준다.
  • 담은 list의 검색 값은 list_form.jsp에서 보여져야 하기 때문에 dispatcher한다.

검색 결과