Project/Study

[Spring Boot] Spring Data JPA

by somida 2021. 8. 3.

SQL Mapper vs ORM Mapper

SQL Mapper

  • SQL 문장으로 직접 데이터베이스를 다루므로 SQL을 직접 명시해줘야함
  • SQL 문법에 종속적
  • MyBatis, jdbcTemplates...

ORM Mapper

  • DB 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL 자동 생성
  • SQL문법에 종속되지 않음
  • 객체와 관계형 DB의 데이터를 자동으로 매핑해주는 것
  • 객체지향 프로그래밍 가능
  • JPA, Hibernate...

 

Spring Data JPA

JPA는 인터페이스이므로 이 JPA를 사용하기 위해서는 구현체가 필요하다.

대표적으로 Hibernate, Eclipse Link 등이 있는데 Spring에서는 직접 다루지 않고 추상화한 Spring Data JPA를 통해서 개발을 진행

한마디로 Spring Data JPA는 Hibernate를 Spring에서 한 번 감싼 형태

Spring Data JPA를 사용하는 이유
1. Hibernate가 수명을 다해서 교체가 필요할 때 다른 구현체로 쉽게 교체 가능
2. 관계형 DB외의 저장소로 교체가 필요할 때 저장소 교체 용이
- Spring Data MongoDB로의 의존성만 교체하면 가능

☞ 기본적으로 Spring Data 하위 프로젝트는 CRUD의 인터페이스를 동일하게 구성되어 있다(save(), findOne()..)
그래서 Spring Data JPA, Spring Data Redis 등과 같은 Spring Data 프로젝트를 통해서 교체가 쉽게 이뤄질 수 있음

 

Dependency 추가

  • spring-boot-starter-data-jpa : spring boot용 spring data JPA 라이브러리
  • h2 : 인메모리 관계형 DB로 보통 테스트 용도로 많이 사용
    • 실제 프로젝트에서는 runtimeOnly 'mysql:mysql-connector-java'를 통해서 mysql을 사용했다.
dependencies {
	...
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'com.h2database:h2'
    ...
}

 

Entity 생성

  • Domain
    • SW에 대한 요구사항 혹은 문제의 영역
    • 비즈니스 로직으로 주로 service 에서 사용
  • Entity PK Type을 Long으로 지정하는 이유
    • long 타입일 경우에는 값이 없을 경우 0으로 초기화 되는데, 만약 id가 0이라면 식별자가 0인지 값이 없어서 0 인지 알 수가 없음
    • 그래서 Wrapper Type인 Long을 사용할 경우 값이 없다면 null값이 들어가게 되어 식별자와 null값을 구별할 수 있다.
  • @Entity 클래스에서는 절대 Setter 메소드를 만들지 않음
    • 해당 클래스의 인스턴스 값이 언제 변해야하는지 명확하게 구별이 되지 않기 때문에 목적과 의도를 정확하게 가진 메소드를 생성
    • 보통 생성자를 통해서 최종값을 채운 후 DB에 삽입하는 형태로 사용(@Builder 등)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Posts {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="post_id")
    private Long Id;

    @Column(length=100, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

    @Builder
    public Posts(String title, String content, String author) {
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

 

Repository 생성

  • 보통 Dao라고 불리는 DB Layer 접근자로 인터페이스로 새성한다.
  • JpaRepository<Entity 클래스, PK 타입>을 상속받아 사용한다.
  • Entity 클래스와 항상 같은 위치에 위치해야한다.
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostsRepository extends JpaRepository<Posts, Long> {
    
}

 

 

 

반응형

'Project > Study' 카테고리의 다른 글

[Spring Boot] Mustache  (0) 2021.08.04
[Spring Boot] BaseTimeEntity  (0) 2021.08.03
[Spring Boot] Unit Test 코드  (0) 2021.08.03
[Spring Boot] Lombok  (0) 2021.08.03
[Spring Boot] TDD, Unit Test  (0) 2021.08.03

댓글