본문 바로가기
개발

스프링에서 데이터베이스를 다루는 방법

by lewns2 2023. 2. 4.

개요

웹서비스를 개발 및 운영함에 있어 피할 수 없는 문제는 데이터베이스를 다루는 일입니다.
데이터베이스를 다루기 위해 사용되는 JDBC, SQL Mapper, ORM에 대해 알아보고자 합니다.

 

들어가기 앞서...

먼저, 당연히 데이터베이스를 사용하는 이유는 우리가 다루는 이 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장하기 위함입니다. 이러한 개념을 영속성(Persistence)라고 부릅니다.

 

JAVA에서는 데이터의 영속성을 위해 JDBC(Java Database Connectivity) 라고 불리는 자바 API를 지원해줍니다.
하지만, JDBC에서 DB에 접근하여 SQL을 수행하고, 결과값을 다시 dataType으로 매핑시켜주는 작업을 일일히 수행해야 하는 번거로움이 존재합니다. 이러한 복잡함과 번거로움을 해결하기 위해 Persistence Framework가 등장하게 됩니다.

Persistence Framework는 개발자가 직접 JDBC 프로그래밍을 하지 않도록 여러 기능을 제공해줍니다.

이 Persistence Framework의 종류로서 개요에서도 언급되었던 SQL MapperORM이 있습니다.


JDBC(Java Database Connectivity)

자바 애플리케이션에서 DBMS의 종류에 상관 없이, 하나의 JDBC API를 이용해 DB작업을 처리합니다. 즉, 응용프로그램과 DBMS 간의 통신을 해주는 역할을 수행합니다.

 

장점

  • 모든 자바의 데이터 엑세스 기술의 근간입니다. (이로 인해 러닝 커브가 낮습니다.)

단점

  • 간단한 SQL을 실행하는 데도 중복된 코드를 반복적으로 사용합니다.
  • 공유리소스를 제대로 릴리즈해주지 않으면 시스템의 자원이 바닥나는 버그를 발생시킵니다.

 

SQL Mapper? ORM?

JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발하기 위해 Persistence Framework가 등장하게 됩니다. 이제 프레임워크의 종류인 SQL Mapper와 ORM에 대해 알아봅시다.

 

SQL Mapper

Object와 SQL문(쿼리)를 매핑하여 데이터를 객체화하는 기술입니다.
직접 작성한 SQL문으로 RDB에 쿼리를 보내고, 그 결과를 객체에 매핑시켜줍니다.

 

특징

  • 쿼리 수행 결과와 객체의 필드를 맵핑합니다.
  • SQL 쿼리들을 별도의 파일(XML 등)에 작성하여 코드와 SQL을 분리하여 관리합니다.

 

장점

  • JDBC에서 반복적으로 해야하는 많은 작업들을 단순화할 수 있습니다.
  • 코드와 SQL문의 분리를 통해 코드 간결성 및 유지보수성 향상됩니다.

 

단점

  • SQL문을 직접 작성한다는 번거로움이 있습니다.
  • Database에 종속적입니다. (데이터베이스마다 쿼리 문법, 데이터타입이 다르기 때문입니다.)
  • 테이블마다 비슷한 CRUD SQL문을 필요로 하는데, 때문에 DAO(Data Access Object) 개발이 매우 반복됩니다.
  • 테이블 필드가 변경될 시, 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 합니다.
  • SQL 의존적인 개발, 패러다임 불일치 문제가 있습니다.
    • 객체지향(추상화, 상속, 다형성) <-> RDB(데이터 중심의 구조)
    • 각각 지향하는 목적이 다르기 때문에 사용 방법과 표현 방식에 차이가 있을 수 밖에 없습니다.

예) Mybatis, ibatus...


ORM(Object Relational Mapping)

Object와 관계형 데이터베이스의 테이블을 매핑하여 데이터를 객체화하는 기술입니다.

 

특징

  • SQL 쿼리가 아닌 직관적인 코드(메서드)로 데이터 조작합니다.
# 예시

SELECT * FROM user; => user.findAll()

장점

  • SQL Mapper가 가진 패러다움 불일치 문제를 해결 가능합니다.
  • 반복적인 CRUD 용 SQL을 개발자가 작성하지 않아도 되므로 생산성이 높습니다.
  • 데이터베이스마다 미묘하게 다른 데이터 타입, SQL 문법을 알아서 해결해줍니다.
  • 유지 보수가 용이합니다.
    • 필드 추가, 삭제 시 관련된 CRUD 쿼리를 직접 수정하지 않고, 엔티티를 수정하면 되기 때문입니다.

단점

  • 복잡한 쿼리 사용이 어렵습니다.
  • 높은 러닝 커브를 가집니다. (객체 지향 프로그래밍과 관계형 데이터베이스를 둘 다 잘 이해해야합니다.)

예) JPA(자바 표준 ORM)


결론

데이터베이스를 다루기 위한 기술들을 알아보았습니다.
JDBC의 단점을 보완하기 위해 SQL Mapper가 등장하고, SQL Mapper의 단점을 보완하기 위해 ORM이 등장한 모습을 살펴볼 수 있었습니다.

 

참고

스프링 부트와 AWS로 혼자 구현하는 웹 서비스, 이동욱 저자

[10분 테코톡] ⏰ 아마찌의 ORM vs SQL Mapper vs JDBC

 

728x90
반응형

'개발' 카테고리의 다른 글

[Java] 롬복 소개 및 설치  (0) 2021.03.11