SpringBoot :: JPA란?

Juwon Lee·2022년 7월 21일
0
post-thumbnail

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

JPA 에 대해 이해하기 쉽게 설명된 부분이 있어 인용해서 적어보았다.

웹 서비스를 개발하면서 피할 수 없는 문제는 DB 를 다루는 일이다.

특히 백엔드 개발자를 희망하고 공부하면서 느끼는 점은

DB를 다룰 일이 생각보다 많다는 것.

당장 백엔드 프레임워크를 이용해서 어플리케이션 개발에 몰두하기에도 시간이 부족한데,

DB는 또 언제 공부하는지..

어쨌든 RDB 를 이용하는 프로젝트에서 어떻게 객체지향 프로그래밍을 할 수 있을까 에 대한 해답으로

JPA 라는 자바 표준 ORM (Object Relational Mapping) 기술을 만나게 된다.

참고로 MyBatis, iBatis 는 ORM 이 아니라 SQL Mapper 이다.

ORM 은 객체를 Mapping 하는 것이고, SQL Mapper 는 쿼리를 매핑한다 !

우선 RDB 에서 각 테이블마다 기본적인 CRUD SQL 생성은 피할 수 없다.

CRUD : Create, Read, Update, Delete

아무리 Java 클래스를 잘 설계해도, 결국 SQL 을 통해야 DB 에 저장하고 조회할 수 있다.

이 반복적인 작업을 해야 한다는 것이 첫 번째 문제.

또 하나는 패러다임 불일치 문제이다.

RDB 는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이다.

반대로 객체지향 프로그래밍은 기능과 속성을 한 곳에 관리하는 기술이다.

이 둘은 이미 사상부터 다른 시작점에서 출발했다.

RDB 와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데,

객체를 DB에 저장하려고 하니 여러 문제가 발생하고 이를 패러다임 불일치라고 한다.

예를 들어, 객체지향 프로그래밍에서 부모가 되는 객체를 가져오려면 어떻게 해야 할까?

User user = findUser();
Group group = user.getGroup();

누구나 명확하게 User와 Group은 부모-자식 관계임을 알 수 있다.

하지만 여기에 DB 가 추가된다면 ?

User user = userDao.findUser();
Group group = groupDao.findGroup(user.getGroupId());

User 따로, Group 따로 조회하게 된다.

상속이나 1:N 등 다양한 객체 모델링을 DB로는 구현할 수 없다.

JPA 는 이런 문제점을 해결하기 위해 등장하게 된다.

서로 지향하는 바가 다른 2개 영역을 중간에서 패러다임 일치를 시켜준다.

JPA 는 인터페이스로, 자바 표준명세서이다.

인터페이스인 JPA 를 사용하기 위해서는 구현체가 필요한데,

대표적으로 Hibernate, Eclipse Link 등이 있다.

하지만 Spring 에서 JPA 를 사용할 때는 이 구현체들을 직접 다루진 않고,

좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA 라는 모듈을 이용해 JPA 를 다룬다.

이들의 관계는 다음과 같다.

  • JPA ← Hibernate ← Spring Data JPA

Hibernate 를 쓰는 것과 Spring Data JPA 를 쓰는 것 사이에는 큰 차이가 없지만

Spring 에서는 Spring Data JPA 를 쓰는 것을 권장하는데,

그 이유는 크게 두 가지가 있다.

  • 구현체 교체의 용이성
  • 저장소 교체의 용이성

먼저 구현체 교체의 용이성이란 Hibernate 외에 다른 구현체로 쉽게 교체하기 위함이다.

Spring Data JPA 는 내부에서 구현체 Mapping 을 지원해주기 때문에

다른 JPA 구현체를 사용할 때 아주 쉽게 교체할 수 있다.

다음으로 저장소 교체의 용이성이란 RDB 외에 다른 저장소로 쉽게 교체하기 위함이다.

예를 들어, 트래픽이 많아져 RDB 로는 감당이 안 될때

MongoDB 로 교체가 필요하다면 Spring Data JPA 에서 Spring Data MongoDB 로

의존성만 교체하면 된다.

이는 Spring Data 의 하위 프로젝트들은 기본적인 CRUD 의 인터페이스가 같기 때문이다.

예를 들어 save(), findAll, findOne() 등을 인터페이스로 가지고 있다.

이 때문에 저장소가 교체되어도 기본적인 기능은 바뀔 것이 없다.

이런 장점들로 인해 Spring 측에서는 Spring Data 프로젝트를 권장한다.

JPA 를 잘 사용하려면 객체지향 프로그래밍과 RDB, 두 가지 모두 잘 이해하고 있어야 한다.

결국 열심히 공부하고 사용해보아야 한다는 뜻이다 🙂

급결론 : 아직 배울 게 많다.

profile
✏️ 하루의 기록

0개의 댓글