본문 바로가기
학습/JSP

7. 서블릿의 데이터베이스 연동하기(오라클)

by Elfen Lied 2022. 11. 3.
반응형

- 오라클

-- 테이블 삭제
DROP TABLE T_MEMBER;

-- 회원테이블 생성
CREATE TABLE T_MEMBER(
    U_ID VARCHAR2(10) PRIMARY KEY,
    PWD VARCHAR2(10),
    U_NAME VARCHAR2(50),
    EMAIL VARCHAR2(50),
    JOINDATE DATE DEFAULT SYSDATE
);

-- PRIMARY KEY : 기본키
-- VARCHAR2(10) : 문자열 자료형, 길이10(영문10자, 한글3자)
-- DATE : 날짜 자료형,
-- DEFAULT SYSDATE : 날짜를 입력하지않으면 현재 시각으로 설정

-- 데이터 넣을때 두가지 방법
-- 1번 방법
INSERT INTO T_MEMBER
VALUES('hong', '1212', '홍길동', 'hong@gmail',sysdate);
INSERT INTO T_MEMBER
VALUES('lee', '1212', '이순신', 'lee@gmail',sysdate);
INSERT INTO T_MEMBER
VALUES('kim', '1212', '김유신', 'kim@gmail',sysdate);

-- 2번 방법
INSERT INTO T_MEMBER(U_ID, PWD, U_NAME, EMAIL)
VALUES('hong', '1212', '홍길동', 'hong@gmail');
INSERT INTO T_MEMBER(U_ID, PWD, U_NAME, EMAIL)
VALUES('lee', '1212', '이순신', 'lee@gmail');
INSERT INTO T_MEMBER(U_ID, PWD, U_NAME, EMAIL)
VALUES('kim', '1212', '김유신', 'kim@gmail');
INSERT INTO T_MEMBER(U_ID, PWD, U_NAME, EMAIL)
VALUES('ppo', '1212', '뽀꾸', 'ppoggu@gmail');

-- 테이블의 모든 정보 보고 싶을때
SELECT * FROM T_MEMBER;

-- 원하는 정보만 보고 싶을때
SELECT U_ID, U_NAME FROM T_MEMBER; 

COMMIT;

 

 

실행할 코드 위에서 ctrl + enter 누르면 실행됨 ( 나는 2번으로 만듬)

INSERT INTO 부분은 드레그해서 선택한다음 ctrl + enter 하도록,

테이블 볼려면 왼쪽 테이블(필터링됨) 안에 있는 테이블 이름 클릭

 

INSERT 부터 VALUES  까지 드래그 한다음 ctrl +enter 로 삽입하고

SELECT로 테이블에 들어가있는지 확인하고

COMMIT 해줌.

혹시 문제가 생기면 DROP TABLE로 삭제 하면 된다.

 

 

 

- 오라클 데이터베이스와 연동하는데 필요한 드라이버 다운받기

https://mvnrepository.com/

jar 파일 받기

C:\devTools\jar 경로에 저장해둠

 

 

 

  • src/main/java에 패키지 sec01.ex01 만들고 클래스 MemberDao 만듬
  • 그리고 아래 작업을 해준다.

WEB-INF 안에 lib 안에 다운받은 ojdbc.jar 복사해서 넣어둔다

 

alt + enter 눌러서 java build path에서 Libraries 탭선택하고 오른쪽에 Add jar 선택해서

ojdbc6 찾아서 등록

 

 

package sec01.ex01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class MemberDao {
	private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
	private static final String USER = "scott";
	private static final String PWD = "tiger";
	private Connection con; // 오라클에 연동하는데 필요한 객체 //1
	private PreparedStatement pstmt; // 데이터베이스에 쿼리문 전달 //2
	
	public List<MemberVO> listMembers() { //4
		List<MemberVO> list = new ArrayList<>();
		connDB();
		String query = "SELECT * FROM T_MEMBER";
		try {
			pstmt = con.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				// @param : 테이블 컬럼(열) 이름
//				String uId = rs.getString("u_id");
//				String pwd = rs.getString("pwd");
//				String uName = rs.getString("u_name");
//				String email = rs.getString("email");
//				Date date = rs.getDate("joindate");
				
				// 변수 없이 바로 넣으면 코드 줄일수 있음
				MemberVO vo = new MemberVO(
					rs.getString("u_id"),
					rs.getString("pwd"),
					rs.getString("u_name"),
					rs.getString("email"),
					rs.getDate("joindate"));
				list.add(vo); // 리스트에 추가
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
	private void connDB() { //3
		try {
			Class.forName(DRIVER); // OracleDriver 객체 생성
			// 커넥션 객체를 얻음
			con = DriverManager.getConnection(URL, USER, PWD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

예외 나는것은 try catch로 묶어줬음.

 

 

- MemberVO 클래스 생성

 

오라클 테이블을 보고 MemberVO에 필드 코드 입력하고

get, set, toString 만들어줌

package sec01.ex01;

import java.sql.Date;

public class MemberVO {
	private String uId;
	private String pwd;
	private String uName;
	private String email;
	private Date date;
	
	public MemberVO(String uId, String pwd, String uName, String email, Date date) {
		this.uId = uId;
		this.pwd = pwd;
		this.uName = uName;
		this.email = email;
		this.date = date;
	}
	
	public String getuId() {
		return uId;
	}
	public void setuId(String uId) {
		this.uId = uId;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getuName() {
		return uName;
	}
	public void setuName(String uName) {
		this.uName = uName;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	@Override
	public String toString() {
		return "MemberVO [uId=" + uId + ", pwd=" + pwd + ", uName=" + uName + ", email=" + email + ", date=" + date
				+ "]";
	}
	
}

 

이클립스 콘솔창 확인해서 테이블 정보들 다 담기면 된다.

 

 

 

- 서블릿(MemberServlet) 생성

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/member")
public class MemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		MemberDao dao = new MemberDao();
		List<MemberVO> listMembers = dao.listMembers();
		
		out.print("<table border=1><tr>");
		out.print("<th>아이디</th>");
		out.print("<th>비밀번호</th>");
		out.print("<th>이름</th>");
		out.print("<th>이메일</th>");
		out.print("<th>가입일</th></tr> ");
		
		// 반복구간
		for(MemberVO vo : listMembers) {
//			String id = vo.getuId();
//			String pw = vo.getPwd();
//			String name = vo.getuName();
//			String email = vo.getEmail();
//			Date date = vo.getDate();
			
            // 변수 없이 바로 넣으면 코드를 줄일수 있다.
			out.print("<tr><td>" + vo.getuId() + "</td>");
			out.print("<td>" + vo.getPwd() + "</td><td>" + vo.getuName() + "</td>");
			out.print("<td>" + vo.getEmail() + "</td>");
			out.print("<td>" + vo.getDate() + "</td></tr>");
		}
	}

}

 

브라우저 확인하기.

 

 

 

- DataSource 이용해 데이터베이스 연동하기

- 커넥션풀 : 미리 데이터베이스와 연결시킨 상태를 유지하는 기술

커넥션풀을 사용하기위해 tomcat-dbcp파일을 lib 폴더에 넣고

자바 빌드패스에서 Add JARs 눌러 추가해주기

메이븐 저장소에서 받아준다.

앞서 했던 오라클 데이터베이스 연동 드라이버 설정과 똑같이 하면됨.

https://mvnrepository.com/

 

 

server 폴더에 context.xml에 해당 위치에 다음 코드를 작성해준다.

<Resource 
    	name="jdbc/oracle"
    	auth="Container"
    	type="javax.sql.DataSource"
    	driverClassName="oracle.jdbc.driver.OracleDriver"
    	url="jdbc:oracle:thin:@localhost:1521:XE"
    	username="scott"
    	password="tiger"
    	maxActive="50"
    	maxWait="-1" />

 

 

 

- 커넥션풀 설정 하고 코드 변화

package sec01.ex01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class MemberDao {
//	private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
//	private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
//	private static final String USER = "scott";
//	private static final String PWD = "tiger";

	private DataSource dataSource; // 커넥션풀 설정 추가
	private Connection con; // 오라클에 연동하는데 필요한 객체 //1
	private PreparedStatement pstmt; // 데이터베이스에 쿼리문 전달 //2
	
	public MemberDao() { // 커넥션풀 설정 추가
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context) ctx.lookup("java:/comp/env");
			dataSource = (DataSource) envContext.lookup("jdbc/oracle");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	
	public List<MemberVO> listMembers() { //4
		List<MemberVO> list = new ArrayList<>();
//		connDB();
		String query = "SELECT * FROM T_MEMBER";
		try {
			con = dataSource.getConnection(); // 커넥션풀 설정 추가
			pstmt = con.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				MemberVO vo = new MemberVO(
					rs.getString("u_id"),
					rs.getString("pwd"),
					rs.getString("u_name"),
					rs.getString("email"),
					rs.getDate("joindate"));
				list.add(vo); 
				
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
//	private void connDB() { //3
//		try {
//			Class.forName(DRIVER); // OracleDriver 객체 생성
//			// 커넥션 객체를 얻음
//			con = DriverManager.getConnection(URL, USER, PWD);
//		} catch (ClassNotFoundException e) {
//			e.printStackTrace();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
//	}
	
}

 주석 친 코드들은 커넥션풀 설정으로 필요 없게 됐고,

// 커넥션풀 설정 추가 라고 적힌 코드들이 추가 되었다.

 

 

반응형

댓글