개요
GenericServlet을 확장한 HttpServlet 클래스 이용하여 서블릿 생성
클라이언트 요청을 GET, POST등으로 구분하여 처리
리다이렉트, 리프래시를 다루는 방법 학습
초기화 매개변수를 이용 설정 정보를 외부 파일에 두는 방법 및 서블릿에서 참고하는 방법
JDBC를 이용하여 데이터베이스회원 정보를 등록, 조회, 변경, 삭제
데이터베이스에서 데이터 가져오기
데이터베이스를 사용하기 위한 요소
1) JDBC 드라이버 : 데이터베이스를 요청, 전달, 결과를 받을 때 사용할 도구 자바에서 제공하는 DB와 통신하는 기술 자바에 데이터 베이스 접근하기 위해 필요
2) SQL : 데이터베이스에 명령을 내릴 언어
1. 회원 목록 조회 구현
샘플 데이터 생성
-- 샘플 테이블 생성 create table MEMBERS ( MNO integer not null comment '일련번호', EMAIL VARCHAR(40) not null comment '이메일', PWD VARCHAR(100) not null comment '암호', MNAME VARCHAR(50) not null comment '이름', CRE_DATE DATETIME not null comment '가입일', MOD_DATE DATETIME not null comment '마지막암호변경일' ) COMMENT '회원기본정보'; -- 제약조건, 인덱스 등 설정 ALTER TABLE MEMBERS ADD CONSTRAINT PK_MEMBERS PRIMARY KEY ( MNO ); CREATE UNIQUE INDEX UIX_MEMBERS ON MEMBERS (EMAIL ASC ); ALTER TABLE MEMBERS MODIFY COLUMN MNO INTEGER NOT NULL AUTO_INCREMENT COMMENT '회원일련번호'; -- 샘플데이터 입력 INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s2@test.com','1111','임꺽정',NOW(),NOW()); INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s3@test.com','1111','일지매',NOW(),NOW()); INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s4@test.com','1111','이몽룡',NOW(),NOW()); INSERT INTO MEMBERS(EMAIL, PWD, MNAME, CRE_DATE, MOD_DATE) VALUES ('s5@test.com','1111','성춘향',NOW(),NOW());
SQL
JDBC 드라이버 준비
Type1 JDBC 드라이버 : 자바 실행환경 (Java Runtime Environment) 에 기본 포함 ODBC 드라이버를 사용
Type4 JDBC 드라이버 : MySQL 통신 프로토콜에 맞추어 데이터베이스와 직접 통신 ⇒ ODBC 드라이버를 필요로 하지 않음
서블릿 만들기
@WebServlet("/member/list") public class MemberListServlet extends GenericServlet { @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { DriverManager.registerDriver(new com.mysql.jdbc.Driver()); conn = DriverManager.getConnection("jdbc:mysql://ec2-52-79-233-2.ap-northeast-2.compute.amazonaws.com/workbook?serverTimezone=Asia/Seoul", "workbook", "password"); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from MEMBERS"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html><head><title>회원목록</title></head>"); out.println("<body><h1>회원목록</h1>"); while (rs.next()) { out.println( rs.getInt("MNO") + "," + rs.getString("MNAME") + "," + rs.getString("EMAIL") + "," + rs.getDate("CRE_DATE") + "<br>"); } out.println("</body></html>"); } catch(Exception e){ throw new ServletException(e); }finally { try {if (rs != null) rs.close();} catch(Exception e) {} try {if (stmt != null) stmt.close();} catch(Exception e) {} try {if (conn != null) conn.close();} catch(Exception e) {} } } }
Java
1) JDBC 관련 객체 선언
Connection conn = null; Statement stmt = null; ResultSet rs = null;
Java
2) JDBC API 예외 발생 대비
try { } catch(Exception e){ throw new ServletException(e); }finally { }
Java
서블릿에서 발생한 예외는 서블릿 컨테이너에 던짐
3) DriverManager가 사용할 JDBC 드라이버 등록
DriverManager.registerDriver( new com.mysql.jdbc.Driver()) // new com.mysql.jdbc.Driver() == java.sql.Driver 인터페이스 구현체
Java
java.sql.Driver 인터페이스 구현체
DriverManager에 등록됨
getMajorVersion(), getMinorVersion() : JDBC 드라이버 버전 제공
acceptsURL() : JDBC URL이 드라이버에서 사용가능한지 알려줌
connect() : 데이터베이스와 연결 수행 > Connect 객체 반환
4) DriverManager가 사용할 JDBC 드라이버 등록
DriverManager.registerDriver( new com.mysql.jdbc.Driver()) // new com.mysql.jdbc.Driver() == java.sql.Driver 인터페이스 구현체
Java
5) 데이터베이스에 연결
conn = DriverManager.getConnection("jdbc:mysql://ec2-52-79-233-2.ap-northeast-2.compute.amazonaws.com/workbook?serverTimezone=Asia/Seoul", "workbook", "password");
Java
DriverManager.getConnection(JDBC URL, DBMS 사용자 ID, DBMS 사용자 PW);
** JDBC URL의 구조
jdbc:mysql:thin:@localhost:3306:studydb // jdbc:mysql = 사용할 JDBC 드라이버 // thin = 드라이버 타입 // @localhost:3306 = 서버주소, 포트번호 // studydb = db 서비스 id
Java
⇒ java.sql.Connection 인터페이스 구현체 반환 : SQL을 실행할 객체를 얻을 수 있음
주요메서드
1) SQL문 실행 객체 반환 : createStatement(), prepareStatement(), prepareCall()
2) 트랜잭션 처리 수행 : commit(), rollback()
6) SQL 실행 객체 준비
stmt = conn.createStatement();
Java
⇒ java.sql.Statement 인터페이스 구현체 반환 : 데이터베이스에 질의하는 객체
주요 메서드
1) executeQuery() : 결과가 만들어지는 SQL문 실행 시 사용 (주로 SELECT 문에서 실행)
2) executeUpdate() : DML, DDL 실행시 사용
3) execute() : SELECT, DML, DDL 모두사용가능
4) executeBatch() : addBate()로 여러개의 SQL 등록, 한번에 실행
7) 데이터베이스에 SQL문 보내기
rs = stmt.executeQuery("select * from MEMBERS");
Java
⇒ java.sql.ResultSet 인터페이스 구현체 반환
주요 메서드
1) first() : 서버에서 첫번째 레코드 가져오기
2) last() : 서버에서 마지막 레코드 가져오기
3) previous() : 서버에서 이전 레코드 가져오기
4) next() : 서버에서 다음 레코드 가져오기
5) getXXX(컬럼명) : 특정 컬럼을 타입에 맞추어 가져오기 (getInt,getString,getDate ... )
6) updateXXX() : 특정 컬럼의 값을 변경
7) deleteRow() : 현재 레코드 지우기
8) select 결과 가져오기
while (rs.next()) { out.println( rs.getInt("MNO") + "," + rs.getString("MNAME") + "," + rs.getString("EMAIL") + "," + rs.getDate("CRE_DATE") + "<br>"); }
Java
rs.next() : t/f를 반환 다음이 있을 경우, rs 객체는 해당 레코드를 가져옴
9) JDBC 프로그래밍의 마무리
finally { try {if (rs != null) rs.close();} catch(Exception e) {} try {if (stmt != null) stmt.close();} catch(Exception e) {} try {if (conn != null) conn.close();} catch(Exception e) {} }
Java
finally에 자원을 해제하기 좋음
자원 해제 시 자원 선언의 역순으로 처리

+ Recent posts

"여기"를 클릭하면 광고 제거.