본문 바로가기
SpringBoot

(2-1) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기

by ZEC 2021. 2. 7.

안녕하세요:) 오늘은 SpringBoot & JPA로 간단한 API를 만들어 볼 거예요!

이전에 진행했던 글을 먼저 보셔야 이후 진도를 따라갈 수 있어요 아래 링크 남겨드립니다.

 

 

(1) - 스프링부트로 웹 서비스 출시하기

안녕하세요:) 오늘부터 제가 관심이 있던 스프링부트를 공부해보려고 하는데요 기술적인 게 아닌 무작정 따라 하기라는 조건을 걸고 해보려고 합니다. 제가 참고하는 블로그 링크 남겨드립니다

devzec.tistory.com

자사 서비스를 개발하는 곳에서는 SpringBoot & JPA를 많이 사용하고 있고,

장점으로는 집중해야 할 비즈니스 로직에만 집중할 수 있다고 합니다.

생산성도 좋고요. 그럼 시작해보죠!

 

도메인 코드 만들기!


앞전에 src/main/java/com/zecgwon/webservice 경로에

domain 패키지를 만들어주고요 domain 패키지 하위에 posts 패키지를 만들고

posts 패키지에 posts 클래스와 PostsRepository 인터페이스를 추가해줍니다.

천천히 따라와 주세요 :)

 

package com.zecgwon.webservice.domain.posts;

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

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

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity

// Posts 클래스는 실제 DB의 테이블과 매칭될 클래스이고, Entity 클래스라고 함.
// JPA를 사용하면 DB 데이터에 작업할 경우 실제 쿼리를 날리기 보다는, 이 Entity(Posts) 클래스 수정을 통해 작업합니다.
public class Posts {
    @Id
    @GeneratedValue
    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;
    }

}

 

Posts.java 코드입니다.

 

posts의 클래스는 실제 DB의 테이블과 매칭 될 클래스이고, Entity 클래스라고도 합니다.

JPA를 사용하면 DB 데이터에 작업을 할 때 실제 쿼리를 날리는 게 아닌 이 Entity(Posts)

클래스 수정을 통해 작업을 합니다.

 

JPA 어노테이션 정리

 

  • @Entity
    • 테이블과 링크될 클래스임을 나타냄.
    • 언더스코어 네이밍(_)으로 이름을 매칭함.
    • ex) SalesManager.java -> sales_manager table
  • @Id
    • 해당 테이블의 PK 필드를 나타냄.(PK 필드는 Primary Key 즉, 테이블에서 유일한 값입니다!)
  • @GeneratedValue
    • PK의 생성 규칙을 나타냄.
    • 기본값은 AUTO로, MySQL의 auto_increment와 같이 자동 증가하는 정수 값.
    • 스프링부트 2.0에서는 옵션을 추가해야 한다.
  •  @Column
    • 테이블의 컬럼을 나타냄 (선언하지 않더라도 해당 클래스의 모든 필드는 모두 컬럼.)
    • 사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있을 때 사용함.

 

package com.zecgwon.webservice.domain.posts;

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

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

PostsRepository.java

 

DB Layer 접근자입니다.

JPA에서 Repository라고 부르며 인터페이스로 생성합니다.

테스트 코드 작성하기


 

src/test/java/com/zecgwon/webservice

아까 src/main 경로와 동일한 위치에 PostsRepositoryTest 클래스를 만들어주시면 됩니다.

 

package com.zecgwon.webservice.domain.posts;

import org.junit.After;
import org.junit.jupiter.api.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 static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup() {
        /**
         이후 테스트 코드에 영향을 끼치지 않기 위해
         테스트 메소드가 끝날때 마다 respository 전체 비우는 코드
         **/
        postsRepository.deleteAll();
    }

    @Test
    public void 게시글저장_불러오기() {
        //given
        postsRepository.save(Posts.builder()
                .title("테스트 게시글")
                .content("테스트 본문")
                .author("zecgwon@gmail.com")
                .build());

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

        //then
        Posts posts = postsList.get(0);
        assertThat(posts.getTitle(), is("테스트 게시글"));
        assertThat(posts.getContent(), is("테스트 본문"));
    }
}

PostsRepositoryTest.java 코드입니다.

 

  • given
    • 테스트 기반 환경을 구축하는 단계
  • when
    • 테스트하고자 하는 행위 선언
    • Posts가 DB에 insert 되는 것을 확인하기 위함
  • then
    • 테스트 결과 검증
    • 실제로 DB에 insert 되었는지 확인하기 위해 조회 후, 입력된 값 확인

 

 

테스트를 해볼까요? 게시글 저장_불러오기

 

해당 테스트가 통과했음을 확인할 수 있습니다.

 

테스트 코드가 진짜 DB에 들어갔는지 확인해보는 방법은 다음

게시글로 만나보도록 하겠습니다.

 

깃허브에 커밋 잘 해두세요:)

댓글