요르딩딩
객체 생성하기 (기본/builder Class/lombok) 본문
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