simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 404
  • 자바프로그래밍
  • 스프링
  • 참조변수
  • 자바메모리구조
  • JVM메모리구조
  • null
  • scanner #next() #nextLine()
  • 자바
  • 자바프로그램
  • 참조타입
  • controllerTest
  • 컨트롤러

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

[DATABASE] JAVA프로그램과 DB 연결하기
Language/SQL

[DATABASE] JAVA프로그램과 DB 연결하기

2022. 4. 21. 14:29

■ JDBC란?
- 자바 APP과 DB를 연결하여 프로그래밍을 하기 위한 API (또는 이클립스에선 라이브러리라고도 부른다)
- 물리적으로는 jdbcXX.jar 파일을 의미한다.
- 우리는 jdbc.jar안의 드라이버를 통해 모든 종류의 데이터베이스를 사용할 수 있다. (EX. 오라클, mySql 등)

출처 : https://dyjung.tistory.com/50

■ 데이터베이스를 연결하기 전에 점검할 사항

1. 현재 내가 만들고자 하는 앱은 무엇인가?
- 데스크탑 앱 : 로컬에서 설치, 실행되는 앱 프로그램
- 웹 앱 : 브라우저를 통해 실행되는 앱 프로그램

2. 현재 내가 접속하고자 하는 DB 서버의 위치는 어디인가?
- 로컬 서버인가?
- 외부 클라우드 서버인가?
* DB 서버와의 연결 시, 서버 url과 사용자명, 비밀번호가 필요하기에 미리 알아두는 것이 좋다.

3. IDE를 사용하고 있고 jdbc.jar파일 경로를 입력한 적이 있다면, 라이브러리 경로가 제대로 입력되어 있는가?
- 이클립스에 jdbc.jar 파일을 import하고 경로를 옮기면 이클립스는 옮긴 jar파일 경로를 인식하지 못한다.
- 이런 경우, 프로젝트의 [properties] - [Libraries] 에서 jar파일 위치를 재설정하는 게 필요하다.
- 자주 발생하는 미스사항이므로 미리 고려해두자.

+ 이클립스에서 처음 프로젝트를 생성할 때, JRE 버전 확인하기
- JRE 버전을 높히고 다시 낮추었을 때, jdbc.jar의 위치를 인식하지 못하는 오류가 있었다.
(이유는 구글링을 해도 나오지 않아 명확하진 않지만...)
- 처음 프로젝트를 생성할 때부터 JRE 버전을 유의해서 생성하는 게 필요하다.


■ JDBC 프로그래밍을 위한 환경설정

- 프로젝트 생성 시, jdbc.jar파일 경로를 입력하기

프로젝트 > [Build Path] > [Configure Build Path]


■ JDBC 프로그래밍 절차

[ Statement를 사용한 경우 ]
- Statement는 보안성 낮다
- Secure Coding을 위해 PreparedStatement를 사용하는게 좋다. (다음 포스팅 참조)

1. DB 드라이버 로딩

2. Connection 객체를 통해 서버와 연결

3. Statement 객체를 통해 SQL명령 처리
가. SQL 명령어 세팅 : String sql = "select * from table_test";
나. SQL 명령 -> DB전송
: conn.executeQuery(sql)
- 조회 제외 : executeUpdate() 메소드 사용
- 조회 명령 : executeQuery() 메소드 사용
다. 명령에 따라 구분 분석(Parsing)
라. 실행
- 조회 제외 : create, alter, update... 등 실행
- 조회 경우 : ResultSet 객체를 통해 조회 결과를 담아 처리

4. close() 메소드를 통해 연결 해제
*연결 해제는 연결한 순서의 역순으로 해제한다.


[1] DB 드라이버 로딩

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    /*  메인 메소드 * /

}
  - 오라클 : oracle.jdbc.driver.OracleDriver
  - MySQL : com.mysql.jdbc.Driver

 

▼ 위와 같이 드라이버 로딩을 하는 이유는? - 더보기 선택

더보기

- jdbc.jar 파일을 가져오면 라이브러리를 쓸 수 있는 상태가 된다.

- 자바 라이브러리처럼, jdbc 라이브러리에서 제공하는 클래스들이 있는데,

  그 중에 하나가 OracleDriver이다.

- 라이브러리만 가져온다고 클래스 내의 기능을 쓸 수 있는 것은 아니기 때문에, OracleDriver 클래스를 사용하기 위하여 드라이버 로딩을 해주는 것이다.

 


[2] Connection 인스턴스를 통해 서버와 연결

import java.sql.Connection;
import java.sql.DriverManager;

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    public static void main(String args[]){
         //서버 url, user, pwd 정보 가져오기
         String url = " /* 서버 연결 정보 */ ";
         String user = "계정명";
         String pwd = "비밀번호";  //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
         
         //DriverManager 객체를 통해 Connection 인스턴스 형성(싱글톤 방식)
         Connection conn = DriverManager.getConnection(url, user, pwd);
    }

}

* 이클립스 내에서 아래 서버 연결 정보는 [Database Connections] - [Properties] - [Driver Properties]에서 얻을 수 있다.

양식 jdbc:[DBMS]:[데이터베이스식별자]
Oracle jdbc:oracle:드라이버종류:@호스트명:포트명:SID
MySQL jdbc:sqlserver://호스트명:포트명;databaseName=DB


[3] Statement (또는 PreparedStatement *이 부분은 다음 포스트에서) 인스턴스를 사용하여
- Statement는 보안성 낮다. 중요하니 다시 안내

아래의 코드는 조회를 한 경우 이나, Statement의 execureUpdate() 메소드를 사용하면 그 외의 명령도 수행할 수 있다.
import java.sql.Connection;
import java.sql.DriverManager;

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    public static void main(String args[]){
         //1. [연결]
         //서버 url, user, pwd 정보 가져오기
         String url = " /* 서버 연결 정보 */ ";
         String user = "계정명";
         String pwd = "비밀번호";  //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
         
         //DriverManager를 통해 Connection 인스턴스 형성(싱글톤 방식)
         Connection conn = DriverManager.getConnection(url, user, pwd);
         
         //2. [Statement]
        
         //가. SQL문 세팅
         String sql = " /* SQL문 */ ";
         
         //나. SQL명령 -> DB전송
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql); //DB상에서 구분분석 후, 받은 결과
         
         //다. 실행
         //ResultSet는 커서 역할을 하며, 파일의 BOF에서 EOF까지 가리킨다.
         //.next()는 커서가 가리키는 곳에 레코드가 있음을 true or false로 반환한다.
         while(rs.next()){
             String name = rs.getString("name"); // 칼럼의 헤딩
             int score = rs.getInt("score"); 
             
             system.out.println(name + ":" + score);
         }
         
    }

}


[4] 사용한 것을 역순으로 닫는다.

import java.sql.Connection;
import java.sql.DriverManager;

class Unknown{

    static {
	     Class.forName("  /*  DB 드라이버 이름   */  ");
    }

    public static void main(String args[]){
         //1. [연결]
         //서버 url, user, pwd 정보 가져오기
         String url = " /* 서버 연결 정보 */ ";
         String user = "계정명";
         String pwd = "비밀번호";  //좌측처럼 민감번호는 코드에 노출하면X (시큐어 코딩)
         
         //DriverManager를 통해 Connection 인스턴스 형성(싱글톤 방식)
         Connection conn = DriverManager.getConnection(url, user, pwd);
         
         //2. [Statement]
        
         //가. SQL문 세팅
         String sql = " /* SQL문 */ ";
         
         //나. SQL명령 -> DB전송
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql); //DB상에서 구분분석 후, 받은 결과
         
         //다. 실행
         //ResultSet는 커서 역할을 하며, 파일의 BOF에서 EOF까지 가리킨다.
         //.next()는 커서가 가리키는 곳에 레코드가 있음을 true or false로 반환한다.
         while(rs.next()){
             String name = rs.getString("name"); // 칼럼의 헤딩
             int score = rs.getInt("score"); 
             
             system.out.println(name + ":" + score);
         }
         
         //3. [역순으로 닫는다]
         rs.close();
         stmt.close();
         conn.close();
         
    }

}



[출처]
- JDBC https://dyjung.tistory.com/50
- 데스크탑 앱 또는 웹 앱 https://appmaster.io/ko/blog/deseukeutab-aeb-ddoneun-web-aeb-jangdanjeom

'Language > SQL' 카테고리의 다른 글

[DATABASE] 자바를 통한 DB 모듈화  (0) 2022.04.23
[DATABASE] PreparedStatement를 사용하여 시큐어코딩하기  (0) 2022.04.21
[DATABASE] JOIN  (0) 2022.04.21
[DATABASE] SEQUENCE, INDEX  (0) 2022.04.21
[DATABASE] DB모델링, 정규화와 이상현상, 역정규화  (0) 2022.04.19
    'Language/SQL' 카테고리의 다른 글
    • [DATABASE] 자바를 통한 DB 모듈화
    • [DATABASE] PreparedStatement를 사용하여 시큐어코딩하기
    • [DATABASE] JOIN
    • [DATABASE] SEQUENCE, INDEX
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바