[SpringBoot + JPA] Lombok @Builder 빌더패턴 적용기

반응형
728x90
반응형

들어가기 전

Lombok을 사용하여 구현하기 전, 라이브러리를 사용하지 않고도 구현할 줄 알아야한다. 아래 포스팅을 참고하자.

devfunny.tistory.com/409

 

[SpringBoot + JPA] DTO, Entity의 빌더패턴 적용기

도입 스프링부트 프로젝트에서 JPA를 사용하여 API를 만드는 상황에 놓였다. 나는 API의 파라미터로 받아올 Dto 파일을 생성하였고, JPA Repository로 보낼 Entity 파일을 생성하였다. com.api.seohae  - dto  U

devfunny.tistory.com

 

 

도입

스프링부트 프로젝트에서 JPA를 사용하여 API를 만드는 상황에 놓였다. 나는 API의 파라미터로 받아올 DTO 파일을 생성하였고, JPA Repository로 보낼 Entity 파일을 생성하였다. 

com.api.seohae
   - dto
     StudyDTO.java
      - entity
         Study.java

위 구조로 갔을 때 만나게 될 상황을 자세히 살펴보자.

 

 

빌더패턴의 적용 전, 읽고가기

빌더패턴을 사용함으로써 느낄 수 있는 이점은 아래 포스팅을 참고바란다. 

devfunny.tistory.com/337

 

빌더 패턴의 권장 이유

생성자의 단점 생성자에는 제약이 하나 있는데, 선택적 매개변수가 많을 경우에 대응이 어렵다. 예를들어, 받아오는 매개변수에 따라 계속해서 생성되는 생성자의 코드를 보았을때 매개변수의

devfunny.tistory.com

 

 

빌더패턴 적용기 (with Lombok @Builder)

(1) StudyDto.java

import io.swagger.annotations.ApiParam;
import lombok.Data;

@Data
public class StudyDto {
    private Long idx;
    private String studyName;
    private Long regUserIdx;
    private Integer maxCnt;
    private String startDate;
    private String endDate;
}

 

Lombok 사용하기

(2) Study.java

import com.api.match.dto.StudyDto;
import io.swagger.annotations.ApiParam;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Data
@Table(name="STUDY")
@SequenceGenerator(
        name="STUDY_SEQ_GN", 
        sequenceName="STUDY_SEQ", 
        initialValue=1, 
        allocationSize=1
)
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(builderMethodName = "StudyBuilder")
public class Study {
    @Id
    @GeneratedValue(
            strategy= GenerationType.SEQUENCE,
            generator="STUDY_SEQ_GN"
    )
    private Long idx;

    private String studyName;
    private Long regUserIdx;
    private Integer maxCnt;
    private String startDate;
    private String endDate;

    public static StudyBuilder builder(StudyDto studyDto) {
        return StudyBuilder()
                    .idx(studyDto.getIdx())
                    .studyName(studyDto.getStudyName())
                    .regUserIdx(studyDto.getRegUserIdx())
                    .maxCnt(studyDto.getMaxCnt())
                    .startDate(studyDto.getStartDate())
                    .endDate(studyDto.getEndDate());
    }
}

 

Lombok의 @Builder 어노테이션으로 빌더패턴을 구현한다.

 

@Builder(builderMethodName = "StudyBuilder")

builder 메소드명을 지정할 수 있다.

 

@NoArgsConstructor(access = AccessLevel.PROTECTED)

 

매개변수가 없는 기본 생성자를 무조건 선언해줘야하기 때문에 이 또한 Lombok의 어노테이션을 사용하자. 접근 권한은 PROTECTED로 지정하여 어느 곳에서나 객체를 생성할 수 있는 상황을 막는다.

 

@AllArgsConstructor

모든 매개변수를 갖고있는 생성자도 Lombok의 어노테이션을 사용한다.

 

public static StudyBuilder builder(StudyDto studyDto) {
        return StudyBuilder()
                    .idx(studyDto.getIdx())
                    .studyName(studyDto.getStudyName())
                    .regUserIdx(studyDto.getRegUserIdx())
                    .maxCnt(studyDto.getMaxCnt())
                    .startDate(studyDto.getStartDate())
                    .endDate(studyDto.getEndDate());
    }

 

매개변수로 받아온 StudyDto 안의 데이터를 매핑해준다.

 

 

builder 메서드 호출

Service.java 파일에서 builder 메서드 호출 코드

public Study addStudy(StudyDto studyDto) {
  /* dto -> entity builder */
  Study study = Study.builder(studyDto).build();

  /* save (insert) */
  study = studyRepository.save(study);

  return study;
}

 

 

반응형

Designed by JB FACTORY