본문 바로가기

Diary/TIL

2024-04-02) JPA 필기 1

ORM의 탄생 배경

  • JDBC (Java Database Connectivity)
    • Java 애플리케이션과 데이터베이스를 연결하기 위해 개발된 기술.
    • JDBC 드라이버는 다양한 유형의 데이터베이스와 연결할 수 있으며, 연결(Connection), 상태(Statement), 결과셋(ResultSet) 등을 관리.
  • QueryMapper의 등장
    • JDBC 사용 중 발생하는 중복 코드와 DB 종속성 문제를 해결하기 위해 등장
    • QueryMapper는 SQL 쿼리와 객체(Object)의 필드를 매핑하여 데이터를 객체화하는 것을 목표로 함
  • ORM (Object-Relational Mapping)
    • QueryMapper의 한계를 넘어, 데이터베이스의 테이블을 객체(Object)와 직접 대응시켜 관리
    • 이는 객체지향 프로그래밍과 관계형 데이터베이스의 간극을 메우려는 시도로, 복잡한 매핑 과정과 많은 난관에 직면한다.

중요 기술 요소

  • JDBCTemplate: JDBC의 반복적인 프로그래밍을 간소화하는 도구로, 결과를 객체 인스턴스에 매핑하는 작업을 도움
  • MyBatis: SQL 쿼리를 XML 파일에 작성하여 코드와 SQL을 분리하고, JDBC 프로그래밍을 단순화함
  1. ORM의 필요성
    • 객체 지향 프로그래밍의 장점을 데이터베이스 관리에 활용하기 위해 필요.
    • 비즈니스 로직과 테스트 구현의 용이성, 디자인 패턴을 사용한 성능 개선 및 코드 재사용이 가능.
  2. ORM이 해결하려는 문제점
    • 상속의 문제: 객체 간의 상속관계와 멤버 변수를 RDBMS에서는 표현하기 어렵다.
    • 관계 문제: 객체는 참조를 통해 관계를 가지지만, RDBMS는 외래키와 조인을 통해서만 참조 가능.
    • 탐색 문제: 객체의 참조를 통한 탐색이 RDBMS에서는 추가 쿼리나 조인을 필요로 하며 비효율적이다.
    • 밀도 문제: 객체의 크기가 클 수 있으나, RDBMS는 기본 데이터 타입만 존재.
    • 식별성 문제: 객체는 hashCode나 equals() 메소드를 통해 식별하지만, RDBMS는 주로 PK를 사용.
  3. ORM의 최적화 방법
    • 1차 캐시와 2차 캐시를 통한 데이터 접근 최적화.
    • 영속성 컨텍스트를 활용한 쓰기 지연을 통해 트랜잭션 종료 시 한 번에 쿼리를 전송, 여러 수정 사항을 한 번에 처리.
  4. 실제 적용 예
    • @Cacheable, @GeneratedValue 등의 JPA 어노테이션을 통해 ORM 구현을 최적화.
    • 영속성 컨텍스트를 통한 데이터의 생명주기 관리 (비영속, 영속, 준영속, 삭제).

기본 매핑과 연관관계 설정

  • 기본 매핑 구성
    • @Entity: 클래스를 엔티티로 지정하며 데이터베이스 테이블과 매핑.
    • @Table: 엔티티와 매핑될 테이블의 이름을 지정.
    • @Id 및 @GeneratedValue: 엔티티의 주키 필드를 지정하고, 식별자 생성 전략을 설정.
    • @Column: 필드를 데이터베이스의 컬럼에 매핑하며, 세부적인 속성을 정의 (예: nullable, length).
  • 연관관계 매핑
    • @OneToOne, @OneToMany, @ManyToOne, @ManyToMany: 일대일, 일대다, 다대일, 다대다 관계를 정의.
    • @JoinColumn: 외래 키를 매핑하며, 외래 키 이름과 참조하는 테이블의 컬럼을 지정.
    • 실제 사용 예시를 통해 다양한 관계 유형의 구현 방법을 설명.

영속성 관리 기능

  • Cascade (영속성 전이)
    • 부모 엔티티의 상태 변화를 관련 자식 엔티티에 자동으로 전파. 예를 들어, 엔티티 삭제 시 연관된 자식 엔티티도 함께 삭제.
    • 옵션: ALL, PERSIST, REMOVE, MERGE, REFRESH, DETACH
  • orphanRemoval (고아 객체 제거)
    • 부모 엔티티와의 관계가 끊어진 자식 엔티티를 자동으로 삭제.
    • 주로 @OneToMany와 @OneToOne 관계에서 사용하여, 연관된 객체가 고아 상태가 되지 않도록 관리.

데이터 로딩 및 조회 최적화 전략

  • Fetch Type 설정
    • LAZY: 연관된 엔티티를 실제로 접근하는 시점에 로딩.
    • EAGER: 연관된 엔티티를 부모 엔티티 로딩 시점에 즉시 로딩.
    • 적절한 페치 타입 설정을 통해 애플리케이션의 성능을 최적화하고, 필요에 따라 fetch join을 활용하여 데이터를 효율적으로 불러옴.

복합키 및 고급 매핑 전략

  • 복합키 매핑
    • @IdClass: 복합 키를 구성하는 필드들을 포함하는 클래스를 지정.
    • @EmbeddedId: 복합 키를 하나의 클래스로 정의하고, 이를 엔티티 내에 내장.
    • 복합키를 활용한 매핑 방법과 실제 적용 사례를 통해 복잡한 데이터 구조를 효과적으로 관리하는 방법을 제공.

효율적인 코드 작성 및 도구 활용

  • IntelliJ Live Template
    • 반복적인 코드 구조를 빠르게 작성할 수 있도록 템플릿을 활용.
    • 코드의 일관성과 정확성을 높이며 개발 시간을 단축.
  • 추천 플러그인
    • Key PromoterX, Presentation Assistant: 개발자의 단축키 사용을 장려하고, UI를 통해 편리하게 정보를 제공, 개발 효율성 향상.

'Diary > TIL' 카테고리의 다른 글

2024-04-04) JPA 필기 3  (0) 2024.05.14
2024-04-03) JPA 필기 2  (0) 2024.05.14
2024-04-01) 프로메테우스, 그라파나 학습  (0) 2024.05.13
2024-03-30) nginx 배포  (0) 2024.05.12
2024-03-29) 캐디 배포 시도  (0) 2024.05.12