[SpringBoot] 스프링 빈 등록 (컴포넌트 스캔, 직접 등록)

Woong·2022년 9월 13일
1

Java

목록 보기
17/21
  • controller : Web MVC controller 역할
  • service : 핵심 비즈니스 로직 구현
  • repository : DB 접근, 도메인 객체를 DB 저장, 관리
  • domain : 비즈니스 도메인 객체
    • 회원, 주문, 쿠폰 등
    • DB에 저장, 관리됨

component 스캔 방식

  • 어노테이션이 있으면 스프링 빈으로 자동 등록되는 방식

    • @Component, @Serivce, @Repository, @Controller
  • @Controller 어노테이션이 있으면, 스프링 시작시 객체를 생성하여 스프링 컨테이너에서 컨트롤러 관리

  • 생성자에 @Autowired 가 있으면 연관된 객체를 스프링 컨테이너가 직접 의존관계를 외부에서 주입해준다 (Dependency Injection)

    • 연관된 객체도 어노테이션을 지정해 스프링 빈으로 등록줘야한다.
      • 스프링 빈으로 등록하지 않으면 동작하지 않는다.
    • 생성자 주입 권장. 필드 주입과 setter 주입은 권장하지 않음.
      • 의존관계가 실행 중 동적으로 변하는 일은 거의 없고, setter 노출에 의한 문제로.
  • @SpringBootApplication 이 있는 메인 패키지와 하위 패키지에 대해서 스캔

    • 다른 패키지 스캔 필요시 별도 설정 필요
  • 스프링 빈 등록시, 기본적으로 싱글톤으로 등록

    • 하나만 등록하여 공유
  • Controller -> Service -> Repository 주입 예시

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
}
@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
@Repository
public class MemoryMemberRepository implements MemberRepository {

    private static ConcurrentHashMap<Long, Member> store = new ConcurrentHashMap<>();
    private static long sequence = 0L;
    ...
}

스프링 빈 직접 등록 (component 스캔 없이)

  • @Configuration 어노테이션으로 Config 클래스 정의
  • @Bean 어노테이션으로 스프링 빈을 직접 정의
    • @Contoller 의 경우 component 스캔으로 처리
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();
    }
}

0개의 댓글