
본 시리즈는 메타 코딩님의 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❗
Entityclass에서는 절대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가 잘 생성된 것을 확인할 수 있다.