Class14(jdbc, 의존성, 구조체)
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
클래스를 상속 받아 확장 기능을 구현하는 목적으로 사용하기도 한다.
댓글남기기