포도가게의 개발일지

[Spring] 생성자주입? 필드주입? 세터주입? 본문

Spring boot

[Spring] 생성자주입? 필드주입? 세터주입?

grape.store 2022. 1. 5. 21:35
반응형

- Spring에서 등록된 Bean을 사용하기 위해서 DI(Dependency Injection)를 처리하는 방법은 크게 3가지가 있다.
Field Injection, Setter Injection, Contructor Inject이다. Spring 3.x버젼까지만 해도 Setter Inject을 권장하였으나, 최근에는 순환참조, Coupling등이 문제로 인해서 Spring 4.3 이후 버젼 부터는 Contructor Inject를 권장하고 있다.

 

Bean?

- Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.

- 즉 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.

 

DI

Field Injection

- 가장 간단한 방법으로 Bean으로 등록된 객체를 사용하고자 하는 클래스에 Field로 선언한 뒤 @Autowired키워드를 붙여주면 자동으로 주입된다.

## 필드 주입 ##

@Controller
public class ArticleController {

    @Autowired
    private ArticleRepository articleRepository;
}

Constructor Injection

- 현재 가장 권장되고 있는 방법이다. 하나의 생성자가 존재시 기존 Field Injection의 거의 모든 단점을 극복해낸 패턴이다.

## 생성자 주입 ##

@Controller
@AllArgsConstructor
@Slf4j
public class ArticleController {

    private ArticleRepository articleRepository;
    
    //generated @AllArgsConstructor
    @Autowired // spring 4.3버전부터 생략가능
    public ArticleController(ArticleRepository articleRepository){
    	this.articleRepository = articleRepository;
    }

    @GetMapping("/articles/new")
    public String newArticleForm(){
        return "articles/new";
    }

    @GetMapping("/articles/{id}")
    public String show(@PathVariable Long id){
        log.info(id.toString());
        return "";
    }

    @PostMapping("/articles/create")
    public void createArticleForm(ArticleForm form){
        Article article = form.toEntity();

        Article saved = articleRepository.save(article);
        log.info(saved.toString());
    }
}

Constructor Injection

Setter Injection

- Setter Method에 @Autowired를 붙여서 DI를 구현하는 방식이다. (사실 꼭 setter method일 필요는 없다. 동일한 기능을 하는 다른 메소드 명도 상관 없다. = Method Injection이 정학한 이름)

## setter 주입 ##
## 객체가 생성될때 주입되는게 아니라 언제든지 값은 변경??이 되나 private인데? ##


@Controller
public class ArticleController {

    private ArticleRepository articleRepository;
    
    @Autowired
    public void setController(ArticleRepository article){
    	this.articleRepository = article;
    }
    
    
}

'Spring boot' 카테고리의 다른 글

[JAVA] 빌드 과정  (0) 2022.01.13
[JAVA] LOMBOK이란?  (0) 2022.01.12
[Java] Java 원시타입 vs 참조타입  (0) 2022.01.05
[Spring] CRUD  (0) 2022.01.05
[Spring] MVC 패턴  (0) 2022.01.04
Comments