Java

JPA & ORM이란? (Feat. NoSQL에서 ORM?)

Woonys 2022. 6. 2. 23:12
반응형

JPA란?

자바 표준 ORM(Object Relational Mapping).

ORM(Object Relational Mapping)이란? 객체(Object)와 관계형 데이터베이스(Relational DB)를 연결(mapping)해주는 놈!

Why JPA?

현대 웹 애플리케이션에서 관계형 데이터베이스는 빠질 수 없는 요소. 그러다 보니 객체를 관계형 데이터베이스에서 관리하는 게 무엇보다 중요해졌다. 문제는 RDB가 웹서비스 중심이 되면서 모든 코드가 SQL 중심이 되어버렸다는 것. 현업 프로젝트 대부분이 애플리케이션 코드보다 SQL로 가득해져버린 것이다.

이는 RDB가 SQL만 인식할 수 있기 때문인데, SQL만 가능하니 각 테이블마다 기본적인 CRUD 관련 쿼리를 매번 생성해야 한다. 예를 들어 User 객체를 테이블로 관리한다고 해보자.

--Create
insert into user (id, name, ...) values (...);
--Read
select * from user where ...;
--Update
update user set ... where ...;
--Delete
delete from user where ...;

아무리 클래스를 객체지향적으로 설계한들, 결국 SQL을 통해야만 데이터베이스에 저장/조회/수정/삭제가 가능해진다. 즉, SQL 쿼리문을 피할 수 없게 된다. 이러면 두 가지 문제가 생긴다.

1. 단순 반복 쿼리문의 수많은 나열로 인한 유지보수의 어려움

여러 객체를 테이블로 관리할 때, 각 객체에 대해 쿼리문을 작성한다고 생각해보자. 현업에서 수십, 수백 개의 테이블이 있다고 하면 이 테이블의 몇 배에 달하는 쿼리를 만들고 유지보수해야 한다.

2. 객체지향 vs. 관계형 간 패러다임 불일치

객체지향은 메시지를 기반으로 기능(메소드)과 속성(필드)을 한 곳(객체)에서 관리하는 기술인 반면, 관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술이다. 프로그래밍 패러다임에서 절차지향형과 객체지향형의 패러다임이 다른 것처럼, 이 역시 서로 다른 목적성을 가지고 출발한 언어다. 그러다보니 서로 간의 호환이 떨어질 수 밖에 없는 것이다. 만약 객체지향 프로그래밍에서 부모 객체를 가져온다고 해보자.

User user = findUser(); // 자식 객체 -> findUser() 메소드로 찾는다.
Group group = user.getGroup(); // Group은 user의 부모 -> user가 본인이 속한 Group을 가져와서 새롭게 객체 생성

이걸 데이터베이스에서 가져온다고 하면 어떻게 될까?

User user = userDao.finduser(); // DB에서 user 객체 조회
Group group = groupDao.findGroup(user.getGroupId()); // DB에서 group 객체 조회 -> user의 groupID를 조회해서 가져온다.

위의 객체지향형 코드에서는 user와 group의 관계가 명확했던 반면(user.getGroup()), 아래 코드는 userDao에서 따로, groupDao에서 따로 조회하니 둘 사이의 관계가 명확하지 않다. JPA는 이 문제를 해결하기 위해 등장했다.

서로 지향하는 바가 다른 2개 영역(객체지향 vs. 관계형 DB)을 중간에서 패러다임 일치시켜주기 위한 기술이 바로 JPA! 따라서 개발자는 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다.

 

Q1. JPA는 DB의 종류 중 하나인가요?

JPA 및 ORM에 대해서 헷갈렸던 게, JPA라는 ORM이 RDB와 같은 하나의 데이터베이스 종류라고 생각했음. 근데 그게 아니라 객체지향 프로그래밍과 RDB 사이를 연결해주는 기술이라는 것! 안그래도 회사 기술 스택 찾아보면서 DB 쪽에 JPA/Hibernate가 보이지 않길래 우리 회사에서는 이걸 안쓰나..?싶었다..(Backend-Microservice stack에 떡하니 적혀있더라 ㅎ..)

 

Q2. 아니, 그럼 MongoDB와 같은 NoSQL에서는 ORM이 없나요? 왜 차별하심?ㅠ

많이 찾아본 건 아니지만, NoSQL 쪽에서도 자바 객체지향과의 매핑해주는 기술이 있었다! 여기서는 ODM(Object Document Mapping)이라고 하는데, 말 그대로 객체와 문서를 매핑해주는 연결고리 역할을 한다. 이때 Object가 객체이고, Document는 몽고DB의 데이터 저장 형태인 문서다. 즉, 문서를 DB에서 조회할 때 자바스크립트 객체로 바꿔주는 역할이라고 생각하면 된다.

찾아보니 더 소름 돋았던 건, 이전에 그렇게 주구장창 써왔던 Mongoose가 바로 ODM이었던 것..!! 단순히 MongoDB에는 스키마가 존재하지 않으니 이 스키마를 잡아주는 역할이라고만 생각했는데 얘가 자바스크립트에서의 객체와 DB 사이를 매끄럽게 연결해주는 존재였더랬다..ㅎ

 

Reference

반응형