[Web] 서블릿 비즈니스로직 처리

kiwonkim·2021년 5월 19일
0

서블릿과 DB연동

  1. 클라이언트가 DB 처리 요청
  2. 서블릿이 DAO 객체 생성.
  3. DAO가 DB와 연결 맺음.
  4. DAO에서 VO 객체 생성 후 쿼리 실행. 쿼리 결과를 next() 시켜가며 VO객체에 set함수로 저장.
  5. DAO가 서블릿에게 쿼리 결과를 VO 객체 리스트로 만들어 전송.
  6. 서블릿은 리스트를 순회하며 response.getWriter()로 클라이언트 화면에 html 형태로 출력

서블릿 : 요청이 들어오면 DAO 객체 생성 및 최종결과 클라이언트에게 전송
DAO : DB와 연결 수립 및 쿼리문 실행. 쿼리 결과를 VO 객체에 저장.
VO(DTO) : DB 컬럼명으로 된 변수와 set/get 함수로 구성. 객체가 쿼리 결과 저장에 사용됨.

쿼리문을 통해 t_member 테이블 생성 및 삽입.
오라클의 경우 수동커밋이므로 커밋 꼭 해줄 것.

<select * from t_member로 t_member 테이블 조회 결과>

Project 우클릭 -> open module setting
Libraries 탭 Java 클릭.JDBC 경로로 들어가서 JDBC 추가.


MemberVO

VO 클래스는 쿼리 결과를 담는 그릇.
DB 데이터와. 데이터들의 set , get 함수로 구성되어있음.

MemberDAO

DAO클래스는 DB 연결 및 쿼리문 수행 후 결과를 VO 객체에 저장하여 Servlet에게 반환한다.

연결을 수행하는부분.
드라이버를 로딩. 연결 수행. 쿼리문을 수행할 Statement 인터페이스 생성.
executeQuery, executeUpdate 등의 메서드를 갖는다.

Statement는 DBMS에 string 형태로 쿼리 전송. DBMS가 직접 컴파일 해야하므로 속도가 느리다.
반면 Statement 를 상속하는 PreparedStatement 인터페이스는 컴파일 후 DBMS에게 쿼리 전송. 속도가 빠르며 쿼리문 작성시 ? 를 활용할 수 있어 주로 사용된다.

connDB 로 연결을 수행하면.
stmt 인터페이스의 executeQuery 메서드를 통해 string을 넘겨줘 쿼리를 실행하고. 결과를 ResultSet 객체에 저장한다.

Resultset 객체
Resultset은 쿼리 실행 결과를 테이블 형태로 가져오며.
"get데이터타입" 메서드를 통해 현재 행의 컬럼명이나 컬럼번호 값을 가져올 수 있다.
ResultSet의 행 번호 자유롭게 움직이기
absolute(int row) - 지정한 행으로 이동
beforeFirst() - 커서를 처음 행으로 이동
afterLast() - 커서를 마지막 행으로 이동
first() - 처음 레코드가 존재하는 행으로 이동
last() - 마지막 레코드가 존재하는 행으로 이동
next() - 다음 레코드 행으로 이동
previous() - 이전 레코드 행으로 이동

행을 돌며 컬럼 값들을 읽어와 변수에 임시저장하고.
vo객체의 set함수를 통해 테이블 결과를 그릇인 vo 객체에 저장하여 list화 후 리턴한다.

MemberServlet

Servlet은 DAO의 쿼리문 수행결과인 list를 순회하며.
html 형태로 브라우저 화면단에 response.getWriter().print 를 활용하여 출력을 담당한다.

실행결과


Connection Pool(DataSource)

DAO와 VO를 이용하면 DB 접근시 마다 연결해야함.
-> 연결로 인한 오버헤드 발생.

톰캣 실행시 특정 DB와 연결된 ConnectionPool 객체 생성 가능
속도 향상을 위해 이름과 ConnectionPool 객체를 JNDI(자바 딕셔너리)로 매핑.
필요시 ConnectionPool 객체의 메서드를 이용해 통신하면됨.

  1. JDBC와 ConnectionPool 관련 jar(DBCP.jar) 파일 설치.
  2. context.xml에 연결 데이터베이스 정보를 JNDI로 설정.
  3. DAO 클래스에서 연동시 미리 설정한 JNDI라는 이름으로 연결해서 작업.

module setting에서 DBCP 라이브러리 추가.

IntelliJ 에서의 Context.xml 생성.

에러 발생시 라이브러리 두개 추가.

context.xml 수정으로 미리 사전 연결 설정.

MemberDAO 생성자가 Java JNDI에서 context.xml에 설정한 이름 jdbc/oracle을 통해 톰캣이 oracle과 미리 연결한 DataSource 받아와 DataSource 변수인 dataFactory 에저장.

DataSource의 getConnection 함수로 DB와 연결.
쿼리를 수행해 preparedStatement 변수에 저장.
컴파일 된 채로 DBMS에 넘겨 ResultSet 획득.

실행결과는 동일하다.

Insert와 Delete

<form.html>
삽입과 삭제시 HTML의 form 태그에 값을 입력하게 되며.
JS를 이용해 Null 검사를 수행하고. JS가 Servlet에게 submit을 수행한다.

<Servlet.java>
서블릿은 클라이언트가 보낸 request를 getPrameter를 통해 값을 확인하고.
hidden 태그 값을 통해 삽입/삭제중 무엇을 할지 정한 뒤.
삽입의 경우 VO 객체를. 삭제의 경우 Id를 인자로 넣어 DAO의 메서드를 호출한다.
삭제의 경우 브라우저 출력 html에서 삭제를 클릭할 경우, url을 통해 자기자신에게 삭제 정보를 넘겨주도록 구현.

<DAO.java>
DAO는 DB에 접근할 때마다 미리 연결된 datasource를 활용해 연결을 수행하고.
VO객체나 삭제할 id를 입력받아 쿼리문을 통해 삽입/삭제를 수행한다.
PreparedStatement의 insert문은 ?를 사용하는데.
pstm 객체의 setString(순서, 변수) 를 통해 쿼리문 몇번째 ?에 변수를 대입할지 정해준다.
Select 의 경우 executeQuery 메서드로 결과를 반환하고.
Insert/Delete/Update 의 경우 executeUpdate 메서드로 성공 유무를 반환한다.

0개의 댓글

관련 채용 정보