Over the limit

[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 3장 본문

Web

[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 3장

ellapk 2022. 4. 7. 12:48

JPA 사용에 대하여 (tistory.com)

 

JPA 사용에 대하여

관계형 데이터베이스를 이용하는 프로젝트에서 객체 지향 프로그래밍을 어떻게 연동할까? ->JPA라는 자바 표준 ORM(Object Relational Maping)을 사용하자! 즉, JPA를 사용하여려면 객체 지향 프로그래밍

xean.tistory.com

 

2. Spring Data JPA 사용하기

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'com.h2database:h2'
}

먼저 build.gradle에 의존성들을 등록한다.

 

다음으론 도메인 패키지를 만든다.

도메인이란 게시글, 댓글, 회원, 정산, 결제 등 소프트웨어에 대한 요구사항 혹은 문제 영역이라고 생각하면 된다.

 

package com.web.community.springboot.domain.posts;

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
@Entity

public class Posts {
    @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;
    }
}

JPA에서 제공하는 어노테이션들을 몇개 사용하여 Posts 클래스를 작성하였다.

테이블 설계 = Entity 설계라고 보면 된다.

 

@Entity

테이블과 링크될 클래스임을 나타냄

 

@Id

해당 테이블의 PK 필드를 나타냄

 

@GeneratedValue

PK의 생성 규칙을 나타냄

 

@Column

테이블의 칼럼. 굳이 선언 안해도 해당 클래스의 필드는 모두 칼럼

기본 값 외에 추가로 변경하고 싶은 옵션이 있을 때 사용하면 됨

 

@NoArgsConstructor

기본 생성자 자동 추가

public Posts(){}와 같은 효과

 

@Getter

클래스 내 모든 필드의 Getter메소드를 생성

 

@Builder

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

 

사용한 롬복의 어노테이션들이 코드 변경량을 최소화 시켜주기 때문에 장점이 많다.

한가지 특이한 점은 Setter 메소드가 없다는 것.

 

그렇다면 DB에 삽입할 때는?

@Builder 클래스를 사용하여 어느 필드에 어떤 값을 채워야 할지 명확하게 인지한다.

 

 

 

 

Posts 클래스로 DB를 접근해줄 레파지토리 작성

package com.web.community.springboot.domain.posts;

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

public interface PostsRepository extends JpaRepository<Posts, Long> {

}

ibatis 나 MyBatis에서 Dao라고 불리는 DB Layer 접근자이다.

JpaRepository<Entity클래스, PK>타입 을 상속하면 기본 적인 CRUD 메소드가 자동으로 생성된다.

 

이 과정은 선택이 아닌, 필수이다.

Entity 클래스는 기본 Repository 없이는 제대로 역할을 할 수가 없다.

 

 

이제 2장에서 하던 과정을 이어 테스트 코드를 작성해보자

package com.web.community.springboot.web.domain;

import com.web.community.springboot.domain.posts.PostsRepository;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup() {
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기() {
        String title = "샘플제목";
        String content = "테스트 본문";

        postsRepository.save(Posts.builder()
                .title(title)
                .content(content)
                .author("qriositylog@gmail.com")
                .build());

        List<Posts> postsList = postsRepository.findAll();

        Posts posts = postsList.get(0);
        assertThat(posts.getTitle()).isEqualTo(title);
        assertThat(posts.getContent()).isEqualTo(content);
    }
}