의존성 주입 (Dependent Injection) 에 대해서 알아보자.
하나의 객체가 다른 객체의 의존성을 제공하는 테크닉.
클라이언트가 어떤 서비스를 사용할 것인지를 지정하는 게 아닌, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것.
객체의 생성과 사용의 관심을 분리하기 위함. 이는 가독성과 코드 재사용을 높혀준다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
생성은 생성대로 되고, setter를 통한
누군가가 controller를 호출했을 때, public으로 열려있어야 한다.
그래서 노출이 되므로, 누군가가 잘못 수정하게 되면 문제가 생길 수 있다.
@Controller
public class MemberController {
@Autowired
private MemberService memberService;
}
spring이 실행될 때, Autowird에 의해 연결이 되고 그 후, 중간에 수정을 하고 싶어도 할 수 없다. 추천하지 않음.
의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
실행 중에 동적으로 변한다는 것은 runtime 중 코드를 변경한다는 뜻.
만약 변경을 해야 한다면 config를 수정하고 서버에 다시 올려야한다.
출처 : https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85
https://www.inflearn.com/course/스프링-입문-스프링부트/unit/49587?category=questionDetail