대외활동 기록/NEXTERS 15th

[JPA] SQL Mapper와 ORM

칸타탓 2019. 7. 28. 22:10

SQL Mapper와 ORM(JPA) 개념 정리

 

* 영속성(Persistence)

데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성

영속성을 갖지 않는 데이터는 메모리에만 존재하고 있기 때문에 프로그램이 종료되면 사라진다.

 

메모리 상에 있는 데이터를 데이터베이스에 저장해 영구적으로 저장하여 영속성을 부여할 수 있다.

대표적으로 데이터베이스에 데이터를 저장하는 방법에는 JDBC, Spring JDBC, Persistence Framework(Hibernate, Mybatis) 등이 있다.

 

Persistence Layer란 프로그램 아키텍처에서 데이터에 영속성을 부여해주는 계층으로, 일반적으로 Persistence Framework를 사용하여 개발한다.

이러한 Persistence Framework는 SQL Mapper와 ORM으로 나누어진다.

 

* ORM(Object-relational mapping, 객체 관계 매핑)

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.

객체지향 프로그래밍은 객체를 사용하고, 관계형 데이터베이스는 테이블을 사용하기 때문에 두 모델 간 불일치가 존재한다.

ORM을 사용하면 두 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결할 수 있다.

 

* ORM을 사용하는 이유

  • 쿼리문을 작성할 필요가 없고, 메서드로 데이터를 조작하며 비즈니스 로직에 집중할 수 있다.
  • 재사용성 및 유지보수성 증가
  • DBMS에 대한 종속성이 줄어든다.

* ORM 사용 시 주의할 점

  • ORM 만으로 완벽한 서비스를 구현하기 어렵다는 한계가 존재
  • 프로그램의 복잡성이 올라가면 구현 난이도 또한 상승
  • 설계가 매우 신중해야 한다.
  • 일부 대형 쿼리는 SP를 사용하는 등 별도의 구현이 필요할 수 있다. (SP: 저장 프로시저)

 

* JPA(Java Persistence API)

자바 ORM 기술에 대한 표준 명세로, 자바에서 제공하는 API이다.

RDB의 관계를 Object에 반영하는 것이 목적으로, 객체를 통해 간접적으로 DB 데이터를 다룬다.

 

위와 같이 JPA는 자바 애플리케이션과 JDBC 사이에서 동작한다.
JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.

 

* SQL 실행 절차

Insert 동작을 수행하고 싶을 때, JPA에 Member 객체를 넘기면 다음과 같은 동작이 이루어진다.

  • Member 엔티티를 분석한다.
  • INSERT SQL을 생성한다.
  • JDBC API를 사용하여 SQL을 DB에 날린다.

SELECT 동작을 수행하고 싶을 때는 JPA에 PK 값을 넘긴다.

  • 엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성한다.
  • JDBC API를 사용하여 SQL을 DB에 날린다.
  • DB로부터 결과를 받아온다.
  • 결과를 객체에 모두 매핑한다.
    쿼리를 JPA가 만들어 주기 때문에 Object와 RDB 간의 패러다임 불일치를 해결할 수 있다.

 

* Mapper와 차이

자바 클래스와 Database 테이블을 매핑하며 SQL을 매핑하지 않는다는 것이 차이이다.

따라서, 객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.

Mapper의 경우에는 SQL문을 매핑하여 DB를 조작하므로 SQL을 명시해주어야 한다.

Mapper의 종류: Mybatis, jdbcTemplate

 

* JPA를 쓰는 이유

  • 데이터를 객체지향적으로 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있다.
  • SQL 중심적인 개발 → 객체 지향적 개발
  • Mapper는 필드 변경 시 모든 SQL을 수정해야 하는 반면, JPA는 필드만 변경하면 되므로 유지보수가 쉽다.
  • Object와 RDB 간의 패러다임 불일치를 해결할 수 있다.

[참고]

velog.io/@adam2/JPA%EB%8A%94-%EB%8F%84%EB%8D%B0%EC%B2%B4-%EB%AD%98%EA%B9%8C-orm-%EC%98%81%EC%86%8D%EC%84%B1-hibernate-spring-data-jpa

gmlwjd9405.github.io/2019/02/01/orm.html