JDBC(Java Database Connectivity)

2022. 11. 2. 00:24자바 & Spring

이번 포스팅에서는 jdbc에 대한 개념과 문제점을 살펴볼 것이다. 

 

관계형 데이터베이스(Relational Database)는 신뢰할 만한 데이터 저장소로, 많은 어플리케이션이 관계형 db 를 사용한다.

  • DB에 데이터를 저장, 관리하려면 SQL을 사용해야 한다.
  • 자바로 작성한 애플리케이션은 JDBC API를 사용해 SQL을 데이터베이스에 전달한다.

 

JDBC 란?

Java Database Connectivity 의 줄임말

자바 프로그램에서 데이터베이스에 접속할 수 있는 자바 API 이다.

  • DB의 종류와 상관없이 DB에 관련된 작업들을 처리할 수 있도록 도와준다.
  • JDBC는 데이터베이스에 query를 전달하고, 결과를 받아온다.

자바에서 DB 접근에 기반이 되는 기술로서, 이를 확장한 Spring-jdbc, Datasource 등은 더 나은 기술을 제공한다.

 

 

jdbc를 통한 데이터베이스 연결 방법

드라이버 로딩

  • 각 데이터베이스에 맞는 드라이버를 사용해야 한다.
  • 이 드라이버를 프로젝트의 classpath에 넣음.

Mysql com.mysql.cj.jdbc.Driver

Oracle oracle.jdbc.driver.OracleDriver
MSsql com.microsoft.sqlserver.jdbc.SQLServerDriver

 

 

url로 db에 연결

각 db에 맞는 url을 사용하여 연결한다.

(예시 - mysql 에 연결)

jdbc:mysql://주소:포트번호/db이름?파라미터

url: jdbc:mysql://localhost:3306/db?serverTimezone=UTC&characterEncoding=UTF-8

 

예시: application.yml (mysql driver 사용)

JDBC API 를 사용해 sql을 데이터베이스에 전달하고 결과를 반환받는다.

개발자는 이 sql을 활용할 줄 알아야 하며 sql을 사용해 자바 어플리케이션을 개발한다.


SQL을 직접 다룰 때의 문제점

데이터베이스는 객체 구조와는 다른 데이터 중심의 구조를 가지고 있다.

개발자가 객체 지향 어플리케이션과 DB 중간에서 SQL 과 JDBC API를 사용해 변환 작업을 직접 해주어야 한다.

 

1. 수많은 반복

  • 너무나 많은 SQL, JDBC API를 코드에서 호출해야 한다.
  • 테이블마다 위 같은 작업을 계속해서 반복해야 한다.
  • 따라서 코드가 너무 복잡하고, 불필요한 것이 많아진다.

 

2. SQL에 의존적인 개발을 하게 된다.

예를 들어, 회원 객체를 데이터베이스에 관리할 목적으로 다음과 같은 MemberDAO 를 만들었다고 하자.

public class MemberDAO{
	public Member find(String memberId){...}
	public void save(Member member){...}
	public Member deleteMember(String memberId){...}
}

 

DAO의 함수안에서 SQL문으로 INSERT, DELETE , SELECT 등을 하게 된다.

이는 SQL에 의존적인 개발을 하게 되는 것이고, 코드의 확장과 변경을 어렵게 만든다.

 

Member 엔티티를 확장하거나 변경해야 될 상황일 때

  • 기능을 추가하거나 변경할 때, 어떤 SQL이 실행되고 있는지 어떤 객체들이 조회되는지를 일일이 확인하고 수정해야 한다.

Member 객체에 에 필드가 하나 추가된다면?

  • Member 객체를 사용하는 모든 로직을 변경해야 한다.

SQL에 의존적인 개발은 중노동에 가까운 처리량이 들고, 객체 지향의 큰 장점인 확장과 변경을 어렵게 만든다.

 

 

결론

엔티티를 신뢰할 수 없다.

  • SQL에 모든 것을 의존하는 상황에서, 개발자들이 엔티티를 신뢰하고 사용할 수가 없다. DAO를 열어서 어떤 SQL이 실행되고 어떤 객체들이 함께 조회되는지 일일이 확인해야 한다.

진정한 의미의 계층 분할이 어렵다.

  • 물리적으로 SQL과 JDBC API를 데이터 접근 계층에 숨기는데는 성공했으나, 논리적으로는 진정한 의미의 계층 분할이 이뤄지지 않는다. → 엔티티와 SQL이 아주 강한 의존관계를 가지고 있기 때문.

 

JPA의 필요성

위 같은 문제는 오랫동안 자바 진영에서 고민해왔었고, 이를 해결해주기 위해 고안되고, 개발된 것이 JPA 라는 것이다.

JPA가 제공하는 API를 사용해 개발하면 SQL에 의존적인 개발을 피할 수 있다.

객체를 db에 저장하고 관리할 때,

  • 개발자가 직접 SQL을 작성하는 것이 아니라, JPA 가 제공하는 API를 사용하면 된다.
  • JPA가 개발자 대신 적합한 SQL을 알아서 생성해서 데이터베이스에 보낸다.

다음 포스팅에서는 JPA의 필요성과, 기본 개념에 대해 알아보겠다.

'자바 & Spring' 카테고리의 다른 글

웹 서버 & WAS  (0) 2024.01.30
JPA 정의  (0) 2022.11.06
빈 생명주기 콜백  (0) 2022.10.26
컴포넌트 스캔, 의존관계 자동 주입  (2) 2022.09.25
싱글톤(singleton) 패턴  (0) 2022.09.24