스프링에서 말하는 의존 주입, 의존 처리 ... 의존이라는 게 뭘 말하는걸까?
회원가입을 수행하는 코드를 짠다고 생각해보자.
이를 위해 MemberDao, MemberService, MemberControl 가 존재한다.
여기서 만일 동일한 이메일으로 회원가입을 하지 못 한다는 요구사항이 있다면 MemberService 클래스는 MemberDao 객체의 FindByEmail() 의 메서드를 사용하여 해당 이메일로 회원가입한 멤버가 있는지 확인한다.
이렇게 어떤 한 클래스가 다른 클래스 객체의 메서드를 실행할 때, 이를 '의존'한다고 표현한다.
위의 경우에서는 MemberService 클래스가 MemberDao 클래스에 의존한다고 표현할 수 있다.
의존은 변경에 의해 영향을 받는 관계를 말한다.
위의 예시에서 만약 MemberDao객체의 FindByEmail() 메서드의 이름을 SelectByEmail()로 변경한다면 ,
이 메서드를 사용하는 MemberService의 코드도 따라 변경될 것이다.
이렇게 변경에 따른 영향이 미치는 관계를 의존한다고 표현한다.
이처럼 한 클래스가 의존하는 대상이 있다면, 그 대상을 클래스 내에서 구해서 메소드를 사용해야할 것이다.
가장 쉬운 방법은 역시 new 생성자를 통해 의존 대상 객체를 직접 생성하는 방법이다.
ex)
public class MemberService {
private MemberDao memberDao = new MemberDao();
...
}
// 사용시
MemberService memberService = new MemberService();
MemberService 객체를 생성하는 순간 MemberDao 객체도 함께 생성된다.
이 방법은 가장 간단하기는 하지만, 유지보수 관점에서 보면 충분히 문제가 될 수 있다.
그래서 사용할 수 있는 방법이 DI (의존 주입)이다.
DI (Dependency Injection, 의존 주입)
이 방법은 의존하는 객체를 직접 생성하는 것이 아니라 전달 받는 방식을 사용한다.
즉, 클래스 내에서 생성하지 않고, 클래스 밖에서 생성된 의존 객체를 가져오는 방식이다.
ex)
public class MemberService() {
private MemberDao memberDao;
public MemberService(MemberDao memberDao) {
this.memberDao = memberDao;
}
...
}
// 사용시
MemberDao memberDao = new MemberDao();
MemberService memberService = new MemberService(memberDao);
스프링을 사용하려면 스프링이 어떤 객체를 생성하고, 의존을 어떻게 주입할지를 정의한 설정 정보를 작성해야 한다.
필요한 객체를 생성하고 생성한 객체에 의존을 주입하는 역할을 하는 스프링 설정 클래스에 @Configuration 애노테이션을 달아준다.
DI 방식에는 두 가지가 있다.
첫 번째, 생성자에서 의존 객체를 주입하는 방식
두 번째, setter 메서드를 통해 의존 객체를 주입하는 방식
이 두 방식 각각의 장점은 곧 다른 방식의 단점이 된다.
만약 생성자의 파라미터 개수가 많을 경우에는 어떤 인자가 어떤 의존 객체를 설정하는지 알아내기 위해서 생성자 생성시 생성자 코드를 확인해야 한다는 번거로움이 있다. 반대로 세터 메서드는 메서드 이름만으로도 어떤 의존 객체를 설정하는지가 명확하다.
반면에 생성자 방식은 빈 객체를 생성하는 시점에 모든 의존 객체를 주입받기 때문에 객체를 사용할 때 완전한 상태로 사용할 수 있다. 반대로 세터 메서드는 의존 객체 주입 전에 빈 객체가 생성되기 때문에 간혹 객체를 사용하는 시점에 NullPointException이 발생할 수 있다.
따라서 두 방식 중 하나의 정답은 없으며, 상황에 맞게 사용하면 된다.
'Back-End > Spring' 카테고리의 다른 글
[Spring] ResponseBody와 ResponseEntity (0) | 2022.03.28 |
---|---|
[Spring] 싱글톤객체 / 자동 의존 주입 / 컴포넌트 스캔 (0) | 2022.03.25 |