이 포스트는 김영한님의 ‘스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술’을 수강하고 작성하였습니다.

스프링 컨테이너에 빈 등록하기

컴포넌트 스캔

  • @Component 어노테이션이 있으면 스프링 빈으로 자동 등록
  • @Controller 어노테이션이 붙은 컨트롤러가 자동으로 스프링 빈에 등록된 것도 같은 이유
  • @Component를 포함하는 다음 어노테이션도 스프링 빈으로 자동 등록
    • @Controller
    • @Service
    • @Repository
  • 스프링은 컨테이너에 빈을 등록할 때 싱글톤을 기본으로 함

자동 의존관계 설정

@Controller
public class HelloController {

    private final MemberService memberService;

    @Autowired
    public HelloController(MemberService memberService) {
        this.memberService = memberService;
    }

    // ...(생략)
}
  • HelloControllerMemberService에 의존하는 관계
    • 예) HelloControllerMemberService를 통해 회원가입을 시키고 회원 조회를 함
  • 스프링 컨테이너에 MemberService를 등록하면, 하나의 MemberService로 여러 컨트롤러가 사용할 수 있음(싱글톤)
  • @Autowired로 생성자를 정의하면, 스프링이 MemberServiceHelloContainer를 연결
    • 생성자가 하나라면 생략 가능
  • 스프링이 MemberServiceHelloContainer를 연결하기 위해서는, 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);

    // ...(생략)
}

언제 사용하나?

  • 정형화된 컨트롤러, 서비스, 리포지토리에 사용

댓글남기기