멀티캠퍼스 백엔드 과정 33일차[7월 18일] -JDBC 설정 및 데이터 베이스 연결

GoldenDusk·2023년 7월 19일
0

데이터 베이스

01. 데이터 베이스란?

JSP에서는JDBC(Java Database Connectivity)를 통해 데이터베이스와 연동

  • 게시판의 가장 기본적인 모델
  • 정보를 제공하는 측에서는 필요한 내용을 데이터베이스에 미리 입력해두고, 고객은 필요한
    콘텐츠를 웹 페이지를 통해 확인

오라클 만들기

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)
);

CREATE TABLE board(
    num number not null,
    title VARCHAR2(200) not null,
    content varchar2(2000) not null,
    id varchar2(10) not null,
    postdate date default sysdate not null,
    visitcount number(6),
    primary key(num)
);

alter table board
    add constraint board_mem_fk FOREIGN key(id)
    REFERENCES member(id);
    
create sequence seq_board_num
    increment by 1
    start with 1
    minvalue 1
    nomaxvalue
    nocycle
    nocache;
    
insert into member(id, pass, name) values ('musthave', '1234', '머스트해브');
insert into board(num, title, content, id, postdate, visitcount) 
values(seq_board_num.nextval, '제목은1입니다', '내용은1입니다', 'musthave', sysdate, 0);

select *
from member;

select *
from board;

commit;

JDBC 설정 및 데이터베이스 연결

  • JDBC API를 사용하기 위해서는 JDBC 드라이버 필요
    • JDBC 드라이버 : 오라클 버전마다 드라이버 버전이 다르기 때문에 확인
    JDBC and UCP Downloads page
  • JDBC
    • 자바로 데이터베이스를 연결하고 관리 작업할 때 사용하는 API
    • JDBC API를 사용하기 위해서는 JDBC 드라이버(오라클에서 제공)
    • 각 DBMS에 맞는 JDBC 드라이버를 다운 받고 설정 시 DBMS 종류 상관없이 동일한 방식으로 프로그래밍 가능
  • API(Application Programming Interfer)
    • 프로그램들이 서로 상호작용 하는 것을 도와주는 매개체

oracle 설정 방법

  1. D:\app`유저이름`\product\11.2.0\dbhome_1\jdbc\lib에 들어가서 ojdbc6 복사

  1. tomcat 폴더 안에 driver를 만들어서 붙여 넣어주기 : 오라클 11.2 ~ 12. jdk 7, 8, 11, 17까지

  1. 오른쪽 마우스 > Build Path > Configur Build Path

  1. objdbc.jar이 있는지 확인

  1. 이클립스와 윈도우 연동 show view > Data Source Explorer 띄우기

6 jar list 있는 거 삭제 후

7.가져온 것을 추가

8 후 설정 해주고 user name과 password는 오라클 접속 할 것에 대한 것들 설정

9.확인

02. JDBC 설정 및 데이터 베이스 연결

연결 관리 클래스 작성

  • JDBC 드라이버를 이용하여 DB와의 연결을 관리하는 클래스 생성 기본적인 DB 연결 관리 클래스
  • {프로젝트 루트}/Java Resources/src에서 마우스 우클릭 → [New] → [Class]를 클릭하여
    common 패키지에 JDBConnect 클래스를 생성
  • JDBConnect
package common;

import java.sql.Connection; //인터페이스
import java.sql.DriverManager;
import java.sql.PreparedStatement; //인터페이스
import java.sql.ResultSet; //인터페이스
import java.sql.Statement; //인터페이스

// 1) 기본적인 DB  연결 관리 클래스
public class JDBConnection {

	// 1. JDBC 드라이브 로드
	// 2. DB연결
	// 3, 연결을 통해 쿼리문을 전송
	// 4. 결과값을 확인(INSERT, UPDATE, DELETE -  성공, 실패 SELECT - ResultSet)
	// 5. 리소스 종료
	public Connection con; // 데이터베이스와 연결을 담당
	public Statement stmt; //인파라미터가 없는 정적 쿼리문 실행 시 사용
	public PreparedStatement pstmt; // 인파라미터가 있는 동적 쿼리문 실행 시 사용
	public ResultSet rs; // select 쿼리문 결과 저장 시 사용
	
	public JDBConnection() { // 생성자는 JDB 드라이버를 이용해 오라클 DB 연결하는 두 가지 일  수행
		try {
			// 1,  오라클 드라이브 로드 - 인터페이스이기 때문에 바로 쓸 수 없기에
			// 지정한 실제 클래스를 가져다 쓰겠다.
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로드 ok!");
			
			// 2. DB연결, URL은 “오라클 프로토콜@IP주소:포트번호:sid” 형식으로 구성
			String url = "jdbc:oracle:thin:@localhost:1521:orcl";
			String id="multi";
			String pwd="1234";
			7
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공(기본생성자)");
		}  
		catch (Exception e) {
			System.out.println("오라클 드라이버가 없습니다.");
			e.printStackTrace();
		}
	}
	
	public JDBConnection(String driver, String url, String id, String pwd) {
		try {
			// 1,  오라클 드라이브 로드 - 인터페이스이기 때문에 바로 쓸 수 없기에
			// 지정한 실제 클래스를 가져다 쓰겠다.
			Class.forName(driver);
			System.out.println("드라이버 로드 ok!");
			
			// 2. DB연결
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공(기본생성자2)");
		}  
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void close() { //DB관련 작업을 모두 마쳤다면 자원을 절약 해 연결 해제
		try {
			if(rs != null) rs.close();
			if(stmt != null) stmt.close();
			if(pstmt != null) pstmt.close();
			System.out.println("JDBC 자원 해제");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}
  • ConnectionTest : 동작 확인 ⇒ 실제 DB연결 테스트 하는 jsp 파일 생성
<%@ page import="common.JDBConnection" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JDBC 테스트 1</title>
</head>
<body>
<h2>JDBC 테스트 1 - 기본연동</h2>
<% 
	JDBConnection jdbc1 = new JDBConnection();
	jdbc1.close();
	// 스프링에서는 스프링 컨테이너로 가지고 감
	String driver = application.getInitParameter("OracleDriver");
	String url = application.getInitParameter("OracleURL");
	String id = application.getInitParameter("OracleId");
	String pwd = application.getInitParameter("OraclePwd");
	
	JDBConnection jdbc2 = new JDBConnection(driver, url, id, pwd);
%>
</body>
</html>
  • lib에 있는 web.xml
<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:@localhost:1521:orcl</param-value>
	</context-param>

<context-param>
		<param-name>OracleId</param-name>
		<param-value>multi</param-value>
	</context-param>

<context-param>
		<param-name>OraclePwd</param-name>
		<param-value>1234</param-value>
	</context-param>

보안성을 보안하면서 재사용도 가능한 코드로 변경

  • JDBConnect.java
package common;

import java.sql.Connection; //인터페이스
import java.sql.DriverManager;
import java.sql.PreparedStatement; //인터페이스
import java.sql.ResultSet; //인터페이스
import java.sql.Statement;

import javax.servlet.ServletContext; //인터페이스

// 1) 기본적인 DB  연결 관리 클래스
public class JDBConnection {

	// 1. JDBC 드라이브 로드
	// 2. DB연결
	// 3, 연결을 통해 쿼리문을 전송
	// 4. 결과값을 확인(INSERT, UPDATE, DELETE -  성공, 실패 SELECT - ResultSet)
	// 5. 리소스 종료
	public Connection con; // 데이터베이스와 연결을 담당
	public Statement stmt; //인파라미터가 없는 정적 쿼리문 실행 시 사용
	public PreparedStatement pstmt; // 인파라미터가 있는 동적 쿼리문 실행 시 사용
	public ResultSet rs; // select 쿼리문 결과 저장 시 사용
	
	public JDBConnection() { // 생성자는 JDB 드라이버를 이용해 오라클 DB 연결하는 두 가지 일  수행
		try {
			// 1,  오라클 드라이브 로드 - 인터페이스이기 때문에 바로 쓸 수 없기에
			// 지정한 실제 클래스를 가져다 쓰겠다.
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("드라이버 로드1 ok!");
			
			// 2. DB연결, URL은 “오라클 프로토콜@IP주소:포트번호:sid” 형식으로 구성
			String url = "jdbc:oracle:thin:@localhost:1521:orcl";
			String id="multi";
			String pwd="1234";
			
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공(기본생성자)");
		}  
		catch (Exception e) {
			System.out.println("오라클 드라이버가 없습니다.");
			e.printStackTrace();
		}
	}
	
	public JDBConnection(String driver, String url, String id, String pwd) {
		try {
			// 1,  오라클 드라이브 로드 - 인터페이스이기 때문에 바로 쓸 수 없기에
			// 지정한 실제 클래스를 가져다 쓰겠다.
			Class.forName(driver);
			System.out.println("드라이버 로드2 ok!");
			
			// 2. DB연결
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("DB 연결 성공(기본생성자2)");
		}  
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public JDBConnection(ServletContext application) {
		try {
		// JDBC 로드 =>  중요한 정보라 감춤(원래는 ConnectionTest) 서버 안쪽으로 감춤
			String driver = application.getInitParameter("OracleDriver");
			getClass().forName(driver);
			System.out.println("드라이브 연결 3 OK!");
			
			//DB연결 =>  중요한 정보라 감춤(원래는 ConnectionTest) 서버 안쪽으로 감춤
			String url = application.getInitParameter("OracleURL");
			String id = application.getInitParameter("OracleId");
			String pwd = application.getInitParameter("OraclePwd");
			con = DriverManager.getConnection(url, id, pwd);
			
			System.out.println("JDBC 연결 성공 : 생성자 3");
		}  
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void close() { //DB관련 작업을 모두 마쳤다면 자원을 절약 해 연결 해제
		try {
			if(rs != null) rs.close();
			if(stmt != null) stmt.close();
			if(pstmt != null) pstmt.close();
			System.out.println("JDBC 자원 해제");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}
  • ConnectionTest : 동작 확인 ⇒ 실제 DB연결 테스트 하는 jsp 파일 생
<%@ page import="common.JDBConnection" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JDBC 테스트 1</title>
</head>
<body>
<h2>JDBC 테스트 1 - 기본연동</h2>
<% 
	JDBConnection jdbc1 = new JDBConnection();
	jdbc1.close();
	
	// 스프링에서는 컨테이너로 가지고 감
/* 	String driver = application.getInitParameter("OracleDriver");
	String url = application.getInitParameter("OracleURL");
	String id = application.getInitParameter("OracleId");
	String pwd = application.getInitParameter("OraclePwd");
	
	JDBConnection jdbc2 = new JDBConnection(driver, url, id, pwd);
	jdbc2.close(); */
	
	JDBConnection jdbc3 = new JDBConnection(application);
	jdbc3.close();
	%>
</body>
</html>
<%@ page import="common.JDBConnection" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JDBC 테스트 1</title>
</head>
<body>
<h2>JDBC 테스트 1 - 기본연동</h2>
<% 
	JDBConnection jdbc1 = new JDBConnection();
	jdbc1.close();
	
	// 스프링에서는 컨테이너로 가지고 감
/* 	String driver = application.getInitParameter("OracleDriver");
	String url = application.getInitParameter("OracleURL");
	String id = application.getInitParameter("OracleId");
	String pwd = application.getInitParameter("OraclePwd");
	
	JDBConnection jdbc2 = new JDBConnection(driver, url, id, pwd);
	jdbc2.close(); */
	
	JDBConnection jdbc3 = new JDBConnection(application);
	jdbc3.close();
	%>
</body>
</html>

커넥션 풀로 성능 개선(1)

  • 웹 클라이언트 요청에 서버가 응답하는 구조이다.
    • 커넥션풀이란?
      • 미리 객체(Connection)를 생성해 놓고 풀(pool)에 저장해놓고 요청이 있을 때마다 이미 생성된 Connection을 렌탈하는 시스템

커넥션 풀과 JNDI

  • 대부분의 WAS는 커넥션 풀을 비롯한 여러 자원을 JNDI 서비스로 제공
  • JNDI(Java Naming and Directory Interface) : 자바 소프트웨어에서나 객체나 데이터를 전체 몰라도 이름만으로 찾아 쓸 수 있는 디렉토리 서비스

WAS(Tomcat)의 JNDI를 통해 커넥션 풀을 사용하는 프로그램 작성

  1. WAS가 시작할 때 server.xml과 context.xml에 설정한 대로 커넥션 풀을 생성한다.

    • server.xml (서버 전체에서 사용하는 객): 서버 전체와 관련된 설정 정보를 저장하고 있다.
      • *GlobalNamingResources**

      • code

        <GlobalNamingResources>
            <!-- 서버전체에서 사용하는 전역자원을 등록하는 영역이다. 서버에서 구동되는 모든 어플리케이션에서 구동해서 사용가능
        				 Editable user database that can also be used by
                 UserDatabaseRealm to authenticate users
            -->
            <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
            <Resource auth="Container"
            		  driverClassName="oracle.jdbc.OracleDriver"
            		  type ="javax.sql.DataSource" 물리적인 데이터 소스와의 연결을 생성해주는 자바 표준 인터페이스
            		  initialSize ="0" 풀의 최초 초기화 과정에서 미리 만들어놓은 연결의 개수(기본값 : 0)
            		  minIdle="5" 최소한으로 유지할 연결 개수(기본값은 0)
            		  maxTotal="20" 동시에 사용할 수 있는 최대 연결 개수(기본값은 0)
            		  maxIdle="20" 풀에 반납할 때 최대로 유지될 수 있는 연결 개수(기본값은 8)
            		  maxWaitMillis="5000" 새로운 요청이 들어 올 때 얼마큰 클라이언트가 대기할지 밀리초 단위로 지정
            		  url = "jdbc:oracle:thin:@localhost:1521:orcl"
            		  name = "dbcp_myoracle"
            		  username="multi"
            		  password="1234" />
            
          </GlobalNamingResources>
    • context.xml : 현재 서버에서 서비스하고 있는 어플리케이션 정보를 저장하고 있다.
      • 테이너 안에 돌아가는 webstudy 같은 것

      • 코드

        <Context>
        <ResourceLink global="dbcp_myoracle" name="dbcp_myoracle" type="javax.sql.DataSource"/>
            
        </Context>
  2. JSP 코드에서 JNDI서버(WAS 제공)으로부터 데이터 소스 객체를 얻어온다.

  3. 데이터 소스로부터 커넥션 객체를 가져온다.

  4. DB 작업 수행

  5. 모든 작업이 끝나면 커넥션 객체를 pool(풀)로 반환

  6. 커넥션 풀 동작 검증

    • 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 con;
      	public Statement stmt;
      	public PreparedStatement pstmt;
      	public ResultSet rs;
      	
      	public DBConnPool() {
      		
      		try {
      			//컨넥션 풀(DataSource) 얻기
      			
      			Context initCtx = new InitialContext();
      			Context ctx =(Context)initCtx.lookup("java:comp/env");
      			DataSource source =(DataSource) ctx.lookup("dbcp_myoracle");
      			
      			//커넥션 풀을 이용한 연결(Connection) 얻기
      			
      			con = source.getConnection();
      			System.out.println("커넥션 풀을 통한 연결 성공!");
      			
      		} catch (Exception e) {
                  System.out.println("커넥션 풀 연결 실패!");
      		    e.printStackTrace();
      		}
      		
      		
      	}
      	
      	public void close() {
      		try {
                    if(rs != null) rs.close();
                    if(stmt != null) stmt.close();
                    if(pstmt != null) pstmt.close();
                    if(con != null) con.close();
                    System.out.println("JDBC 자원 해제");
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      	}
      
      }
    • connectionTest.jsp

      <%@ page import ="common.JDBConnection" %>
      <%@ page import ="common.DBConnPool" %>
      
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>JDBC 테스트</title>
      </head>
      <body>
      <h2>JDBC 테스트 1 2 3 - 기본 연동</h2>
      <%
          JDBConnection jdbc1 = new JDBConnection();
          jdbc1.close();
          
          String driver = application.getInitParameter("OracleDriver");
          String url = application.getInitParameter("OracleURL");
          String id = application.getInitParameter("OracleId");
          String pwd = application.getInitParameter("OraclePwd");
          
          JDBConnection jdbc2 = new JDBConnection(driver,url,id,pwd);
          jdbc2.close(); 
          
          JDBConnection jdbc3 = new JDBConnection(application);
          jdbc3.close();
      %>
      <h2>커넥션 풀 테스트 </h2>
       <%
           DBConnPool pool = new DBConnPool();
           pool.close();
       %>
      
      </body>
      </html>
    • update

      <%@ page import="common.JDBConnection" %>
      <%@ page import="java.sql.Connection" %>
      <%@ page import="java.sql.Statement" %>
      <%@ page import="java.sql.PreparedStatement" %>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>회원 추가 테스트 - member 테이블</title>
      </head>
      <body>
      <h2>회원 추가 테스트(executeUpdate() 사용)</h2>
      <%
      	//DB 연결
      	JDBConnection jdbc = new JDBConnection();
      	
      	//테스트용 데이터 준비
      	String id ="test1";
      	String pass="1111";
      	String name ="회원입력 테스트1";
      	
      	//동적 쿼리문 작성
      	String sql = "INSERT INTO member VALUES(?, ?, ?, sysdate)";
      	PreparedStatement pstmt = jdbc.con.prepareStatement(sql);
      	// 하나하나 매칭후 넣어서 컴파일
      	pstmt.setString(1, id);
      	pstmt.setString(2, pass);
      	pstmt.setString(3, name);
      	
      	//쿼리 실행
      	int inResult = pstmt.executeUpdate();
      	out.println(inResult +"행이 입력되었습니다.");
      	
      	//연결 닫기
      	jdbc.close();
      %>
      </body>
      </html>
      <%@ page import="common.JDBConnection" %>
      <%@ page import="java.sql.Connection" %>
      <%@ page import="java.sql.Statement" %>
      <%@ page import="java.sql.ResultSet" %>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>회원의 정보를 조회하는 정적 쿼리문 테스트 - SELECT(executeQuery())</title>
      </head>
      <body>
      <h2>회원의 정보를 조회하는 정적 쿼리문 테스트 - SELECT(executeQuery())</h2>
      <%
      	//DB 연결
      	JDBConnection jdbc = new JDBConnection();
      	
      	//정적 쿼리문 작성
      	String sql = "select * from member";
      	Statement stmt = jdbc.con.createStatement();
      	
      	//쿼리 실행
      	ResultSet rs = stmt.executeQuery(sql);
      	
      	//결과값 확인
      	while(rs.next()){
      		String id = rs.getString("id");
      		String pw = rs.getString("pass");
      		String name = rs.getString("name");
      		java.sql.Date regidate = rs.getDate("regidate");
      		
      		out.println("=====================");
      		out.println(String.format("%s %s %s %s",id,pw,name,regidate)+ "<br/>");
      		
      		
      	}
      	
      	//연결 닫기
      	jdbc.close();
      %>
      </body>
      </html>

      총 과정을 보자면

    1. 프로젝트 생성
    2. DB 작업
      1. DBMS : 오라클
      2. DBA : 사용자 계정 허가, 리소스 접근 권한 허가
        1. 접속정보 : URL, id, pwd
        2. multi.member 테이블 생성, 구조(속성)
        3. 더미 데이터 입력
    3. Tomcat 서버(WAS) 작업
      1. DataSource
      2. conf > server,xml, context.xml
      3. 내장객체 : application ⇒ connection 확인
    4. 사용자 화면 설계
      1. userInsert.jsp
      • common > JDBConnection.java

      • 사용자에게 id, pass, name, regidate 입력태그

      • 오라클 데이터 베이스에 입력 쿼리 실행

      • 회원가입이 완료되었습니다. or 회원가입 실패

      • 링크 : userList.jsp

        b. userList.jsp

      • common > JDBConnection.kava

      • 조회 쿼리 실행

      • 결과에 대한 출력

    회고

    지치지 말자... 요즘 체력적으로도 정신적으로도 조금 지친다 ㅠ 주말에는 이르바이트하니까 내 시간이 아예없는 느낌 아르바이트에 사람도 들어서 배로 힘들고 정보처리 기사 준비하는데도 걱정되고 마음의 여유를 찾자!!!!

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

글이 많은 도움이 되었습니다, 감사합니다.

답글 달기