본문 바로가기

spring

Spring Data JPA 이용하기

1. 데이터베이스 연동하기 (JPA)

환경 설정

 

  • build.gradle 파일에 Spring Data JPA 라이브러리 추가
    • implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    • runtimeOnly 'mysql:mysql-connector-java'
  • resources/application.properties 파일에 데이터베이스 접속 정보와 JPA 설정 추가
    • spring.datasource.url=jdbc:mysql://localhost:3306/board
    • spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    • spring.datasource.username=username
    • spring.datasource.password=password

    • spring.jpa.hibernate.ddl-auto=create
    • spring.jpa.show-sql=true

 

ddl-auto 옵션
  • create : 테이블 삭제 후 다시 생성 (DROP + CREATE)
  • create-drop : create와 같지만 종료 시점에 테이블 DROP
  • update : 변경된 부분 반영
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용하지 않음
  • 주의 사항 !
    • 운영 서버에서는 절대 create, create-drop, update를 사용하면 안됨
    • 기존 테이블을 변경, 삭제하는 역할을 수행하기 때문

 

show-sql 옵션
  • JPA에서 만들어진 쿼리를 출력하여 확인하기 위한 옵션

  • 예쁘게 하려면 설정 추가 ~~
    • spring.jpa.properties.hibernate.format_sql=true

 

 

2. Entity 설계하기

Entity 생성

 

엔티티 관련 어노테이션
  • @Entity
    • 해당 클래스가 엔티티임을 명시하기 위한 어노테이션
    • 클래스 자체가 테이블과 1:1로 매칭
  • @Table
    • 클래스의 이름과 테이블의 이름이 다른 경우 사용되는 어노테이션
    • 자바에서의 명명법과 데이터베이스에서의 명명법이 다르기 때문에 자주 사용!
  • @Id
    • 테이블의 기본값 지정 어노테이션
  • @GeneratedValue
    • 해당 필드의 값이 어떤 방식으로 자동 생성될지 결정 :
      1. 직접 할당 (GeneratedValue 사용 x)
      2. AUTO : 기본값을 데이터베이스에 맞게 자동 생성
      3. IDENTITY : 기본값 생성을 데이터베이스에 위임
      4. SEQUENCE : 식별자 생성기를 직접 설정하고 이를 통해 값을 주입
      5. TABLE : 키 생성 테이블을 사용
    • 보통 @Id 어노테이션과 함께 사용
  • @Column
    • 객체 필드를 테이블 컬럼에 매핑
    • 많이 사용되는 요소 :
      1. name : 데이터베이스의 컬럼명 설정, 명시하지 않으면 필드명으로 지정
      2. nullable : null 값의 허용 여부
      3. length : 데이터베이스에 저장하는 데이터의 최대 길이
      4. unique : 해당 컬럼의 중복 값 허용 여부
      5. columnDefinition : 데이터베이스 컬럼 정보를 직접 설정
        • 예) @Column(columnDefinition = "char(3)")
  • @Enumerated
    • enum 타입을 매핑할 때 사용
      • EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 (default)
      • EnumType.STRING : enum 이름을 데이터베이스에 저장

예)

public enum PostStatus {
    RECRUITING("모집 중"),
    COMPLETE("모집 완료");
    private String description;
    PostStatus(String description){
        this.description = description;
    }
    public String getDescription(){
        return description;
    }
    public static PostStatus fromDescription(String description){
        for(PostStatus postStatus:PostStatus.values()){
            if(description.equals(postStatus.getDescription())){
                return postStatus;
            }
        }
        throw new IllegalArgumentException("Invalid post status: " + description);
    }
}

 

  • ORDINAL ≫ 0 / 1로 저장
  • STRING ≫ RECRUITING / COMPLETE로 저장

 

 

3. Repository 설계하기

Repository 생성
  • Spring Data JPA는 JpaRepository를 기반으로 쉽게 데이터베이스 사용 가능
  • 리포지토리(Repository)는 Spring Data JPA에서 제공하는 인터페이스
  • 리포지토리는 엔티티에 대한 인터페이스 생성 후 JpaRepository를 상속하여 생성
  • 대상 엔티티와 기본값 타입 지정 필수 !!

  • 대상 엔티티 (Post) / 기본값 타입 (Long)

 

JpaRepository
  • JpaRepository를 상속받으면 기본적으로 별도의 메소드 구현 없이 많은 기능 제공
  • CrudRepository, PagingAndSortingRepository, QueryByExampleExecutor 등을 상속

  • 대표적으로 CRUD 관련 메소드 호출 가능
    • <S extends T> S save(S entity);
    • Optional<T> findById(ID id);
    • Iterable<T> findAll();
    • void deleteById(ID id);
    • ...

 

Repository 메소드 생성 규칙
  • 메소드 이름으로 JPA에서 쿼리를 자동으로 생성!

  • 조회 메소드(find)에 조건으로 붙일 수 있는 대표적인 기능
    • findBy : SQL문의 where절 역할
    • AND, OR : 조건을 여러 개 설정하기 위한 역할
    • Like / Not Like : SQL 문의 like와 동일
    • IsNull / IsNotNull : Null이거나 Null이 아닌 값을 확인
    • LessThan / GreaterThan : 특정 값을 기준으로 대소 비교 시 사용
    • Between : 두 값 사이에 데이터를 조회
    • OrderBy : SQL문에서 order by와 동일
    • countBy : SQL문에서 count와 동일

 

 

 

 

'spring' 카테고리의 다른 글

@Query 어노테이션  (0) 2024.09.13
페이징 / 정렬 처리  (0) 2024.09.13
영속성 컨텍스트  (0) 2024.09.13
JPA / Hibernate / Spring Data JPA  (0) 2024.09.13
ORM  (0) 2024.09.13