👀 IoC(Inversion of Control)
✋ 스프링 빈이란?
우선 /hello.hellospring/controller
하위에 MemberController
를 생성합니다.
회원 컨트롤러가 회원 서비스를 의존하고 있기 때문에 아래와 같이 작성해 의존관계를 추가해줍니다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Controller
어노테이션이 적용된 클래스는 컨트롤러임을 나타내며 빈으로 등록됩니다.@Autowired
는 필요한 의존 객체의 타입에 해당하는 빈을 스프링 IoC 컨테이너가 찾아서 주입해주는 어노테이션입니다. 회원 컨트롤러가 의존하고 있는 memberService
를 찾아 주입해주기 위해 memberService
를 @Service
어노테이션을 이용해 빈으로 등록해줍니다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
회원 서비스도 회원 리포지토리를 의존하고 있기에 다음과 같이 @Repository
어노테이션을 사용해 스프링 빈으로 등록해줍니다.
@Repository
public class MemoryMemberRepository implements MemberRepository {}
✋ 컴포넌트 스캔
- 컴포넌트 스캔은
@Component
어노테이션을 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정을 말합니다.@Component
외에@Controller
,@Service
,@Repository
,@Configuration
어노테이션도 컴포넌트 스캔대상에 포함됩니다.
주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔방식을 사용하지만, 정형화 되지 않거나 상황에 따라 구현 클래스를 변경해야 하면 직접 설정을 통해 스프링 빈으로 등록합니다.
위에서 작성한 @Service
, @Repository
, @Autowired
어노테이션을 제거하고 /hello.hellospring/SpringConfig.java
파일을 생성해 다음과 같이 작성해줍니다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Bean
어노테이션을 통해 memberRepository
를 스프링 빈에 등록하고 memberService
에 주입해줍니다.memberService
도 마찬가지로 스프링 빈에 등록되며 컴포넌트 스캔방식으로 빈에 등록된 memberController
에 주입됩니다.아래와 같이 memberController
는 memberService
를 의존하고 있고 memberService
는 memberRepository
를 의존하고 있는 모습을 볼 수 있습니다.
🙏 이 포스트는 김영한 개발자님의 <스프링 입문 강의> 를 듣고 공부한 내용을 바탕으로 작성되었습니다.
감사합니다..!