@RequiredArgsConstructor란

hoonssac·2024년 7월 1일

Spring

목록 보기
14/18
post-thumbnail

오늘은 Spring에서 Controller나 Service 클래스를 만들 때 자주 사용하는 어노테이션 중 하나인 @RequiredArgsConstructor의 역할에 대해서 한 번 알아보겠습니다.


🚩사용 배경

Spring에서 의존성을 주입하기 위해서는 생성자(Constructor), Setter, Field 타입의 방식을 사용해야 했습니다.

하지만 lombok@RequiredArgsConstructor 어노테이션을 사용하면 생성자 주입을 간단하게 할 수 있습니다.


@RequiredArgsConstructor

이 어노테이션은 초기화 되지 않은 final필드나, @NonNull이 붙은 필드에 대해 생성자를 생성해 주는 역할을 합니다.

즉, 이 어노테이션을 사용하게 되면 새로운 필드를 추가할 때 다시 생성자를 만들어서 관리해야 하는 번거로움을 덜어줄 수 있게 되죠.


💡예시

그럼 간단한 예시로 차이를 살펴보겠습니다.

아래 예시는 간단한 블로그를 만드는 과정 중에 만든 글 전체 리스트를 담은 뷰를 반환하는 Controller입니다.

이 Controller에서는 BlogService클래스에 대한 생성자를 주입받아야 합니다.

@RequiredArgsConstructor를 사용하지 않은 예시

package com.b1uesoda.myo.controller;

import com.b1uesoda.myo.dto.ArticleListViewResponse;
import com.b1uesoda.myo.service.BlogService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Controller
public class BlogViewController {

    BlogService blogService;

    public BlogViewController(BlogService blogService) {
        this.blogService = blogService;
    }

    @GetMapping("/articles")
    public String getArticles(Model model) {
        List<ArticleListViewResponse> articles = blogService.findAll().stream()
                .map(ArticleListViewResponse::new)
                .toList();
        model.addAttribute("articles", articles);

        return "articleList";
    }
}

이렇게 Controller로 등록된 Bean에 생성자가 오직 하나만 있고, 생성자의 파라미터 타입이 Bean으로 등록되어 있다면 해당 Bean을 알아서 주입을 해주기 때문에, Spring에서 제공하는 @Autowired 어노테이션을 쓰지 않아도 됩니다.


@RequiredArgsConstructor를 사용한 예시

package com.b1uesoda.myo.controller;

import com.b1uesoda.myo.dto.ArticleListViewResponse;
import com.b1uesoda.myo.service.BlogService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@RequiredArgsConstructor
@Controller
public class BlogViewController {
    
    private final BlogService blogService;
    
    @GetMapping("/articles")
    public String getArticles(Model model) {
        List<ArticleListViewResponse> articles = blogService.findAll().stream()
                .map(ArticleListViewResponse::new)
                .toList();
        model.addAttribute("articles", articles);
        
        return "articleList";
    }
}

@RequiredArgsConstructor어노테이션을 사용하게 되면, final이나 @NonNull로 정의한 것들을 기본 생성자 파라미터로 만들어 줌으로써, 새로운 필들르 추가할 때 다시 생성자를 만들거나 하는 등의 번거로움을 없앨 수 있습니다.

❗사용 시 주의점

오늘은 이렇게 @RequiredArgsConstructor를 이용해서 편리하게 의존성을 주입하는 방법에 대해 알아보았습니다.

추가적으로 이 어노테이션은 부모를 상속하는 클래스에서는 사용하는 것을 권장하지 않는다고 합니다. 그 이유는 부모에서 상속 받은 필드들은 자동으로 생성된 생성자에 추가되지 않기 때문이죠.
이 경우에는 직접 생성자를 선언해서 상속 받은 필드들도 super 키워드로 의존성을 주입시켜줘야 합니다.


📚Reference
스프링 팁, "생성자 안 만들고 생성자 주입을 쓸 수 있다?!" (feat 롬복)

profile
훈싹의 개발여행

0개의 댓글