오늘의 뚝딱/STUDY

[JPA] JPA란? | JPA 사용을 위한 dependency 설정

녱녱 2023. 3. 22.

ORM(Objec - Relational mapping) 이란?

DB를 사용하려고 할 때 SQL query 대신 ORM을 사용하면 개발자가 쿼리를 직접 작성하지 않아도 DB의 데이터를 자바 문법만으로 처리할 수 있다. ORM이 자동으로 SQL 쿼리를 생성해주기 때문이다. 이 때, 데이터를 관리할 때 사용하는 ORM 클래스를 엔티티(Entity)라고 한다.

 

 

(+) ORM을 사용하면 DB 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지/보수 하기가 편리하고 내부에서 안전한 SQL 쿼리를 자동 생성해 주므로 개발자가 달라도 통일된 쿼리가 작성 가능하며 오류 발생률도 줄일 수 있게 된다.

 

JPA(Java Persistence API)란?

스프링부트는 JPA를 사용해 DB를 처리한다. JPA는 ORM의 기술 표준으로 사용하는 인터페이스의 모음이다. JAVA에서 제공하는 API. 스프링에서 제공하는 API가 아니다.

JPA는 인터페이스이므로 구현하는 실제 클래스가 필요하며, 대표적으로 하이버네이트(Hibernate)가 있다.

 

JPA의 동작 과정

Java application과 JDBC 사이에서 동작하며 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용해 SQL을 호출해 DB와 통신하게 된다. 개발자가 직접 JDBC API를 사용하는 것이 아니다. 예시를 살펴보자.

 

MemberDAO에서 객체를 저장하는 경우이다. 우선 개발자는 JPA에게 Member 객체를 넘기게 된다. Member 객체를 받은 JPA는 Member Entity를 분석한후 INSERT SQL을 생성한 후 JDBC API를 사용해 SQL을 DB에 날리게 되는 과정이다.

다음으로 Member 객체를 조회하는 경우이다. 개발자는 Member의 pk 값을 JPA에 넘긴다. pk 값은 넘겨받은 JPA는 Entity의 mapping 정보를 바탕으로 적절한 SELECT query를 생성하게 되고 JDBC API를 사용해 DB에 query를 날리고 DB로 부터 결과를 받아온 후 결과(ResultSet)을 객체에 모두 mapping 한다.

이 때 query를 JPA가 생성해 주기 때문에 Object과 RDB 간의 패러다임 불일치를 해결할 수 있게 된다.

 

Hibernate란?

JPA의 구현체이다. JPA는 interface Hibernate는 interface를 구현한 class라 생각하면 된다. 즉, JPA를 사용하기 위해 반드시 Hibernate를 사용해야하는 것이 아니며, DataNucleus, EclipseLink 등 다른 구현체를 사용해도 되고 본인이 직접 JPA를 구현해 사용해도 무방하다.

 

Spring Data JPA는?

Spring에서 제공하는 모듈 중 하나로, JPA를 더 쉽고 편리하게 사용할 수 있도록 도와주는 것이다. JPA를 한 단계 추상화 시킨  Repository라는 인터페이스를 제공한다. 정해진 규칙에 따라 메소드를 입력하면 Spring이 해당 메소드 이름에 알맞는 쿼리를 날리는 구현체를 만들어 Bean으로 등록까지 해준다.

Spring Data JPA, JPA, Hibernate의 전반적인 관계는 위와 같이 되는 것이다!

 

그렇다면 사용하기 위해 설정해야할 dependency와 application.yml은?

dependencies {
    ...
    
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.mysql:mysql-connector-j'

    ...
}

본인이 사용하는 DB에 맞게 추가해주고

spring:
  ...
  
  jpa:
    hibernate:
      ddl-auto: create #DB 테이블 자동생성(엔티티 클래스만 만들면 됨)
    properties:
      hibernate:
        show_sql : true
        format_sql : true

application.yml 파일에도 추가해준다. 띄어쓰기가 매우매우 중요하니 참고하도록 하자.

ddl-auto엔 다양한 설정값이 있다.

  • none: entity가 변경되더라도 DB를 변경하지 않는다
  • update: entity의 변경 부분만 적용
  • validate: 변경사항이 있는지 검사만 함
  • create: 스프링부트 서버가 시작 될 때 모두 drop하고 다시 생성
  • create-drop: create와 동일, 하지만 종료시에도 모두 drop

개발 환경에서는 보통 update를 운영환경에서는 none/validate 모드를 사용한다고 한다.

 


📕 Reference

강의

https://wikidocs.net/book/7601

 

댓글