섹션 5 - 스프링 빈과 의존관계
4주차 스터디 시작합니당
컴포넌트 스캔과 자동 의존관계 설정
우선 MemberController를 만들어보자

이렇게 해놓으면 멤버 컨트롤러 객체를 생성해서 스프링에 넣어두고 스프링이 관리를 하게된다
그런데 스프링이 객체를 관리하게 되면, 직접 new로 생성할 수 없고 항상 스프링 컨테이너에서 꺼내서 써야한다

이렇게 직접 new로 생성했을 경우엔
스프링 컨테이너가 이 객체들을 관리하지 않기 때문에
@Autowired도 안 되고,
설정에서 구현체를 바꾸는 것도 안 되고,
AOP나 트랜잭션 처리 같은 스프링 기능도 쓰지 못한다고 한다
그래서 이렇게 쓰는 것보다는 스프링 컨테이너한테 등록을 하고 쓰면 된다고 하는데
직접 확인해보자!

이렇게 @Autowired를 만들어주면 스프링 컨테이너에서 관리하는 멤버 서비스를 스프링이 가져와서 넣을 수 있도록 연결을 시켜주는건데 실행을 해보면 오류가 난다
그 이유는 전에 만들어둔 멤버 서비스가 순수한 자바 클래스이기 때문이다
그래서 Memberservice에는 @Service를, MemberRepository에는 @Repository를 넣어주면
@Autowired가 스프링이 필요한 의존객체를 자동으로 주입해준다!
-> 이게 컴포넌트 스캔 방식
강의 영상 만으로 이해가 잘 안 되어서 컴포넌트 스캔 방식에 대해 더 찾아보았당
컴포넌트 스캔 방식?
스프링이 특정 패키지부터 시작해서 @Component, @Service, @Repository, @Controller가 붙은 클래스를 찾아 자동으로 스프링 빈으로 등록하는 방식으로, @Autowired를 이용해 자동으로 필요한 빈을 주입해주는 것
사용하는 방법
(1) 생성자 주입(Constructor Injection)
- 테스트용 생성자 만들기 쉬움
- 스프링이 빈 생성 시 의존성을 강제로 주입함
- 생성자가 1개면 @Autowired 생략 가능
(2) 필드 주입(Field Injection)
- 외부에서 주입을 못 하므로 테스트하기 어려움
- 의존관계를 눈으로 보기 힘듦
- 나중에 순환참조 문제나 유지보수 시 불편
(3) 세터 주입(Setter Injection)
- 의존성을 선택적으로 주입 가능
- 테스트에서 mocking 하기 편리
- 세터를 통한 변경 가능성 -> 불변성 깨짐
따라서 @Autowired는 주입방식에 상관 없이 사용이 가능하지만,
생성자 주입 방식이 제일 권장되는 방식이라고 한다!
자바 코드로 직접 스프링 빈 등록하기
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.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();
}
}
이렇게 작성해주면 직접 스프링 빈 등록을 할 수 있당
@Configuration 클래스 안에서 @Bean 매서드를 사용해 직접 빈을 등록하는 것이 특징이고, 의존관계를 직접 지정할 수 있어서 명확한 제어가 가능하다고 한다
이렇게 직접 등록하는 것의 장점으로는 어떤 구현체가 주입되는지 명확하게 보이고, 변경이 필요할 때 설정 파일만 수정하면 되고, 테스트에서 다른 구현체로 바꾸기 쉽다는 점이 있지만
설정 코드가 길어질 수 있고 자동 스캔에 비해 개발 속도는 약간 느릴 수 있다는 단점이 있다
★ 최종정리
컴포넌트 스캔 방식 -> 제어 정도가 낮음, 빠르고 간결함, 자동 주입이 편리함 => 작은 프로젝트에 적합
수동 등록 방식 -> 제어 정도가 높음, 명확하고 구체적임, 의존관계가 명시적으로 구성 => 큰 프로젝트나 테스트에 적합
하지만 실전에서는 기본적으로 컴포넌트 스캔 방식 사용!!
이렇게 스프링 빈을 등록하는 2가지 방법에 대해 알아보았다!

고생하셨습니다!!
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2025 1학기 스프링부트 스터디] 정다은 #4주차 (1) | 2025.05.04 |
---|---|
[2025 1학기 스프링부트 스터디] 이상래 #4주차 (0) | 2025.05.04 |
[2025 1학기 스프링 부트 스터디] 남윤찬 #4주차 (0) | 2025.05.03 |
[2025 1학기 스프링부트 스터디] 김민서 #4주차 (0) | 2025.05.03 |
[2025 1학기 스프링 부트 스터디] 석준환 #4주차 (0) | 2025.04.29 |