가장 간단한 한마디 정의는 다음과 같습니다.
스프링 빈(Spring Bean)이란, 스프링 IoC 컨테이너가 생성하고 관리하는 자바 객체(Object)입니다.
여기서 핵심 단어는 '관리하는' 입니다. 우리가 직접 new 키워드를 사용해 객체를 만들고 관리하는 것이 아니라, 모든 권한을 스프링에게 위임하여 스프링이 대신 만들어주고 관리해주는 특별한 객체를 '스프링 빈'이라고 부릅니다.
쉬운 비유:
@Component, @Bean 등)에 따라 만들어지고, 필요할 때마다 가져다 쓸 수 있도록 보관 및 관리되는 레고 부품개발자는 이 공장(스프링 컨테이너)에게 "이런 부품(객체)이 필요해"라고 요청만 하면, 공장이 알아서 부품을 만들고, 다른 부품과 조립까지 해서(의존성 주입) 제공해 줍니다.
스프링을 사용하지 않는다면, 개발자가 직접 객체를 생성하고 연결(의존 관계 설정)해야 합니다.
// Controller가 Service를, Service가 Repository를 직접 생성
public class MemberController {
// Controller가 Service 객체를 직접 생성하여 의존함 (강한 결합)
private final MemberService memberService = new MemberServiceImpl();
}
public class MemberServiceImpl implements MemberService {
// Service가 Repository 객체를 직접 생성하여 의존함 (강한 결합)
private final MemberRepository memberRepository = new MemoryMemberRepository();
}
MemoryMemberRepository를 DbMemberRepository로 바꾸고 싶다면 MemberServiceImpl 코드 자체를 수정해야 합니다. 즉, 부품을 교체하기 위해 제품 설계 전체를 바꿔야 하는 강한 결합(Tight Coupling) 상태입니다. 유연성이 매우 떨어집니다.스프링은 **IoC(Inversion of Control, 제어의 역전)**와 **DI(Dependency Injection, 의존성 주입)**라는 개념을 통해 이 문제를 해결합니다.