스프링을 배우다 보면 "객체를 연결해준다(의존성 주입)"는 말은 이해했는데, 막상 코드를 짜려고 보면 방법이 여러 가지라 헷갈릴 때가 있습니다.
"변수에 바로
@Autowired를 붙여도 되고, 생성자에 붙여도 되고... 도대체 뭐가 다른 거죠?"
@Autowired는 영어 뜻 그대로 "자동으로(Auto) 선을 연결(Wired)해라"라는 뜻입니다.
상황: 여러분이 컴퓨터(객체)를 조립하고 있습니다. 모니터 선을 본체에 꽂아야 화면이 나오겠죠?
Java 세상: 원래는 개발자가 직접 "이 선을 여기에 꽂아!"라고 코드를 짜야 합니다. (this.monitor = new Monitor();)
Spring 세상 (@Autowired): 컴퓨터 옆에 @Autowired 스티커만 딱 붙여놓습니다. 그러면 스프링이라는 우렁각시(컨테이너)가 나타나서, 창고에 있는 모니터를 가져다가 알아서 꽂아줍니다.
한마디로: "나 이거 필요해! 스프링 네가 찾아서 넣어줘!"라고 말하는 주문 요청서입니다.
참고: 요즘(스프링 4.3 버전 이후) 생성자 주입을 쓸 때는 생성자가 하나만 있다면 @Autowired를 안 써도 됩니다. "생성자가 하나네? 그럼 당연히 여기에 재료를 넣어야겠지?" 하고 스프링이 똑똑하게 알아듣기 때문입니다.
이번 시간에는 스프링이 지원하는 3가지 주입 방식을 비교해 보고, 스프링 팀이 공식적으로 추천하는 "최고의 방법"이 무엇인지 알아보겠습니다.
상황을 가정해 봅시다. YourBusinessClass라는 클래스가 일을 하려면 Dependency1과 Dependency2라는 두 친구(의존성)가 필요합니다.
@Component
class Dependency1 {}
@Component
class Dependency2 {}
@Component
class YourBusinessClass {
Dependency1 dependency1;
Dependency2 dependency2;
// 이 친구들을 어떻게 연결(주입) 받을까요?
}
이제 이 친구들을 연결하는 3가지 방법을 알아볼까요?
가장 간단하고 코드가 짧아서 많이 보셨을 방법입니다. 변수(필드) 위에 바로 @Autowired를 붙입니다.
@Component
public class YourBusinessClass {
@Autowired // <-- 필드에 바로 붙임
Dependency1 dependency1;
@Autowired
Dependency2 dependency2;
// ...
}
Setter 메서드(수정자)를 만들고 그 위에 @Autowired를 붙이는 방법입니다.
@Component
public class YourBusinessClass {
Dependency1 dependency1;
Dependency2 dependency2;
@Autowired // <-- Setter 메서드에 붙임
public void setDependency1(Dependency1 dependency1) {
this.dependency1 = dependency1;
}
@Autowired
public void setDependency2(Dependency2 dependency2) {
this.dependency2 = dependency2;
}
}
생성자를 통해 의존성을 받는 방법입니다.
@Component
public class YourBusinessClass {
Dependency1 dependency1;
Dependency2 dependency2;
// @Autowired <-- 생성자가 하나라면 생략 가능! (스프링의 배려)
public YourBusinessClass(Dependency1 dependency1, Dependency2 dependency2) {
this.dependency1 = dependency1;
this.dependency2 = dependency2;
}
}
셋 다 작동은 잘 됩니다. 하지만 스프링 팀이 강력하게 추천하는 방법은 바로 ③ 생성자 주입입니다.
이유가 뭘까요?
@Autowired 생략 가능: 생성자가 딱 하나만 있다면, @Autowired를 안 써도 스프링이 알아서 주입해줍니다. 코드가 깔끔해지죠!앞으로는 코드를 짤 때 생성자 주입을 우선적으로 고려해 보세요. 처음엔 코드가 조금 길어 보일 수 있지만, 훨씬 튼튼한 애플리케이션을 만들 수 있습니다.