
오늘은 Spring에서 Controller나 Service 클래스를 만들 때 자주 사용하는 어노테이션 중 하나인 @RequiredArgsConstructor의 역할에 대해서 한 번 알아보겠습니다.
Spring에서 의존성을 주입하기 위해서는 생성자(Constructor), Setter, Field 타입의 방식을 사용해야 했습니다.
하지만 lombok의 @RequiredArgsConstructor 어노테이션을 사용하면 생성자 주입을 간단하게 할 수 있습니다.
이 어노테이션은 초기화 되지 않은 final필드나, @NonNull이 붙은 필드에 대해 생성자를 생성해 주는 역할을 합니다.
즉, 이 어노테이션을 사용하게 되면 새로운 필드를 추가할 때 다시 생성자를 만들어서 관리해야 하는 번거로움을 덜어줄 수 있게 되죠.
그럼 간단한 예시로 차이를 살펴보겠습니다.
아래 예시는 간단한 블로그를 만드는 과정 중에 만든 글 전체 리스트를 담은 뷰를 반환하는 Controller입니다.
이 Controller에서는 BlogService클래스에 대한 생성자를 주입받아야 합니다.
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 어노테이션을 쓰지 않아도 됩니다.
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 키워드로 의존성을 주입시켜줘야 합니다.