프로젝트 뼈대 구축

jihan kong·2022년 8월 19일
0

JUnit5

목록 보기
4/25
post-thumbnail

본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.

개발을 위한 세팅은 모두 끝났다. 이제 프로젝트의 뼈대를 생성해보자.

Domain, Service, Web

다음과 같이 우리의 프로젝트 하위에 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.javaBookSaveReqDto.java 를 생성해둔다.


테스트 코드 작성

테스트를 위해 test 계층 구조 하위에도 main과 똑같은 이름에 Test만 붙여서 생성해주면 끝.


Book Entity 개발

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;
    }
  1. @NoArgsConstructor
    : lombok의 어노테이션. 기본 생성자(파라미터가 없는 생성자)를 자동으로 추가해준다.

  2. @Getter
    : lombok의 어노테이션. 클래스 내 모든 필드의 Getter 메소드를 자동으로 생성해준다.

  3. @Entity
    : JPA의 어노테이션. 테이블과 링크될 클래스임을 나타낸다. 또한, DB 데이터에 실제 쿼리를 날리지 않고 이 Entity 클래스의 수정을 통해 작업하게 된다.

  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
    : PK의 생성 규칙을 나타낸다. 스프링 부트 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment가 된다.

  5. @Id
    : 해당 테이블의 PK 필드를 나타낸다.

  6. @Column(length = 50, nullable = false)
    : 원래 클래스의 모든 필드의 디폴트 값은 column이지만 굳이 선언한 이유는 기본값 이외에 추가적으로 옵션을 주기 위한 것이다. 위 경우는 titleauthor 필드의 글자 수를 각각 50자, 20자로 그리고 null값을 허용하지 않도록 옵션을 지정했다.

  7. @Builder
    : lombok의 어노테이션. 해당 클래스의 빌더 패턴 클래스를 생성한다.

여기서 잠깐 짚고 넘어가야할 것이 있다.

@Builder 클래스란?

Entity class에서는 절대 Setter 메소드를 만들지 않는다.
흔히 자바빈 규약 때문에 getter/setter 를 무작정 생성하는 경우가 있는데 이렇게 되면 클래스의 인스턴스 값들이 언제 어디서 변해야 하는지 코드상으로 구분할 수가 없기 때문에 추후 기능을 변경할 때 정말 복잡해진다.

따라서 해당 필드 값 변경이 필요하면 명확하게 그 목적과 의도를 나타낼 수 있는 메소드를 추가해주어야 하는데 생성자 대신 @Builder 를 사용하면 값을 채워줄 때 어떤 필드에 어떤 값을 채워야하는지 정확히 알 수 있게 된다.
(출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 저)이동욱 )


Builder 패턴 예시

BookApiControllerTest

public class BookApiControllerTest {
	public void test() {
    	Book book = Book.builder()
        .title(title: "어린왕자")
        .author(author: "생텍쥐페리")
        .build();

생성자를 통해 값을 삽입한다면 순서도 지켜야하고, 파라미터도 모두 넣어야하지만 Builder 패턴은 순서도 상관없고 값 또한 내가 넣고 싶은 것만 넣을 수 있다.


h2 DB로 검증

우리가 생성한 Book Entity가 DB에 잘 생성이 되었는지 한번 확인해보자.

어플리케이션을 실행하고 localhost:8080/h2-console 로 접속.
URL을 입력하고 SELECT * FROM BOOK 쿼리를 날려보면...

위와 같이 Book Entity가 잘 생성된 것을 확인할 수 있다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글