Review
KOSTA 교육 41일차(동적 쿼리, CRUD)
Tigger
2020. 6. 23. 01:35
19 . 1. 2(수)
배운 내용
- 동적 쿼리
- CRUD(Create, Read, Update, Delete)
1. 동적 쿼리
동적으로 조건이 변해야하는 경우에 SQL쿼리문을 동적으로 표현하여 사용한다.
- if, where, set, foreach 를 대표적으로 사용한다.
if 예시
- if문으로 boolean 값을 통해 SQL문 추가를 결정한다.
where 예시
- if로 해결되지 않는 구문을 where을 포함시켜 선언한다.
set 예시
- update시 set을 사용하고 password가 null이 아니면 name, password가 update 된다.
foreach 예시
- 기존 WHERE절이 있고 in을 통하여 (“ ”, “ ”) 를 해주어야 하기 때문에 open과 close로 괄호를 닫아준다. 그리고 collection의 list에 대한 반복을 한다.
2. CRUD
CRUD는 Create, Read, Update, Delete의 약어이다. 즉, 데이터베이스에 데이터를 입력(insert) 하고, 읽어(select) 오고, 수정(update) 하고, 삭제(delete) 하는 DML(Data Manipulation Language) 작업을 의미한다.
- 게시판 예제를 통하여 CRUD에 대한 전반적인 내용을 학습해보자
- 기본적인 순서는 자바 빈 생성 → form 태그 생성 → Mapping할 interface에 추상메소드를 선언 → DAO에 구현메소드 선언 → JSP 작성
기본 setting
전날의 주제에서 다뤘던 MyBatis를 세팅한 후 MyBatis로 진행하였다. 또한 테이블은 Board 클래스의 필드와 동일하게 DB에 CREATE 되어있다고 가정한다.
- 직렬화를 위하여 Serializable을 implements하여 Board.java 클래스를 구성한다.
- 여기서 필드 값은 DB에 CREATE한 컬럼과 동일해야한다.
- getter, setter, 생성자, toString 까지 기본적으로 생성해준다.
데이터 추가(CREATE)
- 먼저 입력하는 form 태그를 만든다.
- form 태그를 사용하여 submit 하면 input한 내용들이 insert_action.jsp로 이동하게 된다.
- xml 파일에 SQL문을 몰아서 선언한다.
- namespace는 Mapping할 interface의 패키지 풀 경로를 선언해준다.
- insert로 id를 insertBoard parameterType은 Board(자바 빈)를 선언한다.
여기서 id는 추상메소드의 이름과 동일하게 선언한다. - 그리고 insert문 안에 SQL 쿼리문을 작성한다.
여기서 중요한 점은 쿼리문 내의 values의 순서는 TABLE의 데이터 순서와 동일해야한다.
- interface에서 Board.xml에서 선언했던 id로 int 타입에 board를 파라미터 값으로 주어 선언한다.
- Board로 선언한 이유는 insert하는 부분에서는 Board의 객체가 필요하기 때문이다.
- 싱글톤 방식으로 BoardDao의 객체를 만들고 getInstance 메소드를 만들어 dao를 return 해준다.
- SqlSessionFactory에 mybatis_config_xml을 담는데 MyBatis의 기능인 Mapping을 하기 위함이다.
- InputStream을 in으로 선언하고 in에 Resources.getResourceAsStream(resource)를 사용하여 담고 SqlSessionFactoryBuilder().build(in)을 이용하여 return한다.
- 선언했던 insertBoard를 int 타입으로 선언한 이유는 트랜젝션을 하여 commit과 rollback을 하기 위함이다. re에 -1로 초기화를 하고 양수면 commit, 음수면 rollback을 시킨다.
- sqlSession에 openSession();을 통해 객체를 받아오고 re에 sqlSession.getMapper(BoardMapper.class).insertBoard(board);로 데이터 입력 값을 구한다.
- close 과정을 통해 Session을 정지시켜준다.
- insert문이 직접적으로 action하는 jsp 파일이다.
- 액션태그 <jsp:useBean> 을 사용하여 board 클래스를 가져온다.
- BoardDao의 dao의 getInstance()를 받아 dao를 return받게 선언하고 dao.insertBoard(board); 를 선언하여 데이터를 insert한다.
- 그리고 response.sendRedirect();를 통해 list.jsp로 이동한다.
데이터 읽기(READ)
- 글 목록을 보는 jsp파일로서 for문을 사용하여 안의 내용들을 하나씩 꺼낸다.
- board 객체를 생성하여 getter를 불러와 저장된 내용들을 불러온다.
- 또한 제목에 a태그를 사용하여 누르면 내용이 나올 수 있도록 조치할 것이다.
- form 태그를 사용하여 제목, 작성자를 area에 담고 검색text를 searchKey에 담는다.
- 자바 빈 파일로서 여러가지의 DB를 나타내야하기 때문에 배열로 선언하고 searchKey도 필드로 선언한다.
- 동일한 방식으로 생성자, getter, setter 선언한다.
- listBoard 를 id로, resultType은 Board로 결과를 나타내고, parameterType은 search 를 선언하여 자바빈을 나타낸다.
- if문 동적쿼리를 이용하여 area에 null이 있는지 확인하고 만족하면 foreach문을 사용하여 area의 item들을 separator를 사용하여 OR을 넣고 searchKey에 넣는 제목과 작성자가 나올 수 있도록 선언한다.
- List<Board>로 선언하고 파라미터를 search로 한다.
- 구현 메소드를 선언하여 해당 메소드를 list에 담아 return한다.
- 한글화를 해주고 search 객체를 생성한다.
- setArea, setSearchKey에 getParameterValues로 복수의 area를 담고 searchkey도 담는다.
- dao 객체를 생성하여 list에 메소드를 담는다. 그리고 추가될 때마다 for문에서 출력된다.
- seq를 이용하여 내용을 불러온다.
- board 객체를 생성하여 데이터를 담고 return한다.
- 파라미터가 int인 이유는 seq번호로 가져와야하기 때문이다.
- 위에 언급한 것 처럼 제목을 누르면 안의 내용을 보기 위한 코드이다.
- seq객체를 seq변수에 담고 board에 메소드를 담는다. 그리고 출력한다.
- 그리고 제목으로 클릭하여 들어가면 수정하는 기능이 있다.
이 때 ?seq=<% board.getSeq() %> 을 가져가서 수정하게 된다.
데이터 수정(UPDATE)
- form을 이용하여 updateAction.jsp로 넘어가고 수정할 때 수정 전 값을 가져오기 위해 getter를 사용한다.
- 이 때 getter를 가져오기 위해선 Board 클래스가 필요하여 액션태그로 가져왔다.
- id를 선언하고 Board객체로 파라미터를 선언한다.
- 수정을 title, contents를 하기 위해 선언하고 seq로 where절을 선언한다.
- 위 과정들과 동일하게 진행한다.
- BoardDao의 객체를 생성하고 update메소드를 담는다.
- 그리고 수정완료시 javascript를 이용하여 alert로 경고 후 location.href를 통해 list.jsp로 다시 이동한다.
데이터 삭제(DELETE)
- seq를 text에 입력하고 삭제를 누르면 삭제된다.
- 쿼리문은 위와 동일한 형식으로 선언한다.
- 삭제이기 때문에 return 타입이 없고 int seq를 파라미터 값으로 준다.
- seq객체를 seq변수에 담고 BoardDao 객체를 생성하여 메소드를 담는다.
- 그리고 sendRedirect(“”);로 강제로 보낸다.
오늘 교육 간 느낀점
오늘은 CRUD를 배웠다. DB를 연동하여 게시판을 컨트롤 하는 아주 중요한 기능이다.
생각보다 어려웠고 사실 아직 완벽하게 이해하고 작성한 코드가 많이 없다.
머리속으로 개념들이 섞여서 꼭 정리가 필요할 것 같다.
직접 게시판을 만들어보면서 계속 익숙해져야되겠다.