요르딩딩

객체 생성하기 (기본/builder Class/lombok) 본문

카테고리 없음

객체 생성하기 (기본/builder Class/lombok)

요르딩딩 2022. 8. 16. 15:29
728x90
반응형

builder Pattern은 디자인 패턴 중 하나로써 의도는 생성과 표현의 분리가 목적입니다.

아래 객체를 생성하는 3가지 방법을 알아보도록 하겠습니다.

   1. 기본적인 객체 생성

   2. builder pattern 적용 객체 생성

   3. lombok 적용 객체 생성

 

[기본적인 객체 생성]

package com.dto.UserInfo;

/*
 * 기본적인 객체
 */
public class UserInfo {
	private String firstName;
	private String secondName;
	private int age;

	public UserInfo(String firstName, String secondName, int age) { // 셍성자
		this.firstName = firstName;
		this.secondName = secondName;
		this.age = age;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getSecondName() {
		return secondName;
	}

	public void setSecondName(String secondName) {
		this.secondName = secondName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getUserInfo() {
		return String.format("firstName: %s, secondName: %s, age: %d", firstName, secondName, age);
	}

}
// 1. 기본적인 객체 생성		
UserInfo userInfo = new UserInfo("기본", "객체생성", 1);
System.out.println(userInfo.getUserInfo());

여기서 필요없는 값에는 null넣거나, 필요한 값들만 적용하는 새로운 생성자를 만들 수 도 있지만, 

그렇게하게되면 매번 생성자를 만드는 것도 일이 됩니다.

그래서 좀 더 직관적인 객체를 만들 수 있게 돕는 것이 builder Pattern 입니다.

 

[builder pattern 적용 객체 생성]

package com.dto.UserInfo;

/*
 * 빌더를 이용한 객체
 *
 *[장점]
 *  1) 불필요한 생성자 제거
 *  2) 데이터의 순서에 상관없이 객체생성가능
 *  3) 명시적 선언으로 이해하기 쉬움
 *  
 * [단점]
 * 	1) 대상클래스와 그것을 연결할 빌더클래스 2개를 생성해야한다.
 */

public class UserInfoBuilder {
	private String firstName;
	private String secondName;
	private int age;
	
	public UserInfoBuilder setFirstName(String firstName) {
		this.firstName = firstName;
		return this;
	}
	
	public UserInfoBuilder setSecondName(String secondName) {
		this.secondName = secondName;
		return this;
	}
	
	public UserInfoBuilder setAge(int age) {
		this.age = age;
		return this;
	}
	
	public UserInfo build() {
		return new UserInfo(firstName, secondName, age);
	}
}
// 2. 빌더클래스를 이용한 객체 생성
UserInfoBuilder userInfoBuilder = new UserInfoBuilder();
UserInfo userInfo2 = userInfoBuilder
        .setFirstName("빌더클래스 적용")
        .setSecondName("객체생성")
        .setAge(26)
        .build();
System.out.println(userInfo2.getUserInfo());

위 코드의 주석에 builder pattern의 장단점을 적어놓았습니다.

 

위의 2개의 방법보다 코드의 수를 줄여줄 수 있는 플러그인인 lombok을 활용할 수 도 있습니다.

[lombok 적용 객체생성]

package com.dto.UserInfo;

import lombok.Builder;
import lombok.Data;

/*
 * 룸북을 활용한 객체
 * 
 * [장점]
 * 1) 대상클래스, 빌더클래스 없이 한번으로 동일한 기능 사용가능 
 */

@Data
@Builder
public class UserInfoLombok {
	private String firstName;
	private String secondName;
	@Builder.Default
	private int age = 30; // 디폴트 적용가능

	public String getUserInfo() {
		return String.format("firstName: %s, secondName: %s, age: %d", firstName, secondName, age);
	}

}
// 3. 룸북을 이용한 객체 생성
UserInfoLombok userInfoLombok = UserInfoLombok.builder()
        .firstName("Lombok 적용")
        .secondName("객체생성")
        .build();
System.out.println(userInfoLombok.getUserInfo());

 

 

[3가지 방법 모두를 사용한 객체생성 예시]

package com.controller;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dto.UserInfo.UserInfo;
import com.dto.UserInfo.UserInfoBuilder;
import com.dto.UserInfo.UserInfoLombok;

@RestController
public class UserInfoContoller {

	@GetMapping(value = "/userinfo/test")
	public ResponseEntity<?> test(HttpServletRequest request) {
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		
		// 1. 기본적인 객체 생성		
		UserInfo userInfo = new UserInfo("기본", "객체생성", 1);
		System.out.println(userInfo.getUserInfo());
		
		// 2. 빌더클래스를 이용한 객체 생성
		UserInfoBuilder userInfoBuilder = new UserInfoBuilder();
		UserInfo userInfo2 = userInfoBuilder
		        .setFirstName("빌더클래스 적용")
		        .setSecondName("객체생성")
		        .setAge(26)
		        .build();
		System.out.println(userInfo2.getUserInfo());
		
		// 3. 룸북을 이용한 객체 생성
		UserInfoLombok userInfoLombok = UserInfoLombok.builder()
		        .firstName("Lombok 적용")
		        .secondName("객체생성")
		        .build();
		System.out.println(userInfoLombok.getUserInfo());
		
		return ResponseEntity.ok(resultMap);
	}
}

 

728x90
반응형
Comments