[Servlet/JSP] JDBC

aljongjong·2021년 12월 16일
0

학원 복습일지

목록 보기
35/84

어젠 mvc 패턴을 적용해 controller에서 기능을 구현하는 Service와 DB에 접근하는 DAO까지의 역할을 나누는 것까지 배웠다. 오늘은 DAO에서 DB에 접근하는 것을 배웠다. 킹론상 어렵게 느껴지지 않았지만 이런 저런 Servlet, JSP 기능들을 많이 배우다보니 언제 어디서 어떤 메소드를 사용하고 어떤 기능을 써야하는지 떠오르는게 쉽지 않다. 일단 어제 만들었더 DAO 클래스에서 DB로 접근해보자.

1) 먼저 JDBC 드라이브를 사용할 DB에 맞게 WEB-INF/lib 폴더안에 다운 받아준다. 그리고 oracle.jdbc.driver.OracleDriver 이란 클래스 등록해주고 DriverManager를 통해서 connection을 가져온다.(오라클에 접근해서 연결, 커넥션을 얻어온다. / url을 통해 id와 pwd로 커넥션을 가져온다.)



*getConnection의 매개변수로 내가 접근할 DB, 그 DB에 접속하는 id와 password를 입력해준다.

2) 그리고 우리가 연결한 커넥션에 쿼리를 작성할 워크시트를 createStatement를 통해 생성하고, executeQuery로 쿼리를 실행하고 실행한 결과를 resultset에 저장한다.


3) 그리고 next 메소드를 사용하는데 next 메소드는 반환형이 boolean인 메소드로 처음 resultset의 커서는 공백을 가르킨다(첫번째 로우 위, 0번째 칸) 그래서 다음 로우에 데이터가 있으면 true 없으면 false를 반환하는 next메소드 사용한다. getInt 메소드는 가져올 데이터의 타입에 따라 String 등으로 변경할 수 있고 매개변수로 가져오는 데이터의 컬럼명 또는 컬럼 인덱스로 작성해준다. 그리고 DB에서 가져온 데이터를 확인한다.

4) 보낸 쿼리문이 더미테이블인 DUAL 테이블에서 1을 가지고 오는걸 확인할 수 있다.

5) 이걸 응용해서 기존에 내가 DB에 저장하고 있는 EMPLOYEE 테이블에 접근해본다. 쿼리 스트링으로 userId(이름)를 받아 EMPLOYEE 테이블에 존재하는 이름이면 정보를 가지고 오고 없으면 없는 사람이라고 표시해준다.

6) 우리가 연결한 커넥션에 새로운 Statement를 생성해주고 거기에 EMPLOYEE 테이블에 접근하는 쿼리문을 실행해준다. 그리고 조건문을 통해 그 Resultset이 존재하면 DB에서 데이터를 가지고오고 없으면 존재하지 않는 회원이라고 콘솔에 띄어본다.


7) 먼저 EMPLOYEE 테이블에 없는 이름은 전달해보고 결과를 확인한다.


8) 그리고 테이블에 존재하는 이름은 전달해보고 결과를 확인한다.


9) 이제 dummy 테이블의 데이터나 기존의 생성된 테이블에서 데이터를 가지고 오지 않고 데이터를 DAO를 통해 넣어보고 넣은 데이터를 꺼내보는 프로젝트를 만들어본다. 먼저 프로젝트를 만들고 회원가입과 회원조회를 할 수 있는 jsp 페이지를 만들어준다.





10) 그리고 회원가입, 회원조회 페이지의 요청에 반응하는 Servlet을 만들어준다. 먼저 회원가입 페이지 요청에 반응하는 Servlet을 살펴보면, 회원가입 페이지의 요청과 함께 전달된 데이터를 getParameter를 통해 담고, 위의 과정과 같이 Class를 등록하고 DriverManager로 커넥션을 가져와서 Statement로 워크시트를 만들어 회원가입에 맞게 Insert문을 작성한 쿼리를 넣어준다. 여기에서 Statement를 PreparedStatement로 사용했다. PreparedStatement를 사용하는 첫번째 이유는 Statement는 사용에 있어서 번거로움이 있다. 사용자의 요청과 함께 전달된 데이터를 변수에 넣고 그 변수를 쿼리문에 중간중간 넣어주면 계속 따옴표를 써줘야해서 실수가 발생할 수 있고 작성하기도 번거롭다. 하지만 PreparedStatement은 쿼리문 중간 중간에 넣을 사용자가 보내준 데이터를 담은 변수를 ?로 표현해서 쿼리문을 작성하고 그 불완전한 쿼리문을 prepareStatement의 매개변수로 전달해준다. 그리고 set메소드를 통해 ?의 인덱스와, 들어갈 변수를 설정해주면 완성이 된다. 그리고 보완상의 문제도 있다. sql의 주석 표현인 "--"를 사용자가 사용하여 요청시 테이블을 삭제하는 쿼리문을 보내거나 admin에 접근하는 데이터를 보낼 수도 있기 때문이다.
작성한 쿼리문은 회원가입을 할 Insert문이므로 SQLdeveloper를 통해 MEMBER 테이블을 먼저 생성해주고 접근해본다.







*MEMBER 테이블에 데이터가 잘 INSERT된 걸 확인할 수 있다.

11) 이제 회원조회 페이지의 요청에 반응하는 Servlet을 만들어준다.

12) 조회할 ID를 사용자가 요청과 함께 보내주면 getParameter로 데이터를 받고 위와 같은 방법으로 prepareStatement로 MEMBER 테이블의 아이디를 검색하는 쿼리문을 ?을 사용하여 불완전한 상태로 매개변수로 전달해준다. 그리고 setString 메소드로 사용자가 요청과 함께 보내준 id 데이터를 넣어준다. 그리고 ResultSet에 완성된 쿼리문을 실행한 결과를 넣어주고 테이블 컬럼명을 통해 데이터를 가져와 출력해본다.




13) DB에 잘 접근해서 데이터를 가져오는 것 까지 확인할 수 있다.

0개의 댓글