[SpringBoot] JPA 시작

·2023년 9월 9일

JPA 탄생 배경

JAVA는 객체 지향 언어이다. 요즘 시대에서는 객체를 관계형 DB에 관리를 하는 방식을 사용한다. 이로 인해 SQL에 의존적인 개발을 피하기 어려운데 개발자는 SQL 매퍼의 역할을 하게 된다.

하지만 객체를 객체답게 모델링 할수록 매핑 작업이 늘어나게 되고, 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 있는 방법을 찾게 된다.

그렇게 해서 탄생한 것이 JPA(Java Persistence API)이다. JPA란 자바 진영의 ORM 기술 표준으로, 객체 관계 매핑으로 객체는 객체대로 설계하면서, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하여 이 둘을 ORM 프레임워크가 중간에서 매핑을 해준다.

그렇다면 JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발할 수 있게 해준다.
  • 생산성, 유지보수, 성능에서 이점을 가진다.
  • 객체와 관계형 DB의 패러다임의 불일치를 해결해준다.
  • 데이터 접근 추상화와 벤더 독립성

데이터베이스 방언

JPA는 특정 데이터베이스에 종속되지 않아서 다양한 방언이 존재하는데, 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다.

  • 가변 문자: MySQL은 VARCHAR, oracle은 VARCHAR2
  • 문자열을 자르는 함수: SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
  • 페이징: MySQL은 LIMT, Oracle은 ROWNUM

*여기서의 방언이란 SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능을 말한다. (하이버네이트는 40가지 이상의 데이터베이스 방언을 지원한다.)

데이터베이스 방언은 hibernate.dialect 속성에 저장한다.

  • H2: org.hibernate.dialect.H2Dialect
  • Oracle 10g: org.hibernate.dialect.Oracle10gDialect
  • MySQL: org.hibernate.dialect.MySQL5InnoDBDialect

JPA 구동 방식

JPA는 persistence가 설정 정보를 확인하고 EntityManagerFactory라는 클래스를 만들고 필요할 때 마다 EntityManager를 생성하는 방식으로 동작한다.

객체와 테이블을 생성하고 매핑하기

  • @Entity: JPA가 관리할 객체임을 알려준다.
  • @Id: 데이터베이스의 PK와 매핑을 해준다.

*주의

  1. 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유해야 한다.
  2. 엔티티 매니저는 쓰레드간에 공유하지 않는다. —> 사용하고 버려야 한다.
  3. JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다.

JPQL

JPA를 사용하면 엔티티 객체를 중심으로 개발을 하게 되는데 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색을 하게 된다. 모든 DB 데이터를 객체로 변환해서 검색하는것은 불가능 한데, 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.

JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. JPQL은 SQL 문법과 유사하여 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다. 또한 데이터베이스 테이블을 대상으로 쿼리를 날리는 SQL과 다르게 JPQL은 엔티티 객체를 대상으로 쿼리를 날린다.(객체 지향 쿼리) 따라서 SQL을 추상화하여 특정 데이터베이스 SQL에 의존을 하지 않게 된다. JPQL을 한마디로 정의하면 객체 지향 SQL이라고 볼 수 있다.

profile
고민0

0개의 댓글