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 |