[Spring] ORM(JPA, Hibernate), SQL Mapper, JDBC 개념 정리
April 28, 2021
Byeong Chan

스프링은 로컬DB 또는 원격 DB에 접근하여 Restful API 호출 서비스, DB 관리 및 제어를 할 수 있게 만든다. DB에 접근하는 방법은 다양한 방식이 있는데 그것들에 대한 개념을 정리하고자 한다.

ORM 이란?

  • ORM(Object-Relational-Mapping)이란 객체와 관계형대이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것을 말한다.
  • 객체가 테이블이 되도록 매칭 시켜주는 프레임워크이다.
  • 프로그램의 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있게 된다.
  • SQL Query가 아닌 직관적인 코드로서 데이터를 조작할 수 있다.(ORM에서 제공하는 메서드로 쿼리를 제어할 수 있다.)

JPA 란?

  • JPA(Java Persistence API)이란 자바 ORM 기술에 대한 API 표준 명세를 말한다.
  • ORM에 대한 자바 API 규격이며, 자바 어플레케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
  • 인터페이스 자체이기 때문에 라이브러리와 같이 특정 기능이 존재하지 않는다.
  • 따라서, Hibernate와 같은 JPA 구현체를 사용해야한다.

JPA에 대한 장점

  • 생산성이 뛰어나고 유지보수가 용이하다.

  • 객체지향적인 코드를 사용하므로 비즈니스로직에 더 집중할 수 있다.

  • 객체지향적으로 데이터를 관리할 수 있으므로 유지보수에 용이하다.

  • SQL을 직접적으로 사용하는 것이 아닌, 메서드에 의해 동작하므로 간결하게 사용할 수 있다.

  • DBMS에 대한 종속성이 줄어든다.

  • DBMS가 변경되더라도 소스, 쿼리, 구현방법, 자료형 등을 변경할 필요가 없다.

  • 결국, 개발자는 DBMS에 대한 고려를 덜 해도 되므로 객체에 집중하여 개발할 수 있다.

JPA에 대한 단점

  • JPA를 실무에서 잘사용하기 위한 비용은 비교적 높은편이다.
  • 복잡한 쿼리를 사용할 때 불리하다.(다양한 어노테이션을 알고 그것들을 조합해야해서 신경쓸게 많다.)
  • 기존 데이터베이스 중심으로 되어있는 환경(SQL Mapper 사용 환경)에서 적용하기 어려워진다.

SQL Mapper

  • SQL Mapper란, SQL을 직접 작성하여 DB에 접근하는 것을 말한다.
  • Mybatis라는 미들웨어를 사용해서 접근한다.
  • JAVA 코드가 아닌 작성한 SQL문을 Mapping해서 접근하기 때문에 비교적 쉽다.
  • 복잡한 쿼리도 비교적 쉽게 구현해낼 수 있다.

SQL Mapper vs JPA

SQL Mapper 장점

SQL Mapper는 XML파일에 쿼리를 직접 입력하고 매핑시키는 방식으로 코드를 구성한다. 그렇기 때문에 편리하다. 하지만, 규모가 커지고 DAO, DTO 등 소스가 하나 둘씩 커지기 시작하면 그만큼 XML 파일이 불규칙하게 늘어나고 소스를 유지하기가 어려워진다.

작은 규모의 프로젝트에서 SQL Mapper를 사용하는 것은 좋다. 하지만, 규모가 커지고 로직이 복잡해지고 소스가 방대해지면 객체로 접근 및 관리하는 것이 더 나은 방법일 수 있다.

보통 Mybatis라는 미들웨어를 사용하여 SQL Mapper를 보다 쉽게 적용한다.

JPA 장점

위에서 설명하였지만 부연설명하자면...

JPA는 JAVA ORM에 대한 규격이다. 즉 특정기능을 하는 것이 아닌 규격만 존재하는 것이다. 기능을 구현하기 위해서는 SQL Mapper에서 Mybatis와 같이 JPA에서는 Hibernate를 사용한다.(이외에도 여러가지 미들웨어가 존재한다.)

마찬가지로 hibernate에서 제공하는 여러 기능들이 있는데 일단 메서드를 제공한다. SQL Mapper에서는 XML 파일에 직접 쿼리를 작성하고 Java 클래스에서 객체와 매핑하는 작업을 거쳤다.

JPA에서는 RepositoryEntity를 구성하고 그에 대한 인터페이스를 작성한다. 그리고 인터페이스에 대한 서비스를 Java 클래스로 구현하여 DB에 대한 데이터를 접근한다. (자세한 설명은 추후 다루도록 한다.)

결국엔, XML에서 SQL을 직접 다루지 않고 Java 코드로만 DB에 매핑하게 된다. 이것으로 객체지향적으로 소스를 디자인 할 수 있고, 객체지향적으로 디자인한다는 것은 곧 유지보수성이 좋아지게 된다.

하지만, 관련 어노테이션이 많고, 조합하기 어렵다는 단점이 있다... 너무 어렵다...

JDBC (java Database Connectivity)

  • JDBC는 Database(영속성계층)에 접근하기 위해 사용되는 API 이다.
  • JPA 또는 다른 ORM은 Object를 SQL로 매핑하는 것을 제공해주고, 그 이후 SQL을 연결하는 것은 JDBC영역 기능을 제공한다.
Comment