Diary/TIL
2024-04-02) JPA 필기 1
nsean
2024. 5. 13. 22:29
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 프로그래밍을 단순화함
- ORM의 필요성
- 객체 지향 프로그래밍의 장점을 데이터베이스 관리에 활용하기 위해 필요.
- 비즈니스 로직과 테스트 구현의 용이성, 디자인 패턴을 사용한 성능 개선 및 코드 재사용이 가능.
- ORM이 해결하려는 문제점
- 상속의 문제: 객체 간의 상속관계와 멤버 변수를 RDBMS에서는 표현하기 어렵다.
- 관계 문제: 객체는 참조를 통해 관계를 가지지만, RDBMS는 외래키와 조인을 통해서만 참조 가능.
- 탐색 문제: 객체의 참조를 통한 탐색이 RDBMS에서는 추가 쿼리나 조인을 필요로 하며 비효율적이다.
- 밀도 문제: 객체의 크기가 클 수 있으나, RDBMS는 기본 데이터 타입만 존재.
- 식별성 문제: 객체는 hashCode나 equals() 메소드를 통해 식별하지만, RDBMS는 주로 PK를 사용.
- ORM의 최적화 방법
- 1차 캐시와 2차 캐시를 통한 데이터 접근 최적화.
- 영속성 컨텍스트를 활용한 쓰기 지연을 통해 트랜잭션 종료 시 한 번에 쿼리를 전송, 여러 수정 사항을 한 번에 처리.
- 실제 적용 예
- @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' Related Articles