KOSTA 교육 45일차(MVC, CRUD)

19. 1. 8(화)

# 배운 내용

  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한다.
검색 결과

#오늘 교육 간 느낀점
오늘은 처음부터 끝까지 CRUD 작성을 해보는 실습을 진행하였다.
사실 여러가지의 기술들을 배웠지만 아직 CRUD도 기존에 작성했던 코드들과 자료들이 없으면 작성하지 못하는데 다른 기술까지 손을 대면 이도저도 안될 것 같아서 집중적으로 CRUD만 코딩했다.

혼자서 어떠한 로직을 구현해야하는지 직접 생각하고 강사님이 가르쳐주신 부분들, 구글링을 해서 얻은 정보들 등을 활용하여 내 손으로 간단한 CRUD를 구현하니 정말 뿌듯했다.

아직 2달 정도 밖에 수업을 진행하지 않았지만 처음으로 성취감을 느껴보았다.
내일부터는 본격적인 중간프로젝트가 시작된다.
중간 프로젝트를 약 2주간 진행하고 Spring을 학습한 후 최종프로젝트는 Spring을 활용하여 구현을 할텐데 빨리 배워서 새로운 기술을 접목해보고싶다.
욕심이 과하다고 할 수 있지만 현재로선 잘 하진 못하더라도 많은걸 경험해보면서 눈에 익히는 것이 하나의 공부방법이라고 생각한다.
앞으로 진행될 중간프로젝트는 꼭 팀원들에게 민폐끼치지 않고 내 역할 하면서 도움이 되는 조원이 되었으면 좋겠다.
화이팅!!