꾸준함이 중요한 Lion2me의 기술블로그

ORM과 SQLMapper

20 Aug 2021

ORM과 SQLMapping

JAVA 기반 웹 애플리케이션을 구현하면서 RDBMS에 접근하기 위해 필수적으로 사용해야 하는 JDBC에 대해서는 이전에 간단히 포스팅을 했었습니다. 그 내용이 너무 적고, 추가적으로 JPA와 MyBatis 같은 Spring에서 JDBC를 쉽게 사용하는 방법에 대해 공부해보겠습니다.

JDBC (JAVA DataBase Connectivity) 란?

JDBC는 자바와 데이터베이스를 연결하기 위한 API입니다. 또한 연결 된 데이터베이스에서 원하는 정보를 CRUD 작업을 수행할 수 있습니다.

단점

  • 쿼리를 실행하기 전후에 많은 코드를 실행해야합니다.
  • 트랜잭션 관리를 해야합니다.
  • 예외 처리에 대한 어려움이 있습니다.

Spring JDBC는?

Spring에서 지원해주는 JDBC는 이러한 JDBC의 사용을 편리하게 바꾸어 제공합니다.

기존의 JDBC는 트랜잭션 관리를 직접해야하고 예외처리에 관한 처리도 해야 합니다. 또한 불필요한 반복이 많습니다.

하지만 Spring JDBC는 이러한 관리는 알아서 해주며, 불필요한 반복이 일어나는 단점도 해결한 형태입니다.

Persistence Framework

영속화(persist)

데이터를 다루기 위해 불러오고 수정하는 과정을 거치더라도 이 과정은 메모리 위에서 일어나는 일이기에 프로그램을 종료하거나 다른 데이터가 덮어씌워지면 기존에 있던 데이터는 사라지게 됩니다.

그래서 우리는 데이터를 저장하기 위해 특정 공간(파일이나 데이터베이스 등)로 저장한 뒤 후에 그 값을 읽어들이는 방법을 사용하고 있습니다. 이러한 과정을 영속화라고 합니다. 즉 영구적으로 데이터를 저장하는 것입니다.

우리는 데이터를 영속화하는 방법 중 데이터베이스를 이용하려하고, 자바 언어를 기반으로 데이터베이스에 접근하는 것은 JDBC를 이용해야 합니다. 직접 JDBC를 사용할 수 있으며, 그보다 조금 더 편하게 이용할 수 있는 Spring이 제공하는 Spring JDBC또한 사용할 수 있지만, 아예 영속화를 도와주는 프레임워크가 주로 사용됩니다.

그것이 Persistence Framework입니다. 대표적으로는 ORM 방식과 SQL Mapper 방식이 있습니다. 이 두 가지에 대해 알아보겠습니다.

ORM

그럼 ORM에 대해서 공부해보겠습니다.

ORM은 Object Relational Mapping의 약자로 자바의 객체와 데이터베이스의 데이터를 Mapping 해주는 방법입니다. 그 결과로 RDBMS를 SQL문으로 다루는 것이 아닌 자바 언어로 다룸으로써 객체지향적인 구조를 활용 할 수 있게 됩니다.

데이터베이스의 데이터와 자바 객체에는 차이가 있습니다. 자바의 객체는 클래스를 사용하지만 데이터베이스의 데이터는 테이블을 사용합니다. 이로 인해 자바의 객체와 데이터베이스의 데이터는 불일치가 발생하고 이를 해결하기 위해 ORM이 등장했습니다.

ORM은 데이터베이스의 테이블을 자바의 객체로 자동으로 매핑해줍니다.

즉 객체지향적인 환경을 바탕으로 데이터베이스의 데이터에 접근 할 수 있도록 도와줍니다. ORM을 사용하는 개발자분들은 “객체지향 특징을 잘 살릴 수 있기 때문에 자바의 장점을 잘 살리려면 ORM을 쓰는게 좋다.” 라고 하셨습니다. 그리고 저는 SQL Mapper방식을 사용했었습니다 하지만 다시 알아보니 ORM의 장점은 상당히 강력했습니다.

ORM의 특징

ORM은 자바 언어를 통해 데이터베이스를 다룰 수 있는 방법이라고 간단하게 말하겠습니다.

기본적으로 데이터베이스에서 데이터를 다루는 방법, 정확히는 테이블 내 레코드를 다루는 작업(DML)은 SQL문을 이용해서 다루게 됩니다. 하지만 ORM은 자바 언어로 구현하면 자동으로 SQL문을 실행하여 데이터를 다루는 방법입니다.

즉 SQL문을 직접 입력 할 필요가 없습니다. 이 점이 장점이라고 하시는 분이 계시지만 저는 SQL을 직접 입력하는 것이 좋은 것 같습니다.

ORM의 장점

  1. 특징에서 설명하는 SQL을 익힐 필요가 없다는 점
  2. 객체지향적 프로그래밍 방식을 그대로 적용 할 수 있는 점 (*)
  3. 개발 중 데이터베이스의 변화에 적응하기 편한 점

ORM의 단점

  1. 잘못 사용할 시 성능의 저하가 있을 수 있는 점

ORM 형식을 따르는 JPA를 구현한 Hibernate를 보면 영속화 컨텍스트라는 일종의 캐시? 임시 저장 공간? 정도의 개념을 두고 사용하는데 이에 대한 지식이 필요하다고 합니다. 실제로 사용 할 때 다시 한번 살펴보겠습니다.

SQL Mapper

저는 서비스를 개발 할 때 SQL Mapper 방식을 통해 서비스를 개발했습니다. 두 방식이 각각 장단점이 있고, 현재 ORM을 이용한 방식이 많이 떠오른 상태이지만 정해진 개발 환경에 따라 SQL Mapper를 사용했었습니다.

SQL Mapper의 특징

간단히 “SQL문을 통해서 데이터를 불러 온 뒤 원하는 데이터 타입에 주입한다.” 정도로 이해하고 있습니다.

해당 RDBMS에 대한 SQL 언어를 알고 있다면 그대로 사용해서 불러온 데이터를 사용하고 싶은 데이터 형식을 통해 저장합니다. 그리고 이 과정에서 사용 한 SQL문은 자바 클래스 내에 적지 않고 xml 파일로 분리시켜서 적을 수 있습니다.

SQL Mapper의 장점

  1. xml 파일화를 통한 유지보수가 편한 점
  2. 복잡한 쿼리가 필요 한 경우 직접 작성 할 수 있어서 수월 한 점

SQL Mapper의 단점

  1. DB에 종속적인 점
  2. 데이터베이스의 설정을 변경하면 수정할 것이 많은 점

SQL Mapper 방식을 사용한 것은 소스와 SQL문이 명확하게 구분되기 때문이라고 알고 있습니다만, 복잡한 쿼리가 사용되지 않은 서비스였기에 ORM 방식으로 만들어도 좋았을 것이라고 생각하고 있습니다.

이미 지나간 일이지만, 다른 방식으로 한 번 만들어보면 좋았을 것 같았는데..

참조

https://eun-jeong.tistory.com/31 https://velog.io/@mu1616/ORM-SQL-Mapper-차이