[Spring] JPA

김민범·2024년 11월 15일

Spring

목록 보기
19/29

JPA란?

  • Java와 관계형 데이터베이스 간의 패러다임 불일치 문제를 해결하여 객체 지향적으로 데이터베이스 작업을 수행할 수 있도록 지원하는 기술이다.
  • Java의 ORM 기술 표준으로, 대표적인 구현체로 Hibernate를 주로 사용한다.
  • ORM(Object-Relational Mapping)이란 객체와 관계형 DB를 자동으로 매핑하여 JDBC API를 대체하는 기술이다.

JPA를 사용하는 이유

1. 생산성

  • 객체를 컬렉션처럼 저장, 조회, 수정, 삭제가 가능하다.
  • SQL을 직접 작성할 필요 없이 메서드 호출로 작업이 완료된다.

2. 유지보수성

  • 엔티티의 필드가 수정되어도 SQL 작업은 JPA가 자동으로 처리한다.

3. 패러다임 불일치 문제 해결

  • 상속: 객체 상속 관계를 테이블에 맞게 자동으로 저장 및 조회한다.
  • 연관관계: 객체의 관계를 그대로 유지하면서 테이블 간 관계를 매핑한다.
  • 객체 그래프 탐색: 객체 간 연관된 데이터를 쉽게 탐색할 수 있다.
  • 객체 비교: 동일한 트랜잭션 내에서는 동일한 객체를 반환한다.

4. 성능

  • 1차 캐시: 동일한 엔티티를 여러 번 조회해도 캐시에서 가져오므로 SQL이 한 번만 실행된다.
  • 쓰기 지연: 트랜잭션이 끝날 때까지 SQL을 모아 한 번에 실행하여 네트워크 비용을 줄인다.
  • 지연 로딩과 즉시 로딩: 필요한 데이터만 조회하거나, 한 번의 쿼리로 연관 데이터를 가져오는 전략을 제공한다.

hibernate.dialect

  • Hibernate가 사용하는 데이터베이스 방언(dialect)을 지정하는 설정이다.
  • 특정 데이터베이스에 맞게 SQL 구문을 자동으로 조정하는 역할을 한다.
    • 예) MySQL: LIMIT, Oracle: ROWNUM
  • 데이터베이스 교체 시에도 JPA가 SQL을 자동으로 변환해준다.

정리: JPA는 객체 지향적으로 데이터베이스 작업을 간소화하고, 유지보수성과 성능을 향상시키며, 데이터베이스 종속성을 줄이는 기술이다.

객체와 관계형 데이터베이스란?

  • 객체: 클래스에서 생성되며 속성(Field)과 기능(Method)을 포함한다.
  • 관계형 DB: 데이터를 테이블 형식으로 저장하며, 각 테이블은 열(Column)과 행(Row)으로 구성된다.
  • 문제점: 관계형 DB와 객체 지향 간의 패러다임 불일치로 인해 매핑과 변환 과정이 복잡해진다.

관계형 DB에 객체 저장 시 발생하는 문제점

1. 리소스별 CRUD 반복

  • 객체를 DB에 저장하려면 직접 SQL을 작성해 INSERT, UPDATE, SELECT, DELETE를 수행해야 한다.
  • 매번 객체를 SQL로 변환하거나 SQL 결과를 객체로 변환하는 작업이 필요하다.

2. 객체 수정 시 SQL 수정 필요

  • 객체의 필드가 변경되면 기존 SQL 문도 모두 수정해야 한다.
  • 결과적으로 SQL에 강하게 의존하는 개발 방식이 된다.

3. 패러다임 불일치 문제

  • 객체 지향과 RDB의 상이한 표현 방식(상속, 연관관계, 참조 등)으로 인해 추가적인 매핑 작업이 필요하다.

패러다임 불일치 문제

1. 상속

  • 객체는 상속을 통해 관계를 표현할 수 있지만, RDB는 이를 지원하지 않아 별도 매핑이 필요하다.
  • 상속 구조를 DB에 저장하려면 슈퍼타입/서브타입 관계로 나누고, JOIN SQL을 작성해야 한다.

2. 연관관계

  • RDB: 테이블 간 관계를 외래 키(FK)로 설정한다.
  • 객체: 참조를 사용해 관계를 설정한다.
    • 객체 참조를 사용하려면 별도의 코드 작성 및 추가 조회가 필요하다.
    • JOIN SQL로 데이터를 한 번에 가져올 수도 있지만, 성능 최적화가 까다롭다.

3. 객체 그래프 탐색 문제

  • 객체 간 관계를 탐색하려면 관련 데이터를 함께 조회해야 한다.
  • SQL 실행 결과만큼 탐색할 수 있으므로, Entity의 신뢰성이 떨어질 수 있다.
  • 연관된 데이터를 한꺼번에 가져오면 필요하지 않은 데이터도 포함되며, 계층 분할이 어려워진다.

4. 객체 비교 문제

  • 동일한 데이터를 조회해도 객체의 인스턴스가 다르면 비교(==) 결과가 false가 된다.

Java Collection 사용 시의 장점

  • 저장: 객체를 Collection(List)에 추가할 수 있다.
  • 조회: Collection에서 객체를 조회하고, 연관 데이터를 탐색할 수 있다.
  • 비교: 동일한 Collection 내 객체는 동일한 참조로 관리된다.

결론

  • 객체 지향적으로 설계하려면 SQL과 매핑 작업이 복잡해지고, 개발자의 부담이 커진다.
  • JPA(Java Persistence API)는 객체를 Java Collection처럼 관리할 수 있게 해준다.
    • 객체의 신뢰성과 비교 가능성을 보장한다.
    • 패러다임 불일치 문제를 모두 해결한다.

0개의 댓글