개발 공부 기록/02. Spring Boot

JPA, Hibernate, Spring Data JPA란?

박세류 2023. 12. 11. 18:46
Spring Boot에서 SQL을 직접 사용하는 것은 단점이 존재한다.

  1. SQL을 작성하기 때문에 실수할 수 있고, 실수 인지 시점이 느리다.
    1. 컴파일 에러가 안나고, 런타임 오류가 나기 때문이다.
    2. 즉, 서버 동작에는 SQL문의 오타는 아무런 지장이 없기 떄문이다.
  2. 특정 데이터베이스에 종속적이게 된다.
  3. 반복작업이 많아진다.
  4. 데이터베이스의 테이블과 객체는 패러다임이 다르다 ( 상속, 연관관계 등)

=> 이를 해결하기 위해 만든것이 JPA다.

 

JPA?

Java Persistence API의 약자로 자바 진영의 ORM이다.

Persistence : 영속성,  서버가 재시작되어도 데이터는 영구적으로 저장되는 속성 (데이터베이스 등)

 

 

ORM?

Object-Relational Mapping, 즉 자바 클래스(객체)와 테이블을 매핑하는 것을 의미한다.

객체와 DB의 테이블을 짝지어 데이터를 영구적으로 저장할 수 있는 것을 JPA라고 한다.

JPA는 interface와 같은 규칙 이기 떄문에, 구현체가 필요하다.

이 구현체를 작성한 코드중 가장 유명한 프레임워크가 Hibernate이다.

Hibernate는 내부적으로 JDBC를 사용하고 있다.

 

한 번 코드로 작성해보자.

아래 클래스 Man 과 

public class Man {
    private String name;
    private Integer age;
}

 

테이블 Man

CREATE TABLE MAN(
    id bigint auto_increment,
    name varchar(10),
    age int,
    primary key(id)
)

이 있다. 이를 JPA로 작성하기 위해서는 다음과 같은 순서를 따른다.

 

1. 클래스에 @Entity 어노테이션을 붙여준다.

Entity는 저장, 관리되어야 하는 데이터를 의미한다.

따라서 해당 어노테이션을 붙이면, 스프링은 Man객체와 Man 테이블을 같은 걸로 간주해준다.

@Entity
public class Man {
    private String name;
    private Integer age;
}

 

2. 테이블과 객체를 일치시켜준다.

@Entity
public class Man {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;
    
    private String name;
    private Integer age;
}
  • @Id : 이 필드(Long id)를 PK로 만든다.
  • @GeneratedValue : auto_increment와 매칭된다.

 

3.  기본 생성자를 추가해준다.

JPA에 의해 테이블과 매핑된 객체는 파라미터를 가지지 않은 기본 생성자가 꼭 필요하다.

@Entity
public class Man {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;
    
    private String name;
    private Integer age;
    
    public Man(){ }
    
}

다음과 같이 추가해준다.

 

4. 기본 칼럼을 매핑해준다.

@Entity
public class Man {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id = null;
	
    @Column(nullable = false, length = 20, name = "name")
    private String name;
    private Integer age;
    
    public Man(){ }
    
}

@Column 어노테이션으로 매핑해주면 된다. 허나 자료형과 이름이 테이블과 완전히 매칭되면 생략해도 상관이 없다.

그러므로 다를경우에만 해주면 된다.

 

5. application.yml을 수정해준다.

대충 이런식으로 해주자.

 

JPA 메소드 정리

save() : 주어지는 객체를 저장하거나 업데이트 시켜준다.

findAll() : 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.

findById() : id를 기준으로 특정한 1개의 데이터를 가져온다.

 

Spring Data JPA?

JPA와 조금 다르다. 복잡한 JPA 코드를 스프링과 함께 쉽게 사용할 수 있도록 도와주는 라이브러리.

save(), findAll(), findById()등은 Spring Data JPA가 지원해 주는 것이다.

 

 

반응형