Search
🎻

Spring Data JPA (1)

태그
spring boot
JPA에 대해 공부하기 앞서 알아야할 개념들.

Persistence

데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성. 영속성
Persistence Layer를 어떻게 구현하느냐의 관점에 따라 두가지로 나눌 수 있음
JDBC(Java Database Connectivity):
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
자바 애플리케이션에서 DBMS의 종류에 상관 없이, 하나의 JDBC API를 이용해 DB작업을 처리
JDBC 인터페이스를 구현한 각각의 DBMS 드라이버만 변경
1. Load Database Driver 2. DB와 연결하는 통로 역할을 할 connection 객체를 생성 (getConnection()) 3. statement 객체를 생성하고(createStatement()) 이를 통해 쿼리문을 생성 및 실행 4. 결과물이 있다면 ResultSet 객체를 생성 5. 자원 해제
Plain Text
복사
→ JDBC만을 사용하여 영속성을 부여함으로써 발생하는 문제점
1.
간단한 sql을 실행하는 데도 중복된 코드를 반복적으로 사용
2.
Connection과 같은 공유 자원을 제대로 릴리즈 해주지 않으면 시스템의 자원이 바닥나는 버그 발생
Persistence Framework
JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 데이터베이스와의 연동 가능.
모든 Persistence Framework는 내부적으로 JDBC API를 이용
SQL Mapper
SQL을 직접 작성, SQL 문과 객체의 필드를 매핑하여 데이터를 객체화, MyBatis가 이에 해당
→ DAO와 SQL문을 분리함으로써 SQL문들 숨길 수 있었지만
SQL Mapper는 쿼리문을 직접 작성하게 되어서 결국 특정 DB에 종속적으로 사용하게 되어 버림
→ 객체지향 패러다임과 RDB 패러다임의 불일치가 발생하게 되어버림
ORM

ORM(Object Relational Mapping)

객체 지향 언어를 이용하여, 서로 호환되지 않는 타입 간의 데이터를 변환하는 기술
SQL Query가 아닌 직관적인 코드(메서드)로 데이터 조작
이전에는 패러다임 불일치 문제가 발생했었는데 이런 문제를 ORM은 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하고 직관적인 메서드를 조작하게 하여 개발자의 불편 없이 해결할 수 있게 함
좁은 의미: DB(RDBMS) 테이블 데이터를 객체와 매핑하는 기술
효과: RDBMS를 객체 지향 DB로 가상화하는 것
ORM으로 얻고자 하는 것
DB의 추상화: 특정 DB에 종속되는 표현이나 구현이 사라지고, DB 변경에 좀 더 유연해짐
객체의 이점을 활용: 객체간 참조, type-safety
관심사 분리: DB 동작에 관한 코드 작성의 반복을 최소화하고 비즈니스 로직에 집중

JPA(Jakarta Persistence API)

자바에서 ORM 기술을 사용해 RDBMS를 다루기 위한 인터페이스 표준 명세
API + JPQL + metadata(+ Criteria API)
기본적으로 관계형 데이터베이스의 영속성만을 규정
JPA 구현체 중에 다른 유형의 데이터베이스 모델을 지원하는 경우가 있지만, 원래 JPA 스펙과는 무관

JPQL(Jakarta Persistence Query Language)

RDBMS로부터 독립적인 객체 지향 쿼리 언어
JPA 표준의 일부로 정의됨
RDBMS의 엔티티를 다루는 쿼리를 만드는데 사용
SQL의 영향을 받아서 형식이 매우 유사
특별한 요구사항이 있지 않은 한, JPQL을 몰라도 됨
JPQL을 직접 사용하고 있다면, 반드시 필요했던 일인지 검토

Hibernate

자바생태계를 대표하는 ORM Framework
스프링 부트에서 채택한 메인 ORM Framework
JPA 표준 스펙을 구현한 JPA Provider
고성능, 확장성, 안정성을 표방

HQL(Hibernate Query Language)

하이버네이트가 사용하는 SQL 스타일 비표준 쿼리 언어
객체 모델에 초점을 맞추어 설계됨
JPQL의 바탕이 됨(JPQL은 HQL의 subset)
JPQL은 완벽한 HQL 문장이지만, 반대로는 성립하지 않음

Spring Data JPA

스프링에서 제공하는 JPA 추상화 모듈
JPA 구현체의 사용을 한 번 더, Repository라는 개념으로 추상화
JPA 구현체의 사용을 감추고, 다양한 지원과 설정 방법을 제공
JPA 기본 구현체로 Hibernate 사용
Querydsl 지원

@Repository

스프링 스테레오타입 애노테이션
Persistence layer를 구현하는 클래스에 사용
@Component와 마찬가지로 해당 클래스를 빈으로 등록
DAO 패턴을 적용한 클래스에도 사용 가능
persistence layer 에서 발생하는 예외를 잡아서 DataAccessException으로 처리해줌
Spring Data JPA를 사용한다면, 직접 사용할 일은 없다고 봐도 무방함