본문 바로가기

Spring/JPA

JPA 심화트랙(1) - ORM의 필요성

결론:

ORM은 코드 작성을 개발자 친화적으로 만들어주었지만, 약간의 성능하향과 제약이 걸릴 확률이 높아진다. 그렇기 때문에 적절한 상황에서 사용해야 한다.

 

필기 내용:

Spring Boot 어플리케이션을 개발할 때 객체지향 프로그래밍 언어를 사용

영속성을 구현하기 위해 MySQL, PostgreSQL과 같은 관계형 데이터베이스(RDB)를 함께 사용

 

애플리케이션의 크기가 커질수록 SQL 쿼리문이 많아지게 됐고, 다음과 같은 문제들이 부각되기 시작했다.

  1. 반복적인 CRUD 코드로 인한 SQL쿼리문의 반복된 구조로 반복적인 작성이 이루어짐
  2. SQL 쿼리문이 문자열로 작성되면서 컴파일 시점에 에러를 발견하기 어려워짐
  3. RDB 스키마 정보가 수정되는 등의 변경이 생기면 작성되어 있던 SQL 쿼리문에 해당 변경을 모두 적용해야 함
  4. RDB와 객체지향 프로그래밍의 패러다임 차이로 인해 객체지향 프로그래밍을 하는 데 있어 다양한 문제가 발생했고, 이를 해결하기 위한 Mapping 코드들이 점점 증가했다.
    • RDB는 기본적으로 데이터를 잘 저장하는 것이 목표
    • 객체지향 프로그래밍은 객체들끼리 잘 협력하는 것이 목표
    • 상속, 동일성 보장, 연관관계 등의 문제가 발생하였다.
    • 상속:
      • 객체지향 프로그래밍에서는 객체 사이의 상속관계를 형성할 수 있다.
        • 이러한 상속관계를 통해 부모 객체의 데이터를 자식 객체가 물려받을 수 있다.
      • 하지만 데이터베이스의 두 테이블에는 상속관계를 부여할 수 없다.
    • 동일성 보장:
      • 객체지향 프로그래밍에서는 동일한 데이터가 담긴 객체라도 서로 다른 인스턴스라면 물리적으로 서로 다른 주소를 가진다.
      • 하지만 데이터베이스에서는 데이터는 테이블에만 존재하는 것이고, 이를 몇 번 조회하든 동일한 데이터를 나타낸다.
        • 따라서 데이터베이스에서 조회한 데이터를 객체에 저장하는 행위를 여러 번 반복했을 때 각각의 객체가 서로 다른 주소를 가지는 별도의 객체가 된다는 문제가 생길 수 있다.
    • 연관관계:
      • 객체지향 프로그래밍에서 두 객체의 관계는 객체참조로써 만들어지고 명확한 방향이 있다. 즉, A → B와 같이 하나의 방향으로만 참조가 가능하다.
      • 하지만 데이터베이스에서 두 테이블의 관계에는 방향이 존재하지 않는다.(JOIN과 이 참조는 다른 의미)
    • 이를 해결하기 위해 RDB에서 조회한 데이터를 객체로 Mapping 하고, 객체를 RDB 에 저장하기 위해 데이터로 Mapping 하는 코드들이 추가되었다.
      • 애플리케이션 규모가 커지면서 이런 코드들이 보일러 플레이트처럼 쌓여가게 되고, 결국 관리 및 유지보수의 어려움이 커지게 되었다.

 

ORM은 RDB와 개발자가 직접 Mapping 해주던 작업을 대신해준다.

JPA는 Java Persistence API의 약자로 JAVA 애플리케이션에서 사용할 수 있는 대표적인 ORM 기술 표준 중 하나.

우리는 JPA를 구현한 오픈소스인 Hibernate를 사용한다.

 

ORM의 장점

  1. 객체 중심적인 개발: ORM은 전통적인 SQL 중심적인 개발에서 객체 중심적인 개발로의 전환을 가능하게 한다. 복잡한 SQL 쿼리 작성 대신 도메인 엔티티를 자바 객체로 모델링하는 데 집중할 수 있다.
  2. 생산성 향상: ORM을 사용하면 생산성이 향상된다. SQL 작성에 시간을 투자하지 않아도 되며, 객체 지향적인 코드 작성이 가능하다.
  3. 패러다임 불일치 해소: 객체와 데이터베이스 간의 패러다임 불일치를 해소할 수 있다.

ORM의 단점

  1. 성능 저하: 영속성 콘텍스트 유지와 변경 감지 작업으로 인해 성능이 네이티브 SQL 쿼리보다 느릴 수 있다.
  2. 메모리 자원 소모: JPA는 메모리 자원을 사용하므로 메모리 소모가 발생한다.
  3. 구조적 제한: 일괄 삽입과 같은 구조적 제한이 발생할 수 있다.