2 분 소요

2023. 02. 06. 수업내용 정리

JDBC, 의존성, 구조체


JDBC

  • JDBC(Java Database Connector)는 주로 java.sql패키지 아래에 위치한 인터페이스 집합을 의미한다.
  • 이 인터페이스들은 자바 언어를 활용하여 DBMS에 접속, 쿼리를 실행하기 위해 요구되는 요건을 지닌 인터페이스들이다.
  • 각 다른 종류의 DBMS는 이러한 JDBC 인터페이스를 각자의 DBMS의 요구사항에 맞는 로직을 구현한 클래스들의 집합을 가진다.

  • MariaDB :MariaDB Java Client(org.mariadb.jdbc : mariadb-java-client)
  • MySQL : MySQL Connector/J (com.mysql : mysql-connector-j)
  • PostgreSQL : PostgreSQL JDBC Driver (org.postgresql = postgresql)
  • MongoDB : MongoDB Java Driver(org.mongodb : mongodb-driver)
  • 각 DBMS마다 자바와 통신하는 규격이 다름으로 사실상 DBMS 종류의 개수만큼 JDBC 의존성이 존재한다고 생각하면 된다.

  • 자바에서 JDBC를 이용하여 DBMS에 접속하기 위한 공통된 주소 표현식은 아래와 같다.
    jdbc:[DBMS 코드]://[호스트]:[포트]/[접속 스키마]?
    

    가령, 로컬 호스트에서 3306번 포트를 이용하여 실행 중인 MariaDB에 접속하기 위한 주소는 아래와 같다.

    jdbc:mariadb://localhost3306/
    


객체

  • JDBC를 이용하여 DBMS에 접속하기 위한 주된 객체는 아래와 같다.
  • Connection : Connection (java.sql.Connection) 타입의 객체는 JVM과 DBMS간의 연결을 유지하고 있는 객체이다. DriverManager(java.sql.DriverManager)로 부터 생성된다.
    • prepareStatement(x) : 쿼리인 문자열 x를 담고 있는 PreparedStatement(java.sql.PreparedStatement) 타입의 객체를 반환한다.
  • PreparedStatement : PreparedStatement(java.sql.PreparedStatement)타입의 객체는 Connection 객체를 통해 실행할 SQL 쿼리를 담고 있다. Connection(java.sql.Connection) 객체로 부터 생성된다.
    • excute() : 쿼리를 실행하고 실행 결과가 ResultSet 인가의 여부(boolena)를 반환한다.
    • excuteUpdate() : 쿼리를 실행하고 실행 결과 영향을 받은 레코드의 개수(int)를 반환한다.
    • excuteQuery() : 쿼리를 실행하고 실행 결과인 레코드 세트를 가지는 ResultSet(java.sql.ResultSet)타입의 객체를 반환한다.
    • setInt(...),setString(...),setBoolean(...) 등 : 쿼리가 가지고 있는 물음표(?) 자리에 값을 이스케이프하여 대입한다.
  • ResultSet : ResultSet(java.sql.ResultSet) 타입의 객체는 SELECT 쿼리를 실행할 때에만 사용하며, 쿼리 실행 결과 값들을 담고 있다. Iterator처럼 사용하며 레코드 별로 각 열의 값을 가지고 올 수 있다. PreparedStatement(java.sql.PreparedStatement) 객체로 부터 생성된다.
    • next() : 다음 레코드가 있는가의 여부를 반환(boolean)하고 포인터를 다음 레코드로 옮긴다.
    • getInt(...),getString(...),getBoolean(...) 등 : ResultSet 객체가 가지고 있는 데이터 중 가리키고 있는 레코드의 열 값을 반환한다.


패턴

  • MariaDB에 접속하여 SELECT를 포함하는 쿼리를 실행하기 위해 아래와 같은 패턴으로 작성한다.
    final String driverClassName = "org.mariadb.jdbc.Driver";
    final String host = "localhost";
    final int port = 33061;
    final String username = "study";
    final String password = "test1234";
    final String url = String.format("jdbc:mariadb://%s:%d",host,post);
    Class.forName(driverClassName);
    try(Connection connection = DriverManager.getConnection(url, username, password)) {
      String query = "SELECT 1 AS `value`";
      try(PreparedStatement statement = connection.prepareStatement(query)) {
        try(ResultSet resultSet = statement.excuteQuery()) {
            while(resultSet.next()) {
              int value = resultSet.getInt("value");
              System.out.println(value); //1   
            }        
         }
      }  
    }
    





의존성

  • 의존성(Dependency)은 어떠한 프로젝트가 다른 배포된 프로젝트(들)에 대해 의존적인 것 혹은 그 자체를 의미한다.
  • 직접 개발하기는 어려우며, 개발한다 하더라도 미션 크리티컬(Mission Critical)한 부분의 경우 메모리 릭(Memory Leak), 리소스 릭(Resource Leak) 및 취약점(Vulnerability) 등이 발생할 가능성이 농후함으로 잘 알려진(Well-Known), 공개적인(Public), 전문가가 제작한(Professional), 검증된(Verified) 의존성을 채택하는 것이 나은 경우가 대다수이다.


의존성 관리자

  • 의존성 관리자(Dependency Manager)는 사용할 의존성을 컴파일된 형식(jar)을 직접 다운로드 받아 프로젝트에 수동으로 포함(Import)시키는 것이 아닌, 사용할 의존성에 대한 정보(이름, 버전 등)를 기입하면 자동으로 다운로드 받아 프로젝트에 적용 시켜주는 프로젝트 빌더이다.
  • 종류는 여러가지가 있으나 크게 메이븐(Maven) 혹은 그래들(Gradle)을 사용한다.





구조체

  • 구초체(Struct)는 단일 타입으로 표현하기 힘든 데이터를 위해 별도로 만들어 사용하는 클래스(타입)이다.


엔티티(Entity)

  • 엔티티(Entity)는 DBMS의 테이블이 가지고 있는 열과 클래스의 멤버 변수가 1:1로 매칭되는 구조체이다.
  • equals(...),hashCode() 등의 동등 여부를 가릴 수 있는 메서드 등을 재정의(Override)하는 편이다.
  • 동등 여부는 주로 테이블이 가지고 있는 기본 키(Primary Key)의 동등 여부로 판단하는 편이다.


데이터 전송 객체 DTO(Data Transfer Object)

  • DTO(Data Transfer Object)는 계층간 데이터 전달이 목적인 구조체이다.
  • 가질 수 있는 멤버 변수에는 제한이 없지만 Getter 및 Setter 메서드를 제외한 로직을 구현하여서는 안된다.


값 객체 VO(Value Object)

  • 멤버 변수 및 Getter/Setter 메서드의 로직을 구현하여도 관계 없다.
  • Entity 클래스를 상속 받아 확장 기능을 구현하는 목적으로 사용하기도 한다.

태그:

카테고리:

업데이트:

댓글남기기