결론:
ORM은 코드 작성을 개발자 친화적으로 만들어주었지만, 약간의 성능하향과 제약이 걸릴 확률이 높아진다. 그렇기 때문에 적절한 상황에서 사용해야 한다.
필기 내용:
Spring Boot 어플리케이션을 개발할 때 객체지향 프로그래밍 언어를 사용
영속성을 구현하기 위해 MySQL, PostgreSQL과 같은 관계형 데이터베이스(RDB)를 함께 사용
애플리케이션의 크기가 커질수록 SQL 쿼리문이 많아지게 됐고, 다음과 같은 문제들이 부각되기 시작했다.
- 반복적인 CRUD 코드로 인한 SQL쿼리문의 반복된 구조로 반복적인 작성이 이루어짐
- SQL 쿼리문이 문자열로 작성되면서 컴파일 시점에 에러를 발견하기 어려워짐
- RDB 스키마 정보가 수정되는 등의 변경이 생기면 작성되어 있던 SQL 쿼리문에 해당 변경을 모두 적용해야 함
- RDB와 객체지향 프로그래밍의 패러다임 차이로 인해 객체지향 프로그래밍을 하는 데 있어 다양한 문제가 발생했고, 이를 해결하기 위한 Mapping 코드들이 점점 증가했다.
- RDB는 기본적으로 데이터를 잘 저장하는 것이 목표
- 객체지향 프로그래밍은 객체들끼리 잘 협력하는 것이 목표
- 상속, 동일성 보장, 연관관계 등의 문제가 발생하였다.
- 상속:
- 객체지향 프로그래밍에서는 객체 사이의 상속관계를 형성할 수 있다.
- 이러한 상속관계를 통해 부모 객체의 데이터를 자식 객체가 물려받을 수 있다.
- 하지만 데이터베이스의 두 테이블에는 상속관계를 부여할 수 없다.
- 객체지향 프로그래밍에서는 객체 사이의 상속관계를 형성할 수 있다.
- 동일성 보장:
- 객체지향 프로그래밍에서는 동일한 데이터가 담긴 객체라도 서로 다른 인스턴스라면 물리적으로 서로 다른 주소를 가진다.
- 하지만 데이터베이스에서는 데이터는 테이블에만 존재하는 것이고, 이를 몇 번 조회하든 동일한 데이터를 나타낸다.
- 따라서 데이터베이스에서 조회한 데이터를 객체에 저장하는 행위를 여러 번 반복했을 때 각각의 객체가 서로 다른 주소를 가지는 별도의 객체가 된다는 문제가 생길 수 있다.
- 연관관계:
- 객체지향 프로그래밍에서 두 객체의 관계는 객체참조로써 만들어지고 명확한 방향이 있다. 즉, A → B와 같이 하나의 방향으로만 참조가 가능하다.
- 하지만 데이터베이스에서 두 테이블의 관계에는 방향이 존재하지 않는다.(JOIN과 이 참조는 다른 의미)
- 이를 해결하기 위해 RDB에서 조회한 데이터를 객체로 Mapping 하고, 객체를 RDB 에 저장하기 위해 데이터로 Mapping 하는 코드들이 추가되었다.
- 애플리케이션 규모가 커지면서 이런 코드들이 보일러 플레이트처럼 쌓여가게 되고, 결국 관리 및 유지보수의 어려움이 커지게 되었다.
ORM은 RDB와 개발자가 직접 Mapping 해주던 작업을 대신해준다.
JPA는 Java Persistence API의 약자로 JAVA 애플리케이션에서 사용할 수 있는 대표적인 ORM 기술 표준 중 하나.
우리는 JPA를 구현한 오픈소스인 Hibernate를 사용한다.
ORM의 장점
- 객체 중심적인 개발: ORM은 전통적인 SQL 중심적인 개발에서 객체 중심적인 개발로의 전환을 가능하게 한다. 복잡한 SQL 쿼리 작성 대신 도메인 엔티티를 자바 객체로 모델링하는 데 집중할 수 있다.
- 생산성 향상: ORM을 사용하면 생산성이 향상된다. SQL 작성에 시간을 투자하지 않아도 되며, 객체 지향적인 코드 작성이 가능하다.
- 패러다임 불일치 해소: 객체와 데이터베이스 간의 패러다임 불일치를 해소할 수 있다.
ORM의 단점
- 성능 저하: 영속성 콘텍스트 유지와 변경 감지 작업으로 인해 성능이 네이티브 SQL 쿼리보다 느릴 수 있다.
- 메모리 자원 소모: JPA는 메모리 자원을 사용하므로 메모리 소모가 발생한다.
- 구조적 제한: 일괄 삽입과 같은 구조적 제한이 발생할 수 있다.
'Spring > JPA' 카테고리의 다른 글
JPA심화트랙(5) - 객체지향을 곁들인 JPA, QueryDSL 실전 활용법 (0) | 2024.04.09 |
---|---|
JPA심화트랙(4) - JPA 유용한 기능들 소개 (1) | 2024.04.03 |
JPA 심화트랙(3) - 연관관계 매핑 (2) | 2024.04.03 |
JPA 심화트랙(2) - Persistence Context(영속성 컨텍스트) (0) | 2024.04.02 |