[인프런 워밍업 클럽 스터디 2기]: JPA가 그래서 뭔데;;
인프런 스터디 2주차 발자국입니다.
이번 주는 강의를 들으면서 진도를 수행하던 중에 PROJECT_SKILL 테이블이 h2 DB에서 조회되지않는 문제를 발견하고 왜 안되는지 찾아보았고 그과정에서 JPA: 영속성 콘텍스트 라는 녀석 때문에 테이블이 생성되지않았다는 점을 배웠습니다.
그래서 이번주는 JPA와 영속성 콘텍스트에 대해서 혼자 자습을 조금 해보았는데,,,너무 혼자 시간을 허비한거 같습니다
궁금한 내용들이 꼬리를 물고 계속 생겨서 🫤 차라리 쉽게 설명해주는 강의를 찾아서 배웠으면
금방 지나갈 거 같은 개념에 시간을 많이 쓴거 같아 아쉬웠습니다.
아무튼 아래는 이번주에 혼자 자습하면서 배워본 내용들을 정리한 것입니다.
전부 다 외운건 아니고 어느정도? 얕게는 이해를 마쳤다고 생각합니다.
혹시나 틀린 내용이 있다면 지적 부탁드립니다. 감사합니다.
0. ORM이란 무엇인가
ORM(Object-Relational Mapping)은 객체 지향 프로그래밍에서 데이터베이스와 상호작용하기 위한 기술로, 객체와 관계형 데이터베이스 간의 데이터를 매핑하여 변환하는 역할을 합니다. ORM은 데이터베이스의 테이블과 객체 지향 언어의 클래스를 연결해주어, 개발자가 SQL 쿼리 없이도 객체를 사용하여 데이터베이스 작업을 수행할 수 있게 합니다.
ORM의 주요 개념
객체 지향적인 접근: ORM을 사용하면 데이터베이스의 테이블을 객체로 다룰 수 있다.
이는 데이터베이스의 행(row)을 객체의 인스턴스로 변환하고, 컬럼을 객체의 속성으로 변환하는 것을 의미한다.
자동화된 매핑: ORM은 SQL 쿼리 생성과 데이터베이스와의 상호작용을 자동으로 처리하므로, 개발자가 비즈니스 로직에 집중할 수 있게 도와준다.
대표적인 ORM 도구: Hibernate, JPA(Java Persistence API), MyBatis 등이 있다.
1. JPA란 무엇인가
JPA(Java Persistence API)는 ORM 기술의 표준 인터페이스로, 자바 애플리케이션에서 데이터베이스와 상호작용하기 위한 명세를 제공한다. JPA는 직접적으로 ORM 기능을 제공하는 것이 아니라, ORM 기술을 위한 규칙과 표준을 정의하여, 다양한 구현체(Hibernate, EclipseLink 등)가 기능을 수행함.
JPA의 정의 및 역할
ORM 표준 인터페이스: JPA는 ORM 기술의 표준을 정의하여, 개발자가 특정 구현체에 의존하지 않고 일관된 방식으로 데이터를 처리할 수 있게 한다.
구현체의 예시: JPA의 구현체로는 Hibernate, EclipseLink, OpenJPA 등이 있으며, 이들 구현체는 JPA의 인터페이스를 구현하여 실제 데이터베이스 작업을 수행한다.
개발자들이 JPA를 사용하는 이유
생산성 향상: JPA는 데이터베이스 작업을 객체 지향적으로 처리할 수 있게 함으로써, SQL 쿼리 작성의 부담을 줄이고 코드의 가독성을 높인다.
유지보수 용이성: 엔티티 매핑을 통해 데이터베이스의 구조 변경에 따른 코드 변경을 최소화할 수 있다.
데이터베이스 독립성: 특정 데이터베이스에 종속되지 않으며, 다양한 데이터베이스로 쉽게 이식할 수 있는 애플리케이션을 구축할 수 있다.
JPA를 사용할 때 주의해야 할 사항
성능 문제: 잘못된 엔티티 설계나 관계 매핑으로 인해 성능 문제가 발생할 수 있으므로, 캐시와 페치 전략을 적절히 사용해야 합니다.
복잡한 설정: 영속성 컨텍스트, 트랜잭션 관리, Fetch 전략 등 복잡한 설정과 개념을 이해하지 않으면 예상치 못한 동작이 발생할 수 있습니다.
자동 쿼리 생성 기능의 오해: Spring Data JPA에서 제공하는 기능과 JPA 자체의 기능을 혼동하지 않도록 주의해야 합니다.
2. JPA의 특징
객체 지향적인 데이터베이스 접근: JPA는 데이터를 객체로 매핑하여 직접 조작할 수 있게 합니다. 이를 통해 SQL의 복잡한 문법 없이도 데이터를 처리할 수 있습니다.
자동화된 데이터베이스 스키마 관리: JPA의 스키마 설정 옵션(
create
,update
,validate
등)을 통해 데이터베이스 스키마를 자동으로 생성하거나 검증할 수 있습니다.
1차 캐시: JPA 표준에서 지원하는 기능으로, 영속성 컨텍스트 내에서 관리되며 트랜잭션 범위 내에서 데이터를 캐시한다. 동일한 트랜잭션 내에서는 데이터베이스에 재접근하지 않고 메모리에 저장된 엔티티를 사용한다.
2차 캐시: JPA 표준에는 포함되지 않고, JPA의 구현체(예: Hibernate)에서 지원하는 기능이다. 2차 캐시는 애플리케이션 범위에서 동작하며, 여러 영속성 컨텍스트 간에 데이터를 공유하여 성능을 최적화한다. 이를 사용하려면 Ehcache, Hazelcast, Infinispan 등과 같은 캐시 프로바이더를 통합해야 한다고 하는데 아직 무슨 말인지 잘 모르겠다...
영속성 컨텍스트: 엔티티 매니저가 관리하는 영속성 컨텍스트는 엔티티의 상태를 추적하고, 동일한 트랜잭션 내에서 동일한 데이터를 캐싱하여 성능을 향상시킬 수 있다.
Fetch 전략: 데이터 로딩 방식으로
즉시 로딩(EAGER)
과지연 로딩(LAZY)
이 있으며, 성능과 자원 사용을 최적화할 수 있다.Cascading(영속성 전이): 부모 엔티티의 상태 변경이 자식 엔티티에도 자동으로 전이되도록 설정할 수 있다.
영속성 콘텍스트에 대해서도 자습했는데 아직 내용이 정리되지않아서 다음번 블로그 글에서 작성해보도록 하겠습니다.
댓글을 작성해보세요.