본문 바로가기

백엔드/개발과 설계 원칙

디자인 패턴 - 빌더 패턴

반응형

정의


- 복잡한 인스턴스를 조립하여 만드는 구조로, 복합 객체를 생성할 때 객체를 생성하는 방법(과정)과 객체를 구현(표현)하는 방법을 분리함으로써 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있는 디자인 패턴
- 쉽게 얘기하면, 매번 생성자의 파라미터를 3개 4개 여러개 넣어서 만드는 것은, 객체 클래스와 생성하는 부분 모두 코드가 낭비가 있기에,

이를 줄일 수 있는 방법이라고 생각하면 된다.

 

 

구현


첫번째 방법


- 객체에 @Builder 붙이기

 

 

 

- 호출하는 곳에서 다음과 같이 생성

 

// 빌더 패턴 적용, 회원 정보 저장
        User user = User.builder()
                .username(userRegisterDto.getUsername())
                // 패스워드 암호화
                .password(passwordEncoder.encode(password))
                .nickName(userRegisterDto.getNickName())
                    .build();
        // DB에 저장
        userRepository.save(user);

 

 

두번째 방법


- 직접구현

package com.sparta.juteukki02.juteukki_week02.util;
import lombok.*;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Collection;


@Setter
@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@AllArgsConstructor
public class Helper {
    private String returnJSON;
// 원하는 JSON 형태로 만들기 위해 빌더 클래스 생성
    public static class JSONBuilder{
        JSONObject obj = new JSONObject();
        // 스트링 등 일반적인 형태를 JSON 형태에 담아주기
        public JSONBuilder addKeyValue(String key, Object value){
            this.obj.put(key, value);
            return this;
        }
        // 리스트 형태를 담아주기
        public JSONBuilder addKeyValueList(String key, Collection value){
            this.obj.put(key, new JSONArray(value));
            return this;
        }
        public Helper build(){
            return new Helper(obj);
        }
    }
    private Helper(JSONObject obj){
        returnJSON = obj.toString();
    }
    // 예상 JSON 형태
//    {
//        "title1":"contents1",
//         "title2":"contents2",
//    }

}

보통 타겟으로 하는 객체 클래스에 빌더 클래스를 따로 만들고, 

빌더 객체에 값을 더해주는 함수들과,

이 빌더 객체(obj)를 파라미터로 타겟 객체(Helper)를 생성해주는 build함수,

빌더 객체(obj)를 파라미터로 하는 타겟 객체(Helper) 생성자가 구성요소이다.

 

 

 

 

Helper.JSONBuilder builder = new Helper.JSONBuilder();
        builder.addKeyValue("result", "success");
        builder.addKeyValue("msg", "회원가입에 성공하였습니다.");
        return builder.build().getReturnJSON();

다음과 같이 사용해 볼 수도 있다.

반응형

'백엔드 > 개발과 설계 원칙' 카테고리의 다른 글

MSA  (1) 2022.09.01
객체지향 설계 5원칙  (0) 2022.06.12
객체지향이란  (0) 2022.06.12
Impl 분류하는 이유  (0) 2022.04.10
Spring 예외처리  (0) 2022.03.03