[ JAVA ]Builder 패턴이란?

이진우·2024년 9월 10일

spring boot 를 공부하던 도중 객체생성을 할 때 @Builder 를 자주 쓰길래,
무슨역할인지 알아보려합니다.

우선 @Builder 는 어노테이션이라 간편하게 쓸수있게 만들어준 거고,
자세한 역할을 알기위해서는 builder 에 대해 공부를 해볼까 합니다.

builder pattern()

빌더 패턴을 사용하는 이유

  1. 가독성 증가
  2. 불변 객체 생성
  3. 필수/선택적 속정 관리
  4. 유연성

일반 set 주입

dto

@Getter
@Setter
@ToString
public class MemberDto {
    private String name;
    private int age;
    private int height;
}

contoller

@Controller
public class BoardController {
    @GetMapping
    public String board() {
        MemberDto memberDto = new MemberDto();
        memberDto.setName("이진우");
        memberDto.setAge(20);
        memberDto.setHeight(178);
        System.out.println(memberDto);
        return "index";
    }
}

결과적으로 set 을 이용해서 모두 기입을 해줘야 됩니다.

builder 패턴사용

dto

@Getter
@Setter
@ToString
public class MemberDto {
    private String name;
    private int age;
    private int height;
    public MemberDto(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.height = builder.height;
    }
    public static class Builder {
        private String name;
        private int age;
        private int height;
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        public Builder setAge(int age) {
            this.age = age;
            return this;
        }
        public Builder setHeight(int height) {
            this.height = height;
            return this;
        }
        public MemberDto build() {
            return new MemberDto(this);
        }
    }
}

controller

@Controller
public class BoardController {
    @GetMapping
    public String board() {
        MemberDto user1 = new MemberDto.Builder()
                .setName("이진우")
                .setAge(20)
                .setHeight(170)
                .build();
        System.out.println(user1);
        MemberDto user2 = new MemberDto.Builder()
                .setName("홍길동")
                .setAge(18)
                .build();
        System.out.println(user2);
        return "index";
    }
}

후 출력해보면 같은 값이 출력되지만,
dto 에서 매번 오버로딩 할 필요 없이 builder 패턴으로 생성해주면
어디서든 때에 맞은 객체생성을 해줄 수 있어 가독성과 유연성이 좋습니다.

@Builder

이제 빌드에 dto 내부에서도 코드가 길어지기 때문에
lombok 에서 지원해주는 @Build 를 쓰게되면
코드가 더 간편해질수있습니다.

dto

@Getter
@Builder
@ToString
public class MemberDto {
    private String name;
    private int age;
    private int height;
}

controller

@Controller
public class BoardController {
    @GetMapping
    public String board() {
        MemberDto user1 = MemberDto.builder()
                .name("이진우")
                .age(20)
                .height(170)
                .build();
        System.out.println(user1);
        MemberDto user2 = MemberDto.builder()
                .name("홍길동")
                .age(18)
                .build();
        System.out.println(user2);
        return "index";
    }
}

위 코드처럼 @Builder 선언을 해주면 Builder 클래스 생성과 set 선언 필요 없이
dto 에 선언되어있는 변수명만으로 객체 생성을 가능하게 해줄수있습니다.

profile
개발자 응애입니다

0개의 댓글