회원 관리 예제 4 - 컴포넌트 스캔과 자동 의존관계 설정
이 포스트는 김영한님의 ‘스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술’을 수강하고 작성하였습니다.
스프링 컨테이너에 빈 등록하기
컴포넌트 스캔
@Component어노테이션이 있으면 스프링 빈으로 자동 등록@Controller어노테이션이 붙은 컨트롤러가 자동으로 스프링 빈에 등록된 것도 같은 이유@Component를 포함하는 다음 어노테이션도 스프링 빈으로 자동 등록@Controller@Service@Repository
- 스프링은 컨테이너에 빈을 등록할 때 싱글톤을 기본으로 함
자동 의존관계 설정
@Controller
public class HelloController {
private final MemberService memberService;
@Autowired
public HelloController(MemberService memberService) {
this.memberService = memberService;
}
// ...(생략)
}
HelloController는MemberService에 의존하는 관계- 예)
HelloController가MemberService를 통해 회원가입을 시키고 회원 조회를 함
- 예)
- 스프링 컨테이너에
MemberService를 등록하면, 하나의MemberService로 여러 컨트롤러가 사용할 수 있음(싱글톤) @Autowired로 생성자를 정의하면, 스프링이MemberService와HelloContainer를 연결- 생성자가 하나라면 생략 가능
- 스프링이
MemberService와HelloContainer를 연결하기 위해서는,MemberService가 스프링 빈으로 등록되어 있어야 함Bean에 등록되지 않은 컴포넌트에 대해서는@Autowired가 동작하지 않음- 예) 내가 직접
new MemberService()를 만들고 할당할 경우
- 예) 내가 직접
@Service
public class MemberService {
private final MemberRepository memberRepository;
// @Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// ...(생략)
}
@Repository
public class MemoryMemberRepository implements MemberRepository {
private static ConcurrentHashMap<Long, Member> store = new ConcurrentHashMap<>();
private static AtomicLong sequence = new AtomicLong(0);
// ...(생략)
}
언제 사용하나?
- 정형화된 컨트롤러, 서비스, 리포지토리에 사용
댓글남기기