개발/JPA

JPA

Debin 2022. 2. 22.
반응형

2023. 02.07 09:00 복습 시작

JPA란 무엇인가?

JPA는 자바 진영의 ORM 기술 표준이다. 

그럼 ORM이란 무엇인가?

  • ORM은 Object-Relational Mapping의 줄임말이다. 이름 그대로 객체와 관계형 데이터베이스를 매핑하는 것이다.
  • 즉 SQL을 직접 짜지 않고 자바 코드로 편하게 객체를 ORM 프레임워크에 저장하면 데이터베이스에 저장할 수 있다.

예전에 Express와 Prisma를 다루어본 적이 있어서 쉽게 이해가 갔다. 

JPA에 대해 간단히 알아보았다. 그럼 더 중요한 궁금증이 남아있다.

우리는 왜 JPA, 즉 ORM을 사용할까?

웹 서비스를 운영하려면 고객 데이터도 저장하고 서비스 데이터도 저장해야 하고 또 이 데이터들을 사용해야 한다.

그러면 데이터를 저장하고 꺼내오는 데이터베이스는 필수적이다.

다양한 데이터베이스 종류 중에서도 관계형 데이터베이스는 가장 대중적이고 신뢰할만한 데이터베이스다.

그래서 보통 자바로 개발하는 애플리케이션은 대부분 관계형 데이터베이스를 사용한다.

관계형 데이터베이스에 데이터를 관리하려면 SQL을 사용한다. 여기서부터 문제가 발생한다.

 

데이터베이스는 객체 구조와는 다른 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 저장하고 조회할 수 없다.

따라서 자바 개발자는 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 직접 해주어야 한다.

문제는 객체를 CRUD 하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야 한다는 점이다.

만약 데이터베이스 테이블의 수가 어마어마하게 많다면 이런 비슷한 일을 어마어마하게 반복해야 한다.

이런 작업은 지루함과 반복의 연속이다.

 

또 한 가지의 문제가 있다. 만약 객체에 필드를 추가하면 데이터를 저장하는 SQL을 수정해야 한다.

그러면 또 어마어마하게 많은 코드를 수정해야 할 것이다. 만약 자바 컬렉션에 보관했다면 코드를 많이 수정하지 않았을 것이다.  너

무나도 SQL에 의존적인 개발이다.

 

마지막 문제가 있다.

비즈니스 요구사항을 모델링한 객체를 엔티티라고 한다.

이렇게 SQL에 모든 것을 의존하는 상태에서는 엔티티를 신뢰할 수 없다.

데이터를 조회하는 메서드를 추가하거나 수정하면 메서드 내부의 SQL을 확인해야 어떻게 동작고 실행하는지 확인할 수 있다.

이것은 진정한 의미의 계층 분할이 아니다. SQL과 JDBC API가 엔티티와 아주 강한 의존관계를 가지고 있기 때문이다.

문제점을 요약하면 아래와 같다.

 

  • 진정한 의미의 계층 분할이 어렵다.
  • 엔티티를 신뢰할 수 없다.
  • SQL에 의존적인 개발을 피하기 어렵다.

이렇게 문제를 살펴보았다.

또한 ORM을 사용해야 하는 이유는 객체지향 프로그래밍과 관계형 데이터베이스의 패러다임 불일치 때문이다.

이제 패러다임의 불일치로 발생하는 문제를 짧게 살펴보겠다.

상속

  • 객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다.
    일부 데이터베이스는 상속 기능을 제외하지만 엄밀히 말하면 객체지향 프로그래밍 상속과는 다르다.)
  • 데이터베이스 모델링에서 이야기하는 슈퍼 타입 서브타입 관계를 사용하면 객체 상속과 가장 유사한 형태로 테이블을 설계할 수 있다.그러나 만약 JDBC API를 사용해 부모 객체, 자식 개체를 생성하는 코드를 완성하려면 부모 객체에서 부모 데이터만 꺼내서 Insert SQL을 작성해야 하고, 자식 객체에서 자식 데이터만 꺼내서 Insert SQL을 작성해야 하는데 코드량이 꽤나 길다. 마찬가지로 조회하는 것도 쉬운 일이 아니다.

연관관계

  • 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다.
  • 반면에 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
  • 만약 객체가 참조하는 방식을 다른 객체를 참조하는 것이 아니라 테이블의 패러다임을 따라서 키를 사용한다면, 좋은 객체 모델링은 기대하기 어렵고 객체지향의 특징을 잃어버린다.

이런 패러다임의 차이를 극복하려고 개발자는 너무 많은 시간과 코드를 투자한다.

이런 문제점들을 해결하려고 JPA를 사용하는 것이다.

JPA는 관계형 데이터베이스와 객체지향 프로그래밍의 패러다임의 간격을 확실하게 줄여준다.

JPA 사용 장점

  • 생산성: JPA를 사용하면 SQL, JDBC API를 사용하는 반복적이고 지루한 역할은 몽땅 JPA가 해결해준다.
  • 유지보수: JPA를 사용하면 엔티티에 신뢰성이 생기고, SQL과 JDBC 역할을 JPA가 해주기 때문에 유지 보수해야 하는 코드가 줄어든다.
  • 패러다임의 불일치 해결
  • 성능 향상
  • 데이터 접근 추상화와 벤더 독립성:  데이터베이스마다 페이징 처리가 다르다. 이러면 처음 선택한 데이터베이스에 기술이 종속되고 다른 데이터베이스로 변경하기 어렵다. 그러나 JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.

 

참고자료

자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 강의 - https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

2023. 02.07 09:30 복습 마무리

반응형

댓글