현 시대 대부분의 어플리케이션들은 객체지향 언어를 사용해 개발되고 또 관계형 DB를 사용해 데이터를 영속화한다.
객체지향적인 설계와 개발이 주는 장점은 매우 크고, 그렇기 때문에 어플리케이션을 개발 할때 객체지향적인 개발의 중요성은 항상 강조되어왔다. 그리고, 관계형 DB를 조작할 수 있는 방법은 SQL 이 유일하다.그런데 문제는 SQL 을 사용해 데이터를 영속화 하는 과정을 코드에 넣다보면 객체지향적인 코드가 주는 장점이 소멸되어가는 것을 느낄 수 있을 것이다.
예를들어 엔티티에 필드를 추가하게 되면, 해당 엔티티와 관련된 SQL 을 모두 찾아서 수정해줘야 할 것이다.
public class Member{
private String memberId;
private String name;
}
------
INSERT INTO member(member_id, name) VALUES ...
SELECT member_id, name FROM member WHERE ..
UPDATE meber SET ...
현재, Member 엔티티와 관련된 테이블을 조작하는 SQL 들이 있는 상태이다. 그런데 전화번호와 관련된 필드가 추가된다면 ..?
public class Member{
private String memberId;
private String name;
private String tel;
}
------
INSERT INTO member(member_id, name, tel) VALUES ...
SELECT member_id, name, tel FROM member WHERE ..
UPDATE meber SET ... tel = ?
필요에 따라 SQL 을 한땀한땀 수정해 주는 과정이 필요해 지는 것이다.
결론은 객체를 영속화해 관리하는 과정에서 SQL이 필요하고 SQL을 작성하는 작업을 하다보면 객체지향적인 코드가 주는 장점을 이용하지 못한다는 느낌을 받게 된다는 것이다.
그렇다면, 이 문제를 어떻게 해결 할 수 있을까?
바로 이러한 문제를 해결하기 위해 등장한 일종의 인터페이스가 바로 ORM 이라고 할 수 있겠다. 개발자는 객체지향적으로 코드를 작성하고, ORM 이 코드를 바탕으로 SQL 문을 작성해준다면 관계형 데이터베이스를 사용하면서도 객체지향을 잘 활용하는 코드를 작성할 수 있게 되는 것이다.
단, 객체가 가지는 특성과 관계형데이터베이스가 가지는 특성에는 많은 차이가 있고, 이를 ORM 이 잘 해결해주어야 하며, ORM 사용자는 ORM 이 객체지향적으로 작성한 코드를 SQL로 변환하는 작업을 수행하기 위해 필요한 데이터를 제공해 줌으로써, 객체와 RDB간의 패러다임 차이를 극복할 수 있을 것이다.
해당 포스팅은 김영한님의 '자바 ORM 표준 JPA 프로그래밍' 강의를 참고하여 작성된 내용입니다.