본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.
개발을 위한 세팅은 모두 끝났다. 이제 프로젝트의 뼈대를 생성해보자.
다음과 같이 우리의 프로젝트 하위에 domain
, service
, util
, web
폴더를 생성하자.
그리고 domain에는 Book.java
, 저장소 역할을 할 BookRepository.java
를 생성한다. domain 패키지는 보통 게시글, 댓글, 회원, 정산, 결제 등 소프트웨어에 대한 요구사항 혹은 문제에 대한 영역을 다룬다.
service와 web에는 각각 BookService.java
, BookApiController.java
를 생성한다. 그리고 web 폴더 하위에는 dto
폴더를 따로 하나 생성한다.
💡 DTO란?
DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로 로직을 가지지 않는 순수한 데이터 객체 (getter & setter 만 가진 클래스)입니다.
(출처 : https://melonicedlatte.com/2021/07/24/231500.html)
dto 폴더 하위에는 일단 BookRespDto.java
와 BookSaveReqDto.java
를 생성해둔다.
테스트를 위해 test 계층 구조 하위에도 main과 똑같은 이름에 Test만 붙여서 생성해주면 끝.
package site.metacoding.junitproject.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor // 1.
@Getter // 2.
@Entity // 3.
public class Book {
@GeneratedValue(strategy = GenerationType.IDENTITY) // 4.
@Id // 5.
private Long id;
@Column(length = 50, nullable = false) // 6.
private String title;
@Column(length = 20, nullable = false)
private String author;
@Builder // 7.
public Book(Long id, String title, String author) {
this.id = id;
this.title = title;
this.author = author;
}
@NoArgsConstructor
@Getter
@Entity
@GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.IDENTITY
옵션을 추가해야만 auto_increment가 된다.@Id
@Column(length = 50, nullable = false)
title
과 author
필드의 글자 수를 각각 50자, 20자로 그리고 null값을 허용하지 않도록 옵션을 지정했다.@Builder
❗
Entity
class에서는 절대Setter
메소드를 만들지 않는다.
흔히 자바빈 규약 때문에getter/setter
를 무작정 생성하는 경우가 있는데 이렇게 되면 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 구분할 수가 없기 때문에 추후 기능을 변경할 때 정말 복잡해진다.
따라서 해당 필드 값 변경이 필요하면 명확하게 그 목적과 의도를 나타낼 수 있는 메소드를 추가해주어야 하는데 생성자 대신 @Builder
를 사용하면 값을 채워줄 때 어떤 필드에 어떤 값을 채워야하는지 정확히 알 수 있게 된다.
(출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 저)이동욱 )
BookApiControllerTest
public class BookApiControllerTest {
public void test() {
Book book = Book.builder()
.title(title: "어린왕자")
.author(author: "생텍쥐페리")
.build();
생성자를 통해 값을 삽입한다면 순서도 지켜야하고, 파라미터도 모두 넣어야하지만 Builder 패턴은 순서도 상관없고 값 또한 내가 넣고 싶은 것만 넣을 수 있다.
우리가 생성한 Book Entity가 DB에 잘 생성이 되었는지 한번 확인해보자.
어플리케이션을 실행하고 localhost:8080/h2-console
로 접속.
URL을 입력하고 SELECT * FROM BOOK
쿼리를 날려보면...
위와 같이 Book Entity가 잘 생성된 것을 확인할 수 있다.