유데미X웅진-STARTERS 취업 부트캠프 백엔드 3기-7주차 학습 일지_Java Database Connectivity

zwundzwzig·2023년 1월 5일
0
post-thumbnail

Node의 Express.JS에선 typeORM을 활용해 프로젝트를 진행했다. 지금은 Java를 배우면서 JDBC라는 API를 접했고, 각각의 차이를 정리해보자.

이전에 공부한 Layered Pattern에서 데이터를 보존하는 계층으로 Persistence Layer가 있다고 배웠다.

해당 계층에서 DAO 패턴으로 ORM 객체를 활용해 데이터베이스와 연결했다.

Java DataBase Connectivity

JDBC는 자바에서 데이터베이스와 프로그램을 연결시켜주는 인터페이스이다.

이 API를 활용해 우리는 영속성을 보존하며 단일 책임 원칙에 기반한 고립성 데이터베이스를 안전하게 유지할 수 있다.

또한 특정 DBMS에 종속되지 않아 DBMS를 구현한 JDBC 드라이버만 변경한다면 다양한 DBMS와 사용할 수 있다.

JDBC를 구동하는 과정은 다음과 같다.

import java.sql.*;

1. Class.forName(ConnectionInform.DRIVER_CLASS);
// ConnectionInform은 연동하고 싶은 테이블 정보가 담긴 클래스.
// 이 과정을 통해 테이블을 클래스화 한다.
// jdbc 드라이버를 호출한다.

2. Connection connection = DriverManager.getConnection(
  ConnectionInform.URL, ConnectionInform.USERNAME, ConnectionInform.PASSWORD);
// DriverManager 클래스로 Connection 인스턴스를 생성한다.
// 테이블과 java를 연결한다.

3-1. Statement statement = connection.createStatement();
// sql 구문을 변수에 저장 및 전송 객체 생성한다.

3-2. PreparedStatement preparedstatement = con.prepareStatement(DML || DDL);
// PreparedStatement를 사용해 재사용성이 좋은 과정을 거칠 수 있다.

4. ResultSet resultset = statement.executeQuery(DML) || statement.executeUpdate(DDL);
// DML이 인자에 담길 경우 ResulSet 타입에 담긴다.

5. resultset.close(); statement.close(); connection.close();
// 사용이 완료된 변수는 close 메소드로 직접 꺼줘야 한다.

그러나 JDBC 방식은 코드가 방대하다는 단점이 있다. 단순 조회를 위해서도 위와 같은 과정을 모두 거쳐야 하고, 각각의 클래스 모두 비용이 크기 때문에 직접 상태 관리를 해야해 개발자에게 부담이 된다.

이런 단점을 다른 Framework로 극복할 수 있는데, 추상화시키는 방식에 따라 SQL MapperORM으로 나눌 수 있다.

개발자로 하여금 비즈니스 로직에 집중하도록 JDBC를 한 단계 추상화시켜 불필요한 과정을 숨겨 직접 JDBC를 사용하지 않도록 느껴질 뿐이지 실제로는 JDBC를 통해 DB에 접근하는 건 똑같다.

다음은 JDBC를 대체할 수 있는 프레임워크들에 대해 간략히 알아보자.

SQL Mapper

  • 객체와 SQL 문을 직접 작성해 해당 결과와 객체를 매핑해 데이터를 객체화

MyBatis

  • JDBC는 조회 결과를 객체에 매핑해야 하는 별도의 코드가 필요하다면,
  • MyBatis는 그런 반복 작업을 자동화
  • XML 파일에서 코드와 SQL 쿼리를 분리하여 관리

그러나,

  • 사용하는 쿼리 문법이나 데이터 타입에 따라 특정 DBMS에 종속될 수 있고,
  • CRUD 쿼리들은 거의 비슷한데 테이블마다 작성해야 해 결국 반복적인 작업이며,
  • 테이블 필드가 변경되면 관련된 코드들을 수정해야 함
  • 코드상으로 SQL과 JDBC API를 분리했지만, 논리적으로는 아직 강한 의존성을 가지고 있음
  • 결국 SQL 의존적인 개발을 피할 수 없게 됨
  • RDBMS는 관계를, OOP는 객체를 지향해 패러다임 불일치 문제가 발생

Object-Relational Mapping

  • 객체와 데이터베이스의 데이터를 매핑해 데이터를 객체화
  • 객체는 객체대로, RDBMS는 그거대로 설계 후 ORM이 중간에서 매핑
  • 객체 간의 관계를 코드로 작성하면 이를 바탕으로 SQL 문 자동 생성

Java Persistence API

  • 객체 중심적 개발 가능케 하는 인터페이스
  • 위치 상으로 자바app - JPA - JDBC - DB 이렇게 위치.
  • Java 코드만 작성해도 자동으로 CRUD를 구현하고 변경도 용이.
  • 상속, 다형성 등 객체 지향적으로 데이터베이스를 관리 가능.
  • Native SQL, JPQL, Query Dsl 등을 활용하면 복잡한 쿼리도 해결 가능.

그러나,

  • JPQL 역시 기존 SQL과 상이하고, N+1 문제 등 까다로운 방식으로 인해 러닝커브가 존재

본 후기는 유데미-웅진씽크빅 취업 부트캠프 3기 백엔드 과정 학습 일지 리뷰로 작성되었습니다.

유데미 바로가기 / STARTERS 취업 부트캠프 공식 블로그 보러가기


🧷 참고 교재

profile
개발이란?

0개의 댓글