안녕하세요:) 오늘은 SpringBoot & JPA로 간단한 API를 만들어 볼 거예요!
이전에 진행했던 글을 먼저 보셔야 이후 진도를 따라갈 수 있어요 아래 링크 남겨드립니다.
자사 서비스를 개발하는 곳에서는 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에 들어갔는지 확인해보는 방법은 다음
게시글로 만나보도록 하겠습니다.
깃허브에 커밋 잘 해두세요:)
'SpringBoot' 카테고리의 다른 글
(3-1) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & Handlebars로 화면 만들기 (1) | 2021.02.14 |
---|---|
(2-3) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기 (0) | 2021.02.09 |
(2-2) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기 (0) | 2021.02.09 |
SpringBoot H2 DB 연결 에러 (0) | 2021.02.09 |
(1) - 스프링부트로 웹 서비스 출시하기 (0) | 2021.02.06 |
댓글