프로그램을 개발하다보면 클래스 간의 연관성이 생기는 경우가 많을 것입니다. 이를테면 어떤 클래스에서 다른 객체를 new 연산을 통해 호출하거나, 매개변수로 받아오는 등 여러 경우를 통해 클래스 간의 의존관계가 발생합니다.
하지만 클래스 호출을 new 연산으로만 진행을 한다면 두 클래스간의 결합성은 높아지게 됩니다. 결합성이 높아질수록 한 클래스에서 변경사항이 발생한다면, 이를 호출한 의존관계를 가지는 클래스들에서도 모두 변경을 시켜야 한다는 단점이 있습니다.
따라서 결합성을 낮추기 위해 의존성 주입은 필수적입니다. 필드 주입, setter 주입, 생성자 주입의 3가지 방법이 있지만 대부분의 경우 생성자 주입으로 DI를 진행합니다.
@Autowired
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository)
{
this.memberRepository = memberRepository;
}
}
이때, 스프링 빈에는 아래와 같이 저장을 합니다.
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
MemoryMemberRepository
를 대체하고, memberRepository
를 구현한 다른 클래스를 주입하고자 하면 Bean으로 작성한 코드에서 반환값만 바꿔주면 다른 코드는 수정할 필요 없이 의존관계를 바꿀 수 있습니다.
위의 내용은 추후 수정, 추가될 예정입니다.