이동욱 저자의 스프링 부트와 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 를 다룬다.
이들의 관계는 다음과 같다.
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, 두 가지 모두 잘 이해하고 있어야 한다.
결국 열심히 공부하고 사용해보아야 한다는 뜻이다 🙂
급결론 : 아직 배울 게 많다.