Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

기분좋음

국비 57 일차 본문

IT 포트폴리오/국비지원교육 Diary

국비 57 일차

기분좋음:) 2022. 3. 14. 15:55
반응형

데이터베이스와 JSP 연결시키기

 

오라클에 테스트

 

-계정 생성

create user 계정명 identified by 비밀번호;
alter user usertest01 quota 100m on users;
alter user usertest01 default tablespace users;
grant connect,resource,dba to 계정명;

- 테이블 생성

create table member(
name varchar2(10) primary key,
userid varchar2(10),
userpwd varchar2(10),
email varchar2(20),
phone char(13),
admin number(1) default 0 --0:사용자, 1:관리자
);

-데이터 삽입

insert into member
values ('고길동','ko','1234','ko@naver.com','010-1234-5678',0);
insert into member
values ('박길동','park','1234','park@naver.com','010-1234-5678',0);
insert into member
values ('이길동','lee','1234','lee@naver.com','010-1234-5678',1);

 

JDBC(Java Database Connectivity)

자바 프로그램에서 데이터 베이스에 접근할 수 있도록 API를 제공하는 클래스의 집합

-자료를 쿼리하거나 업데이트 하는 방법 제공-

 

JDBC 연결하기 위한 드라이버 파일(ojdbc6.jar) 다운로드하기 (버전에 맞게)

https://fruitdev.tistory.com/89 

 

[Oracle] JDBC 드라이버 다운로드

오라클 JDBC 드라이버를 버전별로 몇개 간추려 보았다. 일반적으로 오라클 JDBC 드라이버는 하위 호환성을 가지고 있어 JDK 버전에 맞는 최신 오라클 드라이버를 이용하면 된다. 나 같은경우 오라

fruitdev.tistory.com

다운로드 한 후,  WEB-INF의 lib에 복사해 넣어준다.

 

JDBC에 연결을 위해 사용하는 클래스들은 java.sql.패키지에 포함되어 있다.

import java.sql.*  (DriverManager, Connection, Statement, PreparedStatement, ResultSet 등등)

Connection-데이터베이스 연결에 사용 인터페이스

Statement - 질의, 갱신관련 인터페이스

ResultSet - 결과물 받아오는 인터페이스

 

 

JDBC를 이용해 데이터베이스에 연결(4단계 거쳐서 진행)

1. JDBC 드라이버 로드                                                                DriverManager     
2. 데이터베이스 연결                                     →                             Connection
3. 쿼리문 실행                           사용되는 클래스, 인터페이스              Statement
4. 데이터베이스와 연결 종료                                                            ResultSet

데이터 가져오는 예제

더보기
<%@ page import="java.sql.DriverManager"%>
<%@ page import="java.sql.ResultSet"%>
<%@ page import="java.sql.Statement"%>
<%@ page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%! //선언부는 첫 방문자에 의해서 단 한번 수행된다.
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    String url = "jdbc:oracle:thin:@localhost:1521:XE";
    String uid = "hr";
    String pass ="5004";
    String sql = "select * from member";%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <table width="800px" border="1">
        <tr>
            <th>이름</th>
            <th>아이디</th>
            <th>암호</th>
            <th>이메일</th>
            <th>전화번호</th>
            <th>권한(1:관리자, 2:일반 회원)</th>
        </tr>
        <%
        try { Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, uid, pass);
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            while (rs.next()){
            	out.println("<tr>");
            	out.println("<td>" + rs.getString("name")  +"</td>");
            	out.println("<td>" + rs.getString("userid")  +"</td>");
            	out.println("<td>" + rs.getString("userpwd")  +"</td>");
            	out.println("<td>" + rs.getString("email")  +"</td>");
            	out.println("<td>" + rs.getString("phone")  +"</td>");
            	out.println("<td>" + rs.getInt("admin")  +"</td>");
            	out.println("<tr>");            	
            }
            } catch(Exception e){
            	e.printStackTrace();
            } finally {
            	try {
            		if (rs != null)
            			rs.close();
            		if (stmt != null)
            			stmt.close();
            		if (conn != null)
            			conn.close();
            	} catch(Exception e){
            		e.printStackTrace();
            	}
            }
         %>    
    </table>
</body>
</html>

Class.forName() -JDBC 드라이버를 로딩

Class.forName("oracle.jdbc.driver.OracleDriver")

DriverManager객체에서 getConnection()메소드를 통해 오라클 데이터베이스에 연결객체를 생성한다.

Connection conn=DriverManager.getConnection(url, uid, pass);

매개값 url, uid, pass는 선언부에서 선언해준다.

• url : 데이터 베이스 주소  • uid : 데이터베이스에 접속할 아이디  • upw : 접속할 아이디의 비밀번호

(오라클 sql 계정 아이디 비번)

 

URL주소 형식 -형식에 맞게 작성

jdbc:oracle:thin:[hostname]:[port]:dbname

ex) "jdbc:oracle:thin:@localhost:1521:XE"

 

Connection 커넥션 객체생성

Connection conn = DriverManager.getConnection('url' , '계정명', '비밀번호' ); 

 

Statement 객체생성

연결 완료시 표준 쿼리문을 수행하기 위한 객체(Statement)를 생성한다.

Statement stmt = conn.createStatement();

쿼리 작성시 쿼리실행할 메소드를 호출해야 한다.

메소드 설명
executeQuery() select문과 같이 결과값이 여러개의 데이터로 구해지는 경우 사용
executeUpdate() insert, update, delete 문 등 내부적으로 테이블의 내용 변경만 되고,
결과값이 없는 경우에 사용

 

ResultSet 객체 생성

select 쿼리 실행 시 결과를 받아줄 객체

String sql = "select * from member"; --테이블 명
ResultSet rs = stmt.executeQuery(sql); -- 결과 받을 객체 생성

ResultSet객체는 여러 레코드를 저장하지만, 한번에 하나의 레코드만 처리 가능하다. 

메소드 설명
next() 현재 행에서 다음 행으로 이동
previous() 현재 행에서 이전 행으로 이동
first() 현재 행에서 첫번째 행으로 이동
last() 현재 행에서 마지막 행으로 이동

성공적으로 실행시 true반환, 실패시 false 반환

 

레코드들을 순서대로 검색하기 위해 while문과 next()메소드 사용

while(rs.next()){         }

 

칼럼 데이터를 꺼낼 떄는 get타입("컬럼명")메소드를 사용 

ex) String name = rs.getString("name");

 

컬럼명이 아닌 테이블의 명시된 컬럼의 인덱스 값으로도 가져올 수 있다.

String name = rs.getString(1);
String userid = rs.getString(2);
String pwd = rs.getString(3);

 

모든 칼럼의 데이터를 꺼낼 때(칼럼 이름만 일치시 순서는 상관 없다)

 

 

 

JDBC를 통한 데이터조작- 데이터 삽입( insert문을 사용)

쿼리를 전송하기 위해서는 Statement객체의 executeUpdate메소드를 사용

stmt.executeUpdate(sql);

 

 

저장하는값이 유동적이기 때문에 변수로 작성 → sql문 작성이 복잡하므로 preparedStatement인터페이스 활용

String sql = “insert into member values (‘”+name+”’,‘”+userid +”’,’”+userpwd+”’,’”+email +”’,’”+phone+”’,”+admin+”)”; stmt.executeUpdate(sql);  --복잡

 

preparedState객체를 생성 (statement대신)

PreparedStatement psmt = conn.preparedStatement(sql);

preparedStatement에서 사용하는 쿼리문

String sql = "insert into member values(?, ?, ?, ?, ?, ?)"; --칼럼을 ? (바인드변수)로 작성 가능

? - 나중에 값을 넣어서 쿼리를 완성

psmt.setString(인덱스, 문자열);
psmt.setInt(인덱스, 숫자);

바인드 변수를 채운 후, 쿼리 실행하는 메소드 호출

psmt.executeUpdate();

 

 

커넥션 풀 (DBCP : Database Connection Pool)

커넥션 :

데이터베이스에 쿼리를 실행하기 위해 연결된 상태

 

커넥션 풀 :

-웹 페이지에 접속자가 많아지면 커넥션도 동일한 만큼 만들기 때문에 생기는 서버의 과부하를 막아주는 기법

- dbcp매니저가 미리 연결 수량을 확보하고 요청이 들어오면 확보된 커넥션을 제공하고 처리 완료되면 연결을 회수해서  재활용

 

커넥션 풀 생성을 위해 우선 프로젝트 서버에 컨텍스트 패스가 등록되어야 한다.

 

 

톰캣 사이트에 들어가서

톰캣 DBCP

왼쪽부터 순차적으로 들어간 후, 코드를 복사해준다.

 

복사 한후,

resource소스 넣을 곳

server.xml을 열고 마지막으로 내린 후,

커넥션풀 코드

복사해 온 DBCP 코드를 Context 안에 붙여넣어 준다. → 붙여넣기 한 후, 자신의 정보에 맞게 수정

 

DBCP의 설정 요소

속성 설명
initialSize 최초에 커넥션 풀을 채울 커넥션 개수
maxTotal 동시  사용 가능한 최대 커넥션 개수
maxIdle 커넥션 풀에 반납 시에 최대로 유지될 수 있는 커넥션 개수
minIdle 최소로 유지될 커넥션 개수
maxWaitMillis pool 고갈시 최대 대기시간( default = -1일 경우 무한정)

 

 

DAO 객체(Data Access Object)

• DAO 객체는 데이터베이스에 접근하기 위해 사용되는 객체

• 데이터베이스에 데이터를 조회, 추가, 수정, 삭제등의 역할

 

VO 객체(Value Object)  -자바빈

값 그자체를 나타내는 객체 (필드 값이 같다면 두객체를 같은 객체로 본다)

특정 값 자체를 표현하기 때문에 생성자를 사용 (불변성)

getter/setter외의 로직 있어도 무방함

DTO 객체(Data Transfer Object)

순수하게 데이터를 담아 계층 간으로 전달하는 객체

메서드는 getter/setter만 사용 

 

• 데이터베이스에 정보를 전달하거나 전달 받기 위해서 사용하는 객체

• 데이터베이스에 저장된 하나의 레코드 정보를 통째로 전달 하기 위해서는 레코드의 컬럼 정보와 동일한 구조로 만든      다.

 

 

 

반응형

'IT 포트폴리오 > 국비지원교육 Diary' 카테고리의 다른 글

국비 59 일차  (0) 2022.03.16
국비 58 일차  (0) 2022.03.15
국비 56 일차  (0) 2022.03.11
국비 55 일차  (0) 2022.03.10
국비 54 일차  (0) 2022.03.08