Javadocs

[Spring] 의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입) 본문

Programming/Spring(코드로 배우는 스프링 웹 프로젝트)

[Spring] 의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입)

Javatist 2023. 3. 29. 23:46

@Autowired 어노테이션을 이용한 다양한 의존성 주입(DI, Dependency Injection) 방법을 제공합니다.
의존성 주입은 필요한 객체를 직접 생성하는 것이 아니라라 외부로부터 객체를 받아 사용하는 것입니다.

이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높일 수 있습니다. 
@Autowired는 Spring에게 의존성을 주입하는 지시자 역할로 쓰입니다. 

1. 의존성 주입을 해야 하는 이유

  • Test가 용이해진다.
  • 코드의 재사용성을 높여준다.
  • 객체 간의 의존성(종족성)을 줄이거나 없앨 수 있다.
  • 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.

2. 의존성 주입의 3가지 방법

  • 생성자 주입(Constructor Injection)
  • 필드 주입(Field Injection)
  • 수정자 주입(Setter Injection)

#1. 생성자 주입(Constructor Injection)

@Controller
public class JavadocsController {
	// final을 붙일 수 있음
    private final JavadocsService javadocsService;
    
    @Autowired
    public JavadocsController(JavadocsService javadocsService) {
    	this.javadocsService = javadocsService;
    }
    
}

생성자 주입은 생성자의 호출 시점에 1회 호출 되는 것이 보장됩니다. 그렇기에 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해 사용할 수 있습니다.
클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면 @Autowired를 생략할 수 있습니다.

#2. 필드 주입(Field Injection)

@Controller
public class UserCpntroller {
	
    @Autowired
    private UserService UserService;
}

필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성 주입이 됩니다.
사용법이 매우 간단하기 때문에 가장 많이 접할 수 있는 방법입니다. 

[ 단점 ]

  • 코드가 간결하지만, 외부에서 변경하기 힘들다.
  • 프레임워크에 의존적이고 객체지향적으로 좋지 않다. 

#3. 수정자 주입(Setter Injection)

@Controller
public class JavadocsController {
	private JavadocsService javadocsService;
    
    @Autowired
    public void setJavadocsService(JavadocsService javadocsService) {
    	this.javadocsService = javadocsService;
    }
}

Setter 메소드에 @Autowired 어노테이션을 붙이는 방법입니다. 

[ 단점 ]

  • 수정자 주입을 사용하면 setXXX 메서드를 public으로 열어두어야 하기 때문에 언제 어디서든 변경이 가능하다.
Comments