[Java] JDBC란?

클라우드·2024년 4월 12일
0

Java

목록 보기
16/20
post-thumbnail

1. Database

  • 데이터베이스는 데이터의 집합체를 의미한다.
  • 대용량의 데이터 집합을 체계적으로 구성해 놓은 것.
  • 이런 데이터의 집합체는 당연히 관리가 필요하다. 프로그램으로 관리하게 된다.
  • 이런 프로그램들의 집합체를 DBMS(Database Management System)이라고 한다.
  • DBMS 종류
    • Oracle(제품명) - Oracle(제작사) - 유료(상용시장 점유율 1등)
    • MySQL(제품명) - Oracle(인수함) - 유료, 무료
    • MariaDB(제품명) - MariaDB(MySQL 제작자와 동일) - 무료
    • PostgreSQL(제품명) - PostgreSQL - 무료
    • DB2(제품명) - IBM - 메인 프레임 시장 1등
    • SQL Server(제품명) - MS

2. DBMS의 특징

  1. Integrity(무결성) : 데이터 안에 오류가 생기는 것을 막아준다. 이런 결함을 방지하기 위해서 당연히 사용자가 제약사항(constraints)을 걸어줘야 한다.
  2. 독립성 : 데이터베이스를 변경해도 기존 프로그램에는 영향이 없어야 한다.
  3. 보안
  4. 데이터 중복의 최소화

3. DBMS의 종류

  • 계층형 데이터베이스
  • 네트워크형 데이터베이스 → 계층형 데이터베이스의 단점을 극복하기 위해서 등장했지만 망했다.
  • (1970년대) E.F.Codd라는 사람이 등장함. (IBM에 근무하던 수학자) → Relational Model 논문을 발표했다.
    • IBM에서 prototype으로 만든다. ⇒ 현재의 DB2로 이어져 내려오고 있다.
    • 모든 vendor들이 관계형 데이터베이스를 만들고 이걸 사용하게 된다.
  • (1990년~) 객체지향 데이터베이스가 등장 ⇒ 큰 흥행을 하지 못했다. 하지만 객체지향 개념은 중요하다.
  • 현재는 관계형 데이터베이스에 객체지향 개념을 섞었다. ⇒ 객체-관계형 데이터베이스 ⇒ Oracle
  • 아주 최근에는 정형 데이터가 아닌 비정형 데이터가 많아졌다.
  • 이런 비정형 데이터인 경우 NoSQL 계열의 데이터베이스를 사용한다.

4. MySQL

  • MySQL community server 설치
  • 여러가지 Database Client 프로그램들을 활용한다.
  • 대표적인 유료 툴 : DataGrip(JetBrains), DBeaver(현업에서 많이 사용)
  • MySQL 무료 툴을 하나 제공해 준다. ⇒ WorkBench

4.1 데이터베이스 생성

  • WorkBench에서 확인해 보자.
  • 테이블 : 데이터가 실제로 저장되어 있는 객체
  • views : 가상의 테이블(실제 데이터를 가지고 있는 테이블이 아니라, 테이블을 이용한 가상의 테이블, 주로 회사에서도 뷰로 작업함.)
  • Stored Procedure : 자주 사용되며 효율이 필요한 쿼리들을 함수로 만들어서 프로그래머나 일반 사용자에게 함수로 제공하는 것.

5. JDBC 개요

  • JDBC는 Java Database Connectivity의 약자로 Java로 데이터베이스에 있는 값을 활용하기 위해서 사용되는 class와 interface의 집합이다.
  • 데이터베이스 vendor들은 각자 자신의 데이터베이스 운영시스템(DBMS)를 가지고 있고 이 데이터베이스를 Program 언어가 사용할 수 있도록 무엇인가를 제공해야 한다.
  • 당연히 Java인 경우는 class와 interface로 제공해준다.
  • 이렇게 제공되는 클래스 중에 DBMS와 직접적으로 통신하는 class가 있는데 이를 Driver라고 한다.
package jdbc;

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

// 1. DBMS가 제공하는 JDBC Driver class를 우리가 사용할 수 있어야 한다.
// library에 추가하자.
public class BasicJDBCConnect {
    public static void main(String[] args) throws ClassNotFoundException {
        // 2. 우리는 MySQL에 연결한다.
        // MySQL에 연결하기 위한 JDBC Driver를 프로그램 안으로 로딩해야 한다.
        // 드라이버 로딩
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("드라이버 로딩 성공");
            // 3. 드라이버 로딩이 성공하면 실제 데이터베이스에 접속해보자.
            // 계정 ID, PW, 접속하려는 데이터베이스에 대한 URL이 있어야 한다.
            // 데이터베이스에 대한 URL => JDBC URL 이라고도 한다.
            String myId = "root";
            String myPW = "jiyun9163!";
            String JDBC_URL = "jdbc:mysql://localhost:3306/employees?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true";
            Connection con = DriverManager.getConnection(JDBC_URL, myId, myPW);
            System.out.println("데이터베이스 접속 성공");
            // 3. Connection 객체를 얻었으면 이제 SQL Query를 작성해서 전달해야 하는데
            // 이 SQL을 실어서 보낼 객체가 하나 필요하다.
            // 이 객체를 Statement라고 한다. 이 Statement는 크게 3가지 종류가 있다.
            // 제일 간단한 형태인 Statement
            // Stored Procedure을 호출할 수 있는 CallableStatement가 있다.
            // 이 중에서 우리는 PreparedStatement를 이용할 것이다.
            // 이름에서 의미하다시피, 이 Statement는 SQL Query를 가지고 있는 statement이다.
            String sql = "select * from employees where gender='F'";
            PreparedStatement pstmt = con.prepareStatement(sql);
            // 4. 이렇게 전달할 Statement를 만들었으면
            // 이제 실행하면 된다. => SQL Query를 실행할 수 있다.
            // 하지만 실행하려는 SQL이 Select 계열이면 => 결과 레코드 집합을 가져오는 거
            // 이때 사용하는 method는 executeQuery()를 이용한다.
            // 그러면 이때 return 값은 어떻게 받으면 되나요? => ResultSet으로 받는다.
            ResultSet rs = pstmt.executeQuery();

            // 5. ResultSet을 이용해서 데이터 추출(로직 처리)
            rs.next();
            String firstName = rs.getString("first_name");
            System.out.println(firstName); // Bezalel
            rs.next();
            firstName = rs.getString("first_name");
            System.out.println(firstName); // Anneke

            // 6. 사용된 자원의 반납
            // 사용한 여러 자원들을 close 시켜서 정상 종료를 해줘야 한다.
            // 사용한 자원들을 생성과 반대 순서로 close 처리 해줘야 한다.
            rs.close();
            pstmt.close();
            con.close();

        } catch (Exception e) {
            System.out.println("오류");
        }

    }
}

6. VO, DO, Entity, DTO

  • DO(Domain Object) : 연관성이 있는 데이터 객체 1개를 지칭하는 용어
  • 예를 들면 학사 관리 프로그램 → 학번, 이름, 학과, 나이, 학년, 학점, …
  • (1000, 홍길동, 철학, 20, 1, 3.5), (홍길동, 철학, 20, 1, 3.5)
  • VO(Value Object) : DO인데 값에 초점을 맞춘 객체
  • Entity : DO인데 반드시 primary key가 포함되어 있다.
  • DTO(Data Transfer Object) : DO인데 데이터 전달에 목적이 있다.
  • 하지만 결과적으로 다 비슷하게 생겼고, 큰 차이를 두고 사용하지 않는다. 혼용해서 사용한다.
  • 가장 대표적인 용어는 VO이다.
profile
안녕하세요 :)

0개의 댓글