이번 글에서는 스프링 컨테이너, 스프링 빈, 의존성 주입 개념에 대해 알아보고자 한다.
스프링 컨테이너: 스프링이 객체들을 생성하고 관리하는 객체 보관소
스프링 빈: 객체 보관소에 등록되어 스프링이 직접 관리하는 객체들
의존성 주입(DI): 객체가 필요로 하는 또 다른 객체를 직접 생성(new 방식)이 아니라
스프링 컨테이너가 알아서 객체를 찾아서 주입해주는 것
우리가 만들었던 회원 예제에서는
MemberController -> MemberService -> MemberRepository 이런식으로
스프링 빈들이 등록되어 주입이 되어야한다.
즉, 우리는 스프링 컨테이너에 스프링 빈으로 등록을 해주는 작업을 진행해야한다.
스프링 빈을 등록하는 방법에는 2가지 방법이 있다.
1. 컴포넌트 스캔과 자동 의존관계 설정



@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Repository
public class MemoryMemberRepository implements MemberRepository {}
가장 쉽고 실무에서 많이 쓰이는 기본 방법이다.
class 위에 특정 어노테이션을 붙여주면, 스프링이 시작될 때
이 어노테이션을 스캔하여 자동으로 스프링 컨테이너에 등록하는 방식이다.
@Component 어노테이션이 있으면 스프링 빈으로 스프링 컨테이너에 자동 등록된다.
이 예제에서 사용된 @Controller, @Service, @Repository는
모두 그 내부를 보면 @Component 어노테이션을 포함하고 있다.
그리고 각 class의 생성자에 @Autowired 어노테이션을 붙이면 서로 연결되게 한다.
만약 생성자가 1개뿐이면 생략 가능하다.
2. 자바 코드로 직접 스프링 빈 등록

package hello.hello_spring;
import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MemoryMemberRepository;
import hello.hello_spring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
앞서 만들었던 어노테이션을 전부 제거하고,
별도의 SpringConfig 설정 파일을 만들어서 객체들을 스프링 빈으로 등록하는 방법이다.
@Configuration이라는 어노테이션을 붙이면 설정파일을 완성한다.
스프링 빈으로 등록할 객체는 @Bean 어노테이션을 사용한다.
참고사항으로 의존성 주입에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있는데,
요새는 생성자 주입을 주로 쓴다고 한다.
이유는 일단 필드 주입은 간결하다는 장점이 있지만, 외부에서 강제로 바꿀 수가 없어서 repository를 갈아끼울 수 없기 때문에 매우 불편하다.
setter 주입은 누군가가 마음대로 repository를 다른 것으로 갈아끼울 위험이 있어 좋지 않다.
생성자 주입은 final로 선언하여 생성될 때 한번 세팅되고, 그 이후에는 repository를 다른 사람들이 열 수 없도록 잠근다. 즉, 외부의 위협은 차단하고 혹여나 다른 repository로 갈아끼울 때 교체도 가능한 방식이다.
'백엔드' 카테고리의 다른 글
| Spring 입문 #6 - mySQL (1) (0) | 2026.05.09 |
|---|---|
| Spring 입문 #5 - 회원 관리 예제: 웹 MVC 개발 (0) | 2026.05.09 |
| Spring 입문 #3 - 회원 관리 예제: 회원 서비스 (2) | 2026.05.02 |
| Spring 입문 #2 - 회원 관리 예제 : 도메인, 레포지토리 (0) | 2026.03.30 |
| Spring 입문 #1 - 스프링 웹 개발 기초 (0) | 2026.03.17 |
