처음부터 차근차근

JPA(수정 중) 본문

Framework/Spring

JPA(수정 중)

_soyoung 2022. 8. 25. 14:13
반응형

ORM 

Object Relational Mappin의 준말로 객체 관계 매핑이다.

클래스(객체)와 데이터베이스 테이블(관계)을 자동으로 매핑 하는 기술이다.

ORM을 이용하면 쿼리문 작성이 아닌 메서드로 데이터를 조작할 수 있다는 장점이 있다.

 

JPA

JPA는 자바의 ORM 기술 표준으로 채택된 인터페이스 모음이다.

ORM보다 더 구체화된 개념이다.

인터페이스이기 때문에 아직 구현된 것이 아니고, 어떻게 동작해야하는지 메커니즘이 정리되어있다.

JPA는 내부적으로 JDBC를 사용해서 개발자 대신 sql을 생성하고, 데이터베이스를 조작하고, 객체를 자동 매핑하는 역할을 한다.

JPA 기반 구현체는 대표적으로 3가지가 있다.

Hibernate, EclipseLink, DataNucleus

JPA interface 구현 구조도

이 중 Hibernate가 가장 많이 사용된다.

 

Hibernate

하이버네이트는 자바의 ORM 프레임워크로, JPA가 정의하는 interface를 구현하고 있다.

Spring에서는 하이버네이트의 기능을 편리하게 사용할 수 있도록 모듈화한 프로젝트를 하나 만들었는데 그게 바로 Spring Data JPA이다.

 

Spring Data JPA

Spring Data JPA 하이버네이트의 기능을 더 쉽고 편리하게 사용할 수 있게 하는 라이브러리(스프링 하위 프로젝트)이다.

CRUD 처리에 필요한 인터페이스(예를들어 인터페이스)들을 제공하며, 

리포지토리를 사용해서 데이터베이스에 접근하는 방식으로 데이터베이스를 조작한다.

 

정리

ORM : 객체(클래스) 관계(db) 매핑 기술

JPA : ORM 기술 사용한 인터페이스 모음

Hibernate : JPA 구현체

Spring Data JPA : 하이버네이트 더 쉽게 사용할 수 있게 만든 라이브러리

 

영속성 컨텍스트(Persistence Context)

엔티티 객체를 보관하는 저장소

엔티티객체가 애플리케이션에서 만들어져서 영속성 컨텍스트에 들어오면 JPA는 엔티티 객체의 매핑 정보를 데이터베이스에 반영한다.

영속성 컨텍스트에 들어있는 객체를 영속 객체(Persistence Object)라고 부른다.

영속성 컨텍스트는 세션 단위의 생명주기를 가진다.

데이터베이스에 접근하기 위한 세션이 생성되면 영속성 컨텍스트가 만들어지고, 세션이 종료되면 영속성 컨텍스트도 같이 없어진다.

 

엔티티 매니저(Entity Manager)

엔티티를 관리하는 객체

데이터베이스에 접근해서 CRUD 작업을 수행한다.

엔티티 매니저는 엔티티를 영속성 컨텍스트에 추가해서 영속 객체로 만들고, 영속성 컨텍스트와 데이터 베이스를 비교하면서 실제 데이터베이스에 접근해서 CRUD 작업을 수행한다.

그래서 레파지토리 안에서 엔티티 매니저를 사용는 것을 볼 수 있다. ex) SimpleJpaRepository

 

엔티티 매니저는 엔티티 매니저 팩토리(Entity Manager Factory)가 만든다.

앤티티 매니저 팩토리는 애플리케이션에서 단 하나만 생성되고, 모든 엔티티가 공유해서 사용한다.

 

 

spring data jpa 실습

1. jpa 의존성을 추가한다.

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

 

2. application.properties에 하이버네이트 관련 설정들을 추가한다.

# spring data jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

ddl-auto : 데이터베이스를 자동으로 조작하는 옵션

 

<ddl-auto에 대입할 수 있는 값들>

create : 애플리케이션이 가동될 때 기존 테이블을 지우고 새로 생성한다.

create-drop : create와 똑같은 기능을 수행하는데, 애플리케이션 종료하는 시점에 테이블을 지운다.

update : 애플리케이션이 가동될 때 (sessionFactory가 실행될 때) 객체 검사해서 변경된 스키마를 갱신한다. 기존에 저장된 데이터는 유지된다.

validate : update처럼 객체를 검사하지만 스키마는 건드리지 않는다. 검사 과정에서 db의 테이블 정보와 객체 정보가 다르면 에러가 난다.

none : ddl-auto를 사용하지 않는다.

 

show-sql=true : 로그에 하이버네이트가 생성한 쿼리문을 출력한다.

format_sql : 쿼리문 사람이 보기좋게 한줄 -> 여러줄로 출력한다.

 

3. 엔티티를 생성한다.

spring data jpa는 엔티티를 만들면 엔티티 정보대로 테이블을 자동 생성해줘서 따로 테이블을 작성할 필요가 없다!

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String uid;

    @Column(nullable = false)
    private String pwd;
}

 

@Table

엔티티 클래스는 테이블과 자동으로 매핑되서 클래스 이름과 테이블 이름을 다르게 해야하는 경우가 아니라면 사용하지 않아도 된다. 주의 : 영어 대소문자가 다르면 사용해야한다.

 

@GeneratedValue()

보통 @Id와 함께 사용되고, 해당 필드의 값을 어떤 방식으로 자동 주입할 지 결정한다.

<@GeneratedValue에 넣을 수 있는 값들>

auto : 기본값. 기본값 사용하는 데이터베이스에 맞게 자동 생성한다.

identity : 기본값 생성을 db에 위임한다. db의 auto_increase에 맞게 자동생성

sequence : @SequenceGenerator로 id 생성기를 설정하고, 이것을 통해 값을 주입 받는다.

table : id로 사용할 숫자 보관 테이블을 별도로 만들어서 그 값 갱신하여 사용한다.

 

@Calumn()

컬럼에 대한 설정을 할 때 사용한다.

<@Calumn에 넣은 수 있는 값들>

name : 데이터베이스 컬럼명. 엔티티 클래스 필드는 자동으로 테이블 컬럼으로 매핑되는데, 필드명이랑 컬럼명이 다르면 이 속성을 써야 한다.

nullable : 레코드 생성할 때 컬럼 값에 null이 들어가도 되는지 표시.

length : db에 저장되는 데이터의 최대길이

unique : 해당 컬럼 유니크로 설정

 

@Transient

엔티티 클래스에는 선언돼있지만 db에서 필요없을 경우 사용한다.

 

4. repository interface를 생성한다.

인터페이스에 JpaRepository를 상속하면 비로소 spring data jpa 기능을 사용할 수 있다.

public interface BoardRepositoryByJpa extends JpaRepository<Board, Integer> {
    
}

이렇게 상속하는 것만으로 jpa에서 미리 만들어놓은 많은 메서드를 사용할 수 있는데, 커스텀 메서드도 생성할 수 있다.

단 커스텀 메서드를 생성하려면 아래의 레파지토리 메서드 명명 규칙을 따라야 한다.

 

레파지토리 메서드 생성 규칙

첫글자를 소문자로하고 나머지는 모두 카멜케이스로 한다. 

 

FindBy : sql의 where

And, Or : 조건 여러개 설정할 때 사용  ex) findByNameAndAge(String name, int age)

Like : sql의 like. 특정 문자 포함하는지 여부

NotLike : sql의 not like

StartsWith : 특정 키워드로 시작하는 문자열 조건 설정

StartingWith : 특정 키워드로 시작하지 않는 문자열 조건 설정

EndsWith : 특정 키워드로 끝나는 문자열 조건 설정

EndingWith : 특정 키워드로 끝나지 않는 문자열 조건 설정

IsNull : 레코드 값이 Null인 값 검색

IsNotNull : 레코드 값이 null이 아닌 값 검색

True : boolean 타입 중 true 값인 레코드 검색할 때 사용

False : boolean 타입 중 false 값인 레코드 검색할 때 사용

Before : 시간 기준으로 전 시간 값 검색

After : 시간 기준으로 후 시간 값 검색

LessThan : 특정 값 기준으로 더 작은 값 비교할 때 사용

GreaterThan : 특정 값 기준으로 더 큰 값 비교할 때 사용

Between : 두 숫자 사이의 값 검색

OrderBy : sql의 order by

CountBy : sql의 count

 

 

반응형
Comments