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 레퍼런스를 참조해보자.