ORACLE 게시판 만들기 (D-87)

최우정·2022년 6월 20일
0

100일

목록 보기
14/17
post-thumbnail

📒 1. MEMBER 테이블을 만들어준다.

게시판 글을 작성하려면 회원 인증이 필요하므로 회원 정보를 저장할 수 있는 member 테이블을 만든다.

create table member (
id varchar2(10) not null,
pass varchar2(10) not null,
name varchar2(30) not null,
regidate date default sysdate not null,
primary key(id)
);

📒 2. JDBC 설정, 데이터베이스 연결

JDBC(Java Database Conectivity)는 자바로 데이터베이스 연결 및 관련 작업을 할 때 사용하는 API이다. JDBC API를 사용하기 위해서는 JDBC 드라이버가 있어야 한다.

API(Application Programing Interface)

  • 프로그램들이 서로 상호작용 하는 것을 도와주는 매개체라 할 수 있다.
    예) TV 리모콘

✏️ 연결 방법 1

️📝 a. 이클립스 프로젝트 폴더 만들기

이름: WebBoard

📝 b. 오라클 jdbc 드라이버 설정

ojdbc8.jar 파일을 다운받아 프로젝트 폴더 아래 webapp > WEB-INF > lib에 복사해 넣는다.

📝 c. 오라클 연결 클래스 만들기

패키지 이름: common
클래스 이름: JDBConnect1.java

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBConnect1 {
	
	public Connection conn;
	public Statement stmt;
	public PreparedStatement pstmt;
	public ResultSet rs;
	
	public void JDBConnect1() {
		try {
			// JDBC 드라이버 로드
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로드 성공1");
			
			//Database 연결
			String url = "jdbc:oracle:thin@host:1521:XE";
			String id = "c##java";
			String passwd = "java";
			conn = DriverManager.getConnection(url, id, passwd);
			System.out.println("DB 연결 성공1");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void close() {
		try {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(stmt != null) stmt.close();
			if(conn != null) conn.close();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

📝 d. 동작 확인

JSP 파일: ConnectTest1.jsp

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCConnect1 {
	
	public Connection conn;
	public Statement stmt;
	public PreparedStatement pstmt;
	public ResultSet rs;
	
	public void JDBConnect1() {
		try {
			// JDBC 드라이버 로드
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로드 성공1");
			
			//Database 연결
			String url = "jdbc:oracle:thin:@host:1521:XE";
			String id = "c##java";
			String passwd = "java";
			conn = DriverManager.getConnection(url, id, passwd);
			System.out.println("DB 연결 성공1");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void close() {
		try {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(stmt != null) stmt.close();
			if(conn != null) conn.close();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

한계점
-> 서버 변경이 생겼을 경우 클래스를 수정한 후 다시 컴파일해야 한다.
해결방안
-> 서버 관련 정보를 web.xml에 입력해 놓고, 필요할 때마다 application 내장객체를 통해 가져온다.

✏️ 연결 방법 2: web.xml 사용

서버 환경과 관련된 정보를 web.xml에 저장해 놓고 필요할 때 마다 application 내장 객체를 통해 가져온다.

📝 a.web.xml 만들기

webapp > WEB-INF > lib 폴더 아래 web.xml을 편집한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>WebBoard</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <context-param>
  	<param-name>OracleDriver</param-name>
  	<param-value>oracle.jdbc.OracleDriver</param-value>
  </context-param>
  <context-param>
  	<param-name>OracleURL</param-name>
  	<param-value>jdbc:oracle:thin:@host:XE</param-value>
  </context-param>
  <context-param>
  	<param-name>OracleId</param-name>
  	<param-value>c##java</param-value>
  </context-param>
  <context-param>
  	<param-name>OraclePasswd</param-name>
  	<param-value>java</param-value>
  </context-param>
</web-app>

📝 b. 오라클 연결 클래스 만들기

패키지 이름: common
클래스 이름: JDBConnect2.java

package common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBConnect2 {
		
	public Connection conn;
	public Statement stmt;
	public PreparedStatement pstmt;
	public ResultSet rs;
		
	public JDBConnect2(String driver, String url, String id, String passwd) {
		try {
			// JDBC 드라이버 로드
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로드 성공2");
				
			//Database 연결
			conn = DriverManager.getConnection(url, id, passwd);
			System.out.println("DB 연결 성공2");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
		
	public void close() {
		try {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(stmt != null) stmt.close();
			if(conn != null) conn.close();
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

📝 c. 동작 확인

JSP 파일: ConnectTest2.jsp

web.xml의 한계
-> DB 접속이 필요할 때마다 동일한 코드를 JSP에서 반복해서 기술해야 한다.
해결 방안
-> 컨텍스트 초기화 매개변수를 생성자에서 직접 가져올 수 있도록 정의하는 것이 좋다.

✏️ 연결 방법 3: 커넥션 풀 사용

Connection Pool은 Connection 객체를 미리 만들어 pool에 넣고, 요청이 있을 때 이미 만들어진 Connection 객체를 가져다 사용하는 방법이다.

사용이 완료된 객체는 Pool에 반납하여 필요할 때 재사용할 수 있도록 해야 한다.

대부분의 WAS는 커넥션 풀을 비롯한 여러 자원을 JNDI(Java Naming and Directory Interface)란 자바 소프트웨어에서 객체나 데이터를 전체 경로를 몰라도 '이름'만으로 찾을 수 있게 제공해 준다.

  1. WAS가 시작할 때 server.xml과 context.xml에 설정한 커넥션 풀을 만든다.
  2. JSP 코드에서 JNDI서버(WAS가 제공)로부터 데이터소스 객체를 가져온다.
  3. 데이터소스로부터 커넥션 객체를 가져온다.
  4. DB 작업을 수행한다.
  5. 모든 작업이 끝나면 커넥션 객체를 Pool에 반환한다.

📝 a.server.xml 편집

server.xml을 메모장을 이용해 연 후, <GlobalNamingResources> 요소를 찾는다. 아래 요소를 추가하고 저장한다.

톰캣 서버 conf에서 변경해야 함!

<Resource auth="Container"
	driverClassName = "oracle.jdbc.driver.OracleDriver"
	type = "javax.sql.DataSource"
	initialSize = "0"
	minIdle = "5"
	maxTotal = "20"
	maxIdle = "20"
	maxWaitMillis = "5000"
	url = "jdbc:oracle:thin:@host:1521:XE"
	name = "/jdbc/oracleDB"
	username = "c##java"
	password = "java" />

<!--
	driverClassName = JDBC 클래스 이름
	type = 데이터 소스로 사용할 클래스 이름
	initialSize = 풀의 최초 초기화 과정에서 미리 만들어 놓을 연결의 개수(기본값 0)
	minIdle = 최소 유지 연결 개수(기본값 0)
	maxTotal = 동시에 사용할 수 있는 최대 연결 개수(기본값 8)
	maxIdle = 풀에 반납할 때 최대로 유지될 수 있는 연결 개수(기본값 8)
	maxWaitMillis = 새로운 요청이 들어왔을 때 얼만큼 대기할지 밀리초 단위로 작성
	url = 오라클 연결을 위한 URL
	name = 생성할 자원(풀) 이름
	username = 계정
	password = 비밀번호
-->

📝 b. context.xml 편집

context.xml을 메모장으로 연 후, <Context> 요소를 찾아 아래 요소를 추가하고 저장한다.

톰캣 서버 conf에서 변경해야 함!

<ResourceLink global="/jdbc/oracleDB" name="/jdbc/oracleDB" type="javax.sql.DataSource" />

📝 c. 웹 서버 다시 만들기

server.xml과 context.xml을 편집했으면, 이클립스에서 웹 서버를 삭제하고 다시 만들어야 한다.

웹 서버를 다시 만들었으면, 이클립스에서 탐색기를 살펴보면, 편집된 내용이 적용된 것을 알 수 있다.

📝 d. 커넥션 풀 연결 클래스 만들기

패키지 이름: common
클래스 이름: DBConnPool.java

package common;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

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

public class DBConnPool {
	public Connection conn;
	public Statement stmt;
	public PreparedStatement pstmt;
	public ResultSet rs;
	
	// 기본 생성자
	public DBConnPool() {
		try {
			// 커넥션 풀(DataSource) 얻기
			// 1. 자바 네이밍(JNDI) 이름과 실제 객체를 연결(Context)
			Context initCtx = new InitialContext();
			// 2. 현재 웹 애플리케이션의 루트 디렉터리를 인수로 하여 Context 객체를 얻는다.
			Context ctx = (Context)initCtx.lookup("java:comp/env");
			// 3. myOracle 자원을 가져온다.
			DataSource source = (DataSource)ctx.lookup("/jdbc/oracleDB");
			// 4. 커넥션 풀을 통해 연결
			conn = source.getConnection();
			
			System.out.println("DB 커넥션 풀 연결 성공");
		}
		catch(Exception e) {
			System.out.println("DB 커넥션 풀 연결 실패");
			e.printStackTrace();
		}
	}
	
	// 객체 반환
	public void close() {
		try {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(stmt != null) stmt.close();
			if(conn != null) conn.close();
			
			System.out.println("DB 연결 객체 반납 성공");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

📝 e. 동작 확인

JSP 파일: ConnectTest3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="common.DBConnPool" %>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h2>DB 커넥션 풀 테스트</h2>
<%
	DBConnPool pool = new DBConnPool();
	pool.close();
%>	
</body>
</html>

📒 Statement 객체를 이용한 회원 등록 테스트

JDBC에서 쿼리문은 java.sql.Statement 인터페이스로 표현되며, Statement 객체는 Connection 객체를 통해 가져오도록 되어있다. Statement 계열의 인터페이스는 다음과 같이 세가지가 있다.

Statement

  • 인파라미터(IN Prameter)가 없는 정적 쿼리를 처리한다.

PreparedStatement

  • 인파라미터가 있는 동적 쿼리를 처리한다.

CallableState

  • 프로시저(Procedure)나 함수(function)를 호출할 때 사용

IN Parameter는 미리 작성해 둔, 쿼리문에서 일부 값을 나중에 결정할 수 있게 해주는 매개 변수이다. 쿼리문에서 물음표(?)로 표현한다.

Statement 계열의 객체로 쿼리문을 실행할 때는 다음의 두 메서드를 사용한다.

executeUpdate()

  • INSERT, UPDATE, DELETE 쿼리문을 실행할 때 사용한다.
  • 기존 레코드를 변화시키거나 새로운 레코드를 입력하는 쿼리문이다.
  • 실행 후 영향을 받은 행의 개수가 int 형으로 반환된다.

executeQuery()

  • SELECT 쿼리문을 실행할 때 사용한다.
  • SELECT는 기존 레코드를 조회하는 쿼리문이다.
  • 조회한 레코드들의 집합인 ResultSet 객체를 반환한다.

📝 a. 회원 추가 테스트

JSP 파일: ExeUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="java.sql.*" %>
<%@ page import="common.JDBConnect1" %>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>회원 추가 테스트</h2>
<%

	PreparedStatement pstmt = null;

	// DB 연결
	JDBConnect1 jdbc = new JDBConnect1();
	
	// 테스트용 입력값
	String id = "test1";
	String pass = "1111";
	String name = "테스트 회원1";
	
	// 쿼리문
	String sql = "INSERT INTO member VALUES(?, ?, ?, sysdate)";
	pstmt = jdbc.conn.prepareStatement(sql);
	pstmt.setString(1, id);
	pstmt.setString(2, pass);
	pstmt.setString(3, name);
	
	// 쿼리 수행
	int result = pstmt.executeUpdate();
	out.println(result + "행이 입력되었습니다.");
	
	jdbc.close();
	
%>	
</body>
</html>

📝 b. 회원 목록 보기 테스트

JSP 파일: ExeQuery.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="java.sql.*" %>
<%@ page import="common.JDBConnect1" %>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>회원 목록 조회 테스트</h2>
	
<%
	Statement stmt = null;
	ResultSet rs = null;
	
	// DB 연결
	JDBConnect1 jdbc = new JDBConnect1();
	
	// 쿼리문
	String sql = "SELECT id, pass, name, regidate FROM member";
	stmt = jdbc.conn.createStatement();
	
	// 쿼리 수행
	rs = stmt.executeQuery(sql);
	
	while(rs.next()){
		String id = rs.getString(1);
		String pw = rs.getString(2);
		String name = rs.getString("name");
		java.sql.Date regidate = rs.getDate("regidate");
		
		out.println(String.format("%s %s %s %s", id, pw, name, regidate) + "<br>");
	}
	
	jdbc.close();

%>	
</body>
</html>
profile
비전공자 Java, JavaScript, Html, Css, C++ 공부중

0개의 댓글