ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Builder 패턴의 장점과 사용방법
    Spring(Java) 2024. 2. 8. 00:56

    개요

    • 프로젝트를 개발하다 보면 한 객체가 많은 변수를 가진 경우가 있다.
    • 생성자를 이용해 객체를 생성하면 코드의 가독성이 많이 떨어진다.
    • 항상 매개변수의 개수를 확인해야 하고, 원치 않은 변수의 초기화도 진행된다.

    Builder Pattern

    빌더 패턴(Builder Pattern)이란 복합 객체의 생성 과정과 표현 방법을 분리해 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다.

     

    생성자에 매개변수의 개수가 많아 질수록 해당 변수가 어떤 값을 나타내는지 구분하기 어려워지며,

    특정 객체들은 특정 매개변수 만으로 생성해야 하는 경우가 발생한다.

    이를 해결하기 위해 나머지 매개변수 값으로 null을 전달해주거나, 새로운 생성자를 만들게 되는데 코드의 가독성이 매우 떨어진다.


    Builder 사용법

    Builder 클래스를 생성해서 객체 생성을 분리하는 방법도 있겠지만, Lombok의 기능을 사용해서 builder 패턴을 구현해보려고 한다.

    게시글을 작성하는 API를 간단하게 구현하면서 Builder 사용법을 익혀보자

     

    Post.java

    @Entity
    @NoArgsConstructor
    @Getter
    public class Post {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String title;
        private String content;
        private String author;
    
        @Builder
        public Post(String title, String content, String author){
            Assert.hasText(title, "제목은 필수입니다.");
            Assert.hasText(content, "내용은 필수입니다.");
            this.title = title;
            this.content = content;
            this.author = author;
        }
    }

     

    게시글 Entity를 만들어줬고, @Builder를 클래스가 아닌 생성자에 적용시켰다.

    위 코드에서 id처럼 우리가 할당해주는 값이 아니라 자동으로 생성되는 값에 적용되는 것을 막기 위함이다.

    Assert.hasText()를 활용해서 꼭 필요한 값에 대한 예외처리를 진행해줬다.

     

    BuilderController.java

    @RestController
    @AllArgsConstructor
    @RequestMapping("/api/builder")
    public class BuilderController {
        private final BuilderService builderService;
        @PostMapping
        public PostResponse registerPost(@RequestBody PostRequest request){
            PostResponse response = builderService.registerPost(request);
            return response;
        }
    }

     

    컨트롤러는 여느 컨트롤러와 차이가 없다. Builder를 활용해보기 위해 간소하게 작성했다.

     

    BuilderService.java

    @Service
    @AllArgsConstructor
    public class BuilderService {
        private final BuilderRepository builderRepository;
    
        public PostResponse registerPost(PostRequest request) {
            Post post = Post.builder()
                    .title(request.getTitle())
                    .content(request.getContent())
                    .build();
            builderRepository.save(post);
            return new PostResponse(post.getTitle(), post.getContent());
        }
    }

     

    Post 객체를 생성할 때 생성자가 아닌 builder().build()를 사용해줬다.

    Post에는 title, content, author 총 3개의 변수를 직접 할당할 수 있는데, 그 중 원하는 변수만 넣어서 생성할 수 있다.

     

    BuilderRepository.java

    public interface BuilderRepository extends JpaRepository<Post, Long> {
    }

     

     


    사용법도 간단하며 코드의 가독성이 눈에 띄게 올라가고, 생성자를 하나만 만들어줘도 되는 것이 큰 장점인 것 같다.

    'Spring(Java)' 카테고리의 다른 글

    Spring과 Spring Boot의 차이점  (0) 2024.08.29
    [Spring Boot] Error 정리  (0) 2024.01.31
    [Spring] 용어정리(Updated 240131)  (0) 2024.01.31
    [SpringBoot] QueryDSL 사용법 + 환경설정  (0) 2024.01.31
    Spring MVC  (0) 2023.11.03
Designed by Tistory.