본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JPA Hibernate

[JPA] JPA 소개 및 프로젝트 준비

by 김코더 김주역 2021. 8. 14.
반응형

1. ORM, JPA, Hibernate란?

이 셋을 묶어서 설명하는 것이 가장 효율적일 것 같다.

  • ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스(RDB)를 매핑시켜주는 프레임워크
  • JPA(Java Persistent API) : Java 진영의 ORM 기술 표준
  • Hibernate : JPA를 구현한 ORM 프레임워크들 중 하나

※ JPA는 표준이기 때문에 다른 구현 기술(H2, Oracle, MySQL 등)로 손쉽게 변경할 수 있다.

 

 

 

2. JPA의 장단점

1) 장점

(1) 높은 생산성, 편한 유지보수

- 객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결

※ 상속관계(객체-상속, 테이블-슈퍼/서브 타입), 연관관계(객체-참조, 테이블-외래키), 객체 동일성 비교 등

- JPA가 Query 작업을 해주기 때문에, 개발자는 별도의 SQL 작성을 하지 않아도 됨

- 테이블 컬럼이 변경되어도 JPA에서 알아서 관리해주기 때문에 개발에만 집중할 수 있음

- DB 엔진을 바꿔도 간단한 설정으로 JPA가 해당 엔진의 문법(방언)으로 해석할 수 있음

- IDE의 도움으로 문법 오류를 줄일 수 있음(QueryDSL)

 

(2) 1차 캐시와 동일성 보장

- 영속성 컨텍스트는 엔티티를 저장하고 관리하는 곳으로, 기본적으로 트랜잭션과 동일한 생명 주기를 갖는다. 조회하려는 엔티티가 영속성 컨텍스트에 저장되어 있다면 DB를 조회하지 않고 영속성 컨텍스트에서 가져오기 때문에 성능상으로도 유리하다.

- 같은 영속성 컨텍스트에서는 식별자가 같은 엔티티 인스턴스의 동일성을 보장한다. 영속성 컨텍스트가 다르다면 식별자가 같은 엔티티여도 동일성 비교에 실패하기 때문에 동등성 비교를 해야 한다.

- DB에 반영되는 내용은 영속성 컨텍스트(1차 캐시)의 변경 내역이다.

※ 1차 캐시 : 영속성 컨텍스트에 존재하는 캐시다. 1차 캐시의 키와 값에는 각각 식별자 값과 엔티티 인스턴스가 저장된다.

※ 트랜잭션 : 두 commit 지점의 사이

https://kimcoder.tistory.com/242

 

[Spring] 트랜잭션

1. 개념 트랜잭션의 개념을 이해하기 전에 COMMIT과 ROLLBACK이 무엇인지 알 필요가 있다. COMMIT : 변경된 내용을 모두 영구적으로 저장하는 명령어 ROLLBACK : 문제가 발생 했을 때, 이전에 COMMIT 했던 시

kimcoder.tistory.com

 

(3) 쉬운 JOIN 작업

- 지연 로딩 기법과 즉시 로딩 기법을 쉽게 번갈아 사용할 수 있음

※ 지연 로딩 : 객체가 실제 사용될 때 로딩

※ 즉시 로딩 : JOIN으로 한번에 연관된 객체까지 미리 조회

- 지연 로딩을 사용하면 성능 걱정 없이 무한한 참조(객체 그래프 탐색)가 가능하다.

member.getOrder().getItem().getCategory()...

 

 

2) 단점

- 복잡한 데이터베이스에서는 사용이 더 어려울 수 있음

 

 

 

3. 프로젝트 생성

아래 사이트에서 Spring Project를 쉽게 생성할 수 있다.

https://start.spring.io/

 

필자는 다음과 같이 설정했다.

(dependencies)

<dependencies>
  <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
  </dependency>
  
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

 

resources/application.properties에 h2-console 사용을 위한 속성들을 추가한다.

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

 

"http://localhost:8080/h2-console" 접속 후 다음과 같은 화면이 나왔을 때, [Connect]를 눌러 데이터베이스 페이지가 잘  나오면 설정이 성공적으로 적용된 것이다.

 

반응형

댓글