본문 바로가기
Java 강의

자바 빌더 패턴 Spring @Builder

by 자유코딩 2019. 1. 10.

아래 코드를 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
@Data
@Builder
public class Event {
    private Integer id;
    private String name;
    private String description;
    private LocalDateTime beginEnrollmentDateTime;
    private LocalDateTime closeEnrollmentDateTime;
    private LocalDateTime beginEventDateTime;
    private LocalDateTime endEventDateTime;
    private String location; // location 값이 없다면 온라인 모임
    private int basePrice; // optional
    private int maxPrice; // optional
    private int limitOfEnrollment;
    private boolean offline;
    private boolean free;
    private EventStatus eventStatus;
 
}
 
cs

 

@Builder 라는 애너테이션이 있다.

 

자바의 빌더 패턴을 스프링에서 사용하기 쉽게 만들어준다.

 

위의 코드에 작성된 Event 클래스의 객체를 생성하려면 아래처럼 코드를 작성하면 된다.

 

 

1
2
3
4
5
6
7
8
9
10
 
public class EventTest {
 
    public void createEvent(){
        Event event = new Event();
        event.setLimitOfEnrollment(20);
        event.setLocation("34123");
    }
    
}
cs

 

이렇게 작성하면 객체를 생성하고 setter 를 사용해서 객체의 속성 값을 채워 넣는다.

 

만약 객체의 모든 필드에 값을 넣을 수 있다면 생성자를 활용하기도 한다.

 

1
2
3
4
5
6
public Event(Integer id  , ){
        this.id = id;
        .....
        ....
        ....
    }
cs

 

이렇게 생성자를 만들어서 모든 값을 채워 넣을 것이다.

 

속성 값의 일부만 알고 있다면 아래 코드처럼 작성하게 될 것이다.

 

1
2
3
4
5
6
7
 
    public void createEvent(){
        Event event = new Event();
        event.setLimitOfEnrollment(20);
        event.setLocation("34123");
    }
 
cs

 

이렇게 작성하면 setter 부분이 속성 개수만큼 길어지게 된다.

 

빌더 패턴을 사용하면 코드를 그렇게 작성하지 않아도 된다.

 

빌더 패턴을 사용하면 아래와 같이 코드를 작성할 수 있다.

 

1
2
3
4
5
6
7
8
9
 
public class EventTest {
 
    public void builder(){
        Event event = Event.builder().description("20").location("123123").build();
    }
    
}
 
cs

 

이렇게하면 description 의 값이 20이고 location 이 123123인 Event 객체가 생성된다.

 

builder() 메소드를 정의한 적 없지만 @Builder 애너테이션을 붙임으로써 이렇게 코드를 작성 할 수 있다.

 

원래 자바에서는 아래처럼 작성한다. EventBuilder 클래스를 따로 작성해서 빌더 패턴을 구현한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class EventBuilder {
    private Integer id;    
    private String name;
    private String description;
    private LocalDateTime beginEnrollmentDateTime;
    private LocalDateTime closeEnrollmentDateTime;
    private LocalDateTime beginEventDateTime;
    private LocalDateTime endEventDateTime;
    private String location; // location 값이 없다면 온라인 모임
    private int basePrice; // optional
    private int maxPrice; // optional
    private int limitOfEnrollment;
    private boolean offline;
    private boolean free;
    private EventStatus eventStatus;
    
    public EventBuilder setId(Integer id) {
        this.id = id;
        return this;
    }
 
    public EventBuilder setName(String name) {
        this.name = name;
        return this;
    }
 
    public EventBuilder setDescription(String description) {
        this.description = description;
        return this;
    }
 
    public EventBuilder setbeginEnrollmentDateTime(LocalDateTime beginEnrollmentDateTime) {
        this.beginEnrollmentDateTime = beginEnrollmentDateTime;
        return this;
    }
 
    public EventBuilder setCloseEnrollmentDateTime(LocalDateTime closeEnrollmentDateTime) {
        this.closeEnrollmentDateTime = closeEnrollmentDateTime;
        return this;
    }
....
....
....
 
 
    public Event build(){
        Event event = new PersonInfo(name, age, favoriteColor, favoriteAnimal, favoriteNumber);
        return event;
    }
}
cs

 

이렇게 직접 구현한 경우에는 아래 코드처럼 사용한다.

 

1
2
3
4
5
6
7
8
9
10
public class BuilderPattern {
    public static void main(String[] args) {
        EventBuilder eventBuilder = new EventBuilder();// 빌더 객체를 생성합니다.
 
        Event event = eventBuilder // 빌더 객체에 데이터를 담습니다. 순서는 상관없습니다.
                .setLocation("MISTAKE")
                .setId(20)
                .build();
    }
}
cs

 

빌더 패턴에 대해서 알아봤습니다.

 

스프링 애너테이션들을 사용하면 스트래티지 패턴 , 싱글턴 , 빌더 패턴들을 쉽게 사용할 수 있는 것 같습니다.

 

이런 기능들은 정말 편리하지만 개발능력을 키우려면 이렇게 직접 해보는 경험이 필요하겠단 생각이 드네요.

댓글