본문 바로가기

Java/Spring

[Spring] 게시판 만들기 : Spring Data JPA 적용

반응형

1. Spring Data JPA의 의존성 설정

 

- build.gradle

...
dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-data-jpa') //(1)
    compile('com.h2database:h2') //(2)
    compile('org.projectlombok:lombok')
    annotationProcessor('org.projectlombok:lombok')

    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.projectlombok:lombok')
    testAnnotationProcessor('org.projectlombok:lombok')
}
...

 

⌗ 추가 코드

  • compile('org.springframework.boot:spring-boot-starter-data-jpa')
  • compile('com.h2database:h2')

 

(1) spring-boot-starter-data-jpa

  - 스프링 부트용 Spring Data Jpa 추상화 라이브러리 입니다.

  - 스프링 부트 버전에 맞춰 자동으로 JPA 관련 라이브러리들의 버전을 관리해줍니다.

 

(2) h2

  - 인메모리 관계형 데이터베이스입니다.

  - 메모리에서 실행되기 때문에 애플리케이션을 재시작할때마다 초기화된다는 점을 이용해서 테스트 용도로 많이 사용합니다.

  - JPA의 테스트, 로컬 환경에서의 구동에서 사용할 예정입니다.

 


2. 도메인 설정

 

domain 패키지를 생성해줍니다.

 

domain 패키지는 앞으로 도메인을 담을 패키지로, 소프트웨어에 대한 요구사항 혹은 문제 영역이라고 생각하면 됩니다.

 

기존에 MyBatis와 같은 쿼리 매퍼를 사용했다면 dao 패키지를 떠올리겠고,

그간 xml에 쿼리를 담고, 클래스는 오로지 쿼리의 결과만 담던 일들이 모두 도메인 클래스라고 불리는 곳에서 해결됩니다.

 

 

- main/java/.../domain/posts/Posts.java

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Getter
@NoArgsConstructor //(1)
@Entity //(2)
public class Posts {
    @Id //(3)
    @GeneratedValue(strategy = GenerationType.IDENTITY) //(4)
    private Long id;
    
    @Column(length = 500, nullable = false) //(5)
    private String title;
    
    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;
    
    @Builder //(6)
    public Posts(Long id, String title, String content, String author) {
        this.id = id;
        this.title = title;
        this.content = content;
        this.author = author;
    }
}

 

가능하다면...

주요 어노테이션(@Entity)은 클래스에 가깝게 위치하고,

그 외의 어노테이션(롬복 관련된 @Getter, @NoArgsConstructor)을 주요 어노테이션 위에 위치하게 두는 게 좋습니다.

 

이유는 새 언어(코틀린 등)으로 전환시 더 이상 필요없을 경우에는 쉽게 삭제하기 위함입니다.

 

(1) @NoArgsConstructor

  - 기본 생성자 자동 추가

  - public Posts() {} 와 같은 효과

 

(2) @Entity

  - 테이블과 링크될 클래스

  - 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭합니다.

  (ex) simpeCompany.java → simple_company

 

(3) @Id

  - 해당 테이블의 PK 필드

 

(4) @GeneratedValue

  - PK의 생성 규칙을 나타냅니다.

  - GenerationType.IDENTITY 은 auto increment와 동일합니다. 

 

☀︎ GenerationType.IDENTITY 에 대하여...

Hibernate 5부터 MySQL에서의 GenerationType.AUTO는 IDENTITY가 아닌
TABLE을 기본 시퀀스 전략으로 가져가기 때문에 스프링 2.0 에서는 GenerationType.IDENTITY 옵션을 추가해야하는데요.

이는 스프링 부트 2.0 버전과 1.5버전의 차이가 있다고 합니다.
즉, 1.5에선 Hibernate 5를 쓰더라도 AUTO를 따라가지 않기 때문에 IDENTITY가 선택됩니다.
2.0에선 Hibernate 5를 그대로 따라가기 때문에 TABLE이 선택됩니다.

따라서, Hibernate의 id 생성 전략을 그대로 따라갈지 말지를 결정하는 Javadoc에서 제공하는 useNewIdGeneratorMappings 파일을 확인해보면 알 수 있습니다.

 

(5) @Column

  - 이 어노테이션을 굳이 설정하지 않아도 해당 클래스의 필드는 모두 테이블의 컬럼이 됩니다.

  - 그래도 사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용합니다.

  - 문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶은 경우 등에서 사용됩니다.

 

(6) @Builder

  - 해당 클래스의 빌더 패턴 클래스를 생성

  - 생성자 상단에 선언시, 생성자에 포함된 필드만 빌더에 포함

 


★ Entity 클레스에서는 절대 Setter 메소드를 만들지 않습니다. ★ 

 

단, 해당 필드의 값 변경이 필요하면 명확히 그 목적과 의도를 나타낼 수 있는 메소드를 추가해야만 합니다.

이유는 Setter 메소드가 들어가게 되면 언제 어디서 변해야하는 지 코드상으로 명확하게 구분할 수가 없어, 기능 변경시 복잡해지기 때문입니다.

 

그러면, 어떻게 값을 채워 DB에 삽입하는 걸까 ??

 

기본적인 구조는 생성자를 통해 최종값을 채운 후 DB에 삽입하는 것이며,

값 변경이 필요한 경우에는 해당 이벤트에 맞는 public 메소드를 호출하여 변경하는 것을 전제로 합니다.



3. JpaRepository 생성

 

- main/java/.../domain/posts/PostsRepository.java

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

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

 

이 부분은 Dao라 불리는 DB Layer 접근자 입니다.

 

인터페이스를 생성한 후, JpaRepository<Entity 클래스, PK 타입> 을 상속하면 기본적인 CRUD 메소드가 자동으로 생성됩니다.

 

★Entity 클래스와 관련된 Repository는 함께 위치해야하며,

Entity 클래스는 기본 Reposritory 없이는 제대로 역할을 할 수 없습니다.

 


다음 내용으로는 위 내용을 가지고 테스트 코드를 작성해보겠습니다.

 

✭ [참고] https://chati.tistory.com/69

 

[Spring] 게시판 만들기 : 적용한 Spring Data JPA 테스트 코드 작성

아래의 테스트 코드는 이전글의 Spring Data Jpa를 적용한 후 그에 관련된 테스트 코드를 작성했음을 참고부탁드립니다. ✭ [참고] https://chati.tistory.com/68 [Spring] 게시판 만들기 : Spring Data Jpa 적용..

chati.tistory.com


 

반응형

❥ CHATI Github