GrowMe

SpringBoot에서 JPA 사용하기 본문

About Spring

SpringBoot에서 JPA 사용하기

오늘도 타는중 2022. 6. 30. 01:29
JPA Repository
# JPA Repository
# build.gradle
# JPA 사용법
# JPA Repository 메소드

*JPA?

  • Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현하게된다.
  • SQL아닌 객체 중심으로 개발할 수 있다는 매우 큰 장점을 가지고 있다.

*JPA 사용법

1. build.gradle에 JPA dependency 추가하기

dependencies {
    // JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
  • 스프링부트용 Spring Data Jpa 추상화 라이브러리
  • 스프링 부트 버전에 맞춰 자동으로 JPA 관련 라이브러리들의 버전을 관리해준다.

2. JPA Entity 생성하기

@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {

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

    @Column(length = 500, 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;
    }

    public void update(String title, String content) {
        this.title = title;
        this.content = content;
    }
}
  • Posts 클래스 : 실제 DB와 매칭될 클래스 (== Entity 클래스). 이 Entity 클래스의 수정을 통해, DB 작업이 진행된다.
  • @Entity : 테이블과 링크될 클래스임을 나타냄.
    클래스 이름 기반으로 테이블 이름 지정(SalesManager.java -> salesmanager table)
  • Id : 해당 테이블의 PK(Primary Key) 필드를 나타냄
  • GeneragedValue : PK의 생성 규칙을 나타냄.
  • Column : 테이블의 칼럼을 나타냄. 해당 클래스의 필드는 모두 칼럼이 된다.
    기본값 외 변경할 옵션 있을 경우 주로 사용한다.

- Entity에 정의한 내용으로 테이블이 생성된다.

  • CREATED_DATE와 MODIFIED_DATE 테이블은 상속받은 BaseTimeEntity에 의해 자동으로 생성된 것이다.
  • BaseTimeEntity에 대해서는 추후 포스팅하여 링크를 남길 예정...

 

3. JPA Repository 만들기

package com.jojoIdu.book.springboot.domain.posts;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

// Posts를 DB에 접근시킬 Repository
public interface PostsRepository extends JpaRepository<Posts, Long> {

    @Query("SELECT p FROM Posts p ORDER By p.id DESC")
    List<Posts> findAllDesc();

}
  • 인터페이스를 생성 후, JpaRepository<Entity 클래스, PK 타입>를 상속하면 기본적인 CRUD 메소드가 자동 생성된다.
  • @Repository를 생략 가능하다. 단, Entity 클래스와 Entity Repository는 함께 위치해야 둘다 제 역할을 할 수 있다.

JPA Repository  메소드 정리

- 기본 제공 메소드

메 소 드 기  능
 save() 레코드 저장 (insert, update)
findOne() primary key로 레코드 한건 찾기
findAll() 전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능
count() 레코드 갯수
delete() 레코드 삭제

- 메소드 추가하기

public interface MemberRepository extends JpaRepository<Member, Long> {

    Member findByName(String name);

    Page<Member> findByName(String name, Pageable pageable);
}
  • 위와 같이 Query 메소드를 추가하여 스프링에게 알릴 수 있다.
  • 그러기위해서는 규칙에 맞는 메서드를 작성해야 하는데, 그 규칙은 다음과 같다.
메소드명 설 명
findBy로 시작 쿼리를 요청하는 메서드 임을 알림
countBy로 시작 쿼리 결과 레코드 수를 요청하는 메서드 임을 알림
  • 위의 findBy에 이어 해당 Entity 필드 이름을 입력하면 검색 쿼리를 실행한 결과를 전달한다.
  • SQL의 where절을 메서드 이름을 통해 전달한다고 생각하면 된다.
  • 메서드의 반환형이 Entity 객체이면 하나의 결과만을, 반환형이 List라면 쿼리에 해당하는 모든 객체를 전달한다. 

- Query 메소드에 포함할 수 있는 키워드

메서드명 키워드  예시  설명
 And  findByEmailAndUserId(String email, String userId)  여러필드를 and 로 검색
 Or  findByEmailOrUserId(String email, String userId)  여러필드를 or 로 검색
 Between  findByCreatedAtBetween(Date fromDate, Date toDate)  필드의 두 값 사이에 있는 항목 검색
 LessThan  findByAgeGraterThanEqual(int age)  작은 항목 검색
 GreaterThanEqual  findByAgeGraterThanEqual(int age)  크거나 같은 항목 검색
 Like  findByNameLike(String name)  like 검색
 IsNull  findByJobIsNull()  null 인 항목 검색
 In  findByJob(String … jobs)  여러 값중에 하나인 항목 검색
 OrderBy  findByEmailOrderByNameAsc(String email)  검색 결과를 정렬하여 전달

좀 더 자세한 키워드와 쿼리를 보고 싶다면 아래 JPA 레퍼런스를 참조해보자.

https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#jpa.sample-app.finders.strategies

 

Comments