[JPA] ORM과 JPA 이해하기

2024. 3. 15. 22:44Spring/Java

1. 서론

Spring Framework의 많은 프로젝트를 보면 많은 사람들이 JPA라는 기술을 사용한다. 오늘은 이 JPA라는 기술에 대해 설명해보고자 한다.

2. ORM

JPA를 알기 위해서 우선 ORM 이라는 것에 대해 알아보자. ORM 이란 Object-Relational Mapping의 약자이다. ORM은 SQL을 사용하지 않고 데이터베이스를 관리할 수 있는 도구이다. 데이터베이스에 테이블을 만들고 CRUD 기능을 사용하기 위해서는 SQL 쿼리를 데이터베이스 서버에 전달해야 한다. 하지만 코드만으로 이런 SQL 쿼리를 대신할 수 있도록 도와주는 것이 ORM이다.

 

예를 들어보면 User라는 테이블에 id, name, age라는 열이 있다고 가정하자.

id name age
1 금장 26
2 준범 24
... ... ...

 

이런 User 테이블에 데이터를 저장하기 위해서는 아래와 같은 SQL 쿼리를 작성해야 한다.

INSERT INTO User (id, name, age) values (1, '금장', 26);
INSERT INTO User (id, name, age) values (2, '준범', 24);

이러한 SQL 쿼리 대신 ORM을 이용한다면 아래와 같은 코드로 대체될 수 있다. (Java 기준)

User user1 = new User();
user1.setId(1);
user1.setName("금장");
user1.setAge(26);

User user2 = new User();
user2.setId(2);
user2.setName("준범");
user2.setAge(24);

위와 같이 자바 코드만으로 데이터베이스에 CRUD 기능을 이용할 수 있는 것이 ORM이다. 예전 Django Framework로 개발할 때에도 ORM이라는 것을 사용한 적이 있다. Django 같은 경우 따로 설치 없이 프레임워크 자체적으로 지원을 해주기 때문에 하나의 큰 장점이라고 생각했다.

3. JPA 란 무엇인가

JPA는 Java Persistence API의 약자이다. Spring boot는 JPA를 ORM 기술의 표준으로 사용한다. JPA는 인터페이스로 이루어져 있기 때문에 이를 이용하기 위해서는 구현체가 필요하다. JPA의 구현체는 대표적으로 Hibernate 가 있다. 앞으로 데이터베이스를 관리할 때는 JPA와 Hibernate의 조합을 이용할 것이다.

4. JPA 환경설정

JPA를 이용하기 위해서는 우선 데이터베이스 세팅이 필요하다. 간단한 테스트를 위해서는 H2 데이터베이스를, 이외의 경우에는 MySQL, PostgreSQL 등 필요한 데이터베이스를 이용하면 될 것 같다.

 

1. build.gradle 설정

스프링 부트의 build.gradle 파일에서 JPA 관련 의존성을 받아주자.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

의존성을 받고 gradle을 새로 빌드하면 JPA 라이브러리가 설치된다.

2. application.yml 

application.yml 에서 필요한 JPA 설정을 해준다.

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true # true 설정 시 SQL 쿼리를 보기 쉽게 포맷팅하여 로그에 출력
        show_sql: true # 모든 SQL 쿼리를 로그에 출력
        dialect: org.hibernate.dialect.PostgreSQLDialect # DB SQL언어 설정
    hibernate:
      ddl-auto: create # DB가 스키마를 생성, 갱신 또는 유지하는 방법을 지정
                       # create : DB 삭제 후 새로운 스키마 생성
                       # update : DB 변경사항만 적용
                       # validate : DB와 엔티티 클래스 간의 일관성 검사
                       # none : DB 스키마 관리 X (수동 관리하는 경우 사용)
                       # production 환경에서는 validate 혹은 none을 사용