13 컴포넌트 스캔

bourbon·2021년 12월 21일
0

Spring

목록 보기
14/14
post-thumbnail

의존관계

  • ControllerService를 통해 회원가입을 하고 데이터를 조회할 수 있다.

  • 이를 '컨트롤러가 서비스에 의존하고 있다'고 표현하며, '의존관계가 있다'고 할 수 있다.


@Autowire

hello-spring/src/main/java/hello.hellospring/controller/MemberController.java

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
    // ...
}
  • 생성자에 @Autowire가 있으면 스프링이 연관된 스프링 컨테이너에서 찾아서 넣어준다.
  • 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 즉 의존성 주입이라고 한다.
  • 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다.

@Controller

Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
  • MemberService가 스프링 빈으로 등록되어 있지 않아 위와 같은 오류 발생시, @Controller가 있으면 helloController는 스프링이 제공하는 컨트롤러에서 스프링 빈으로 자동 등록된다.

  • @Controller으로 컨트롤러를 만들어 두면 스프링 부트가 실행될 때 스프링 컨테이너가 해당 '컨트롤러 객체'를 생성해 스프링 컨테이너에 넣어 두고, 해당 객체는 스프링이 관리하는 대상이 된다. 이를 '스프링 컨테이너에서 스프링 빈이 관리된다' 고 한다.

  • 스프링에 의해 관리되도록 하려면, 그 대상을 스프링 컨테이너에 등록해야 하며, 사용할 때도 스프링 컨테이너로부터 받아서 쓰도록 설계해야 한다. 즉, 사용할 객체를 매번 new로 만드는 것 보다, 한 번만 만들어서 스프링 컨테이너에 등록해 두는 것이 더 효율적이고 스프링에서 제공하는 여러 기능들도 사용할 수 있다.


스프링 빈을 등록하는 2가지 방법

  • 컴포넌트 스캔과 자동 의존관계 설정
    - @Component가 있으면 스프링 빈으로 자동 등록된다.
    - @Component를 포함하는 @Controller(외부요청 받음), @Service(비즈니스 로직을 만들고 수행), @Repository(데이터 저장)도 스프링 빈으로 자동 등록된다.
  • 자바 코드로 직접 스프링 빈 등록하기 (다음 강의)

hello-spring/src/main/java/hello.hellospring/service/MemberService.java

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    // ...
}
  • 생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다.
  • 생성자가 1개만 있으면 @Autowired는 생략할 수 있다.

hello-spring/src/main/java/hello.hellospring/repository/MemoryMemberRepository.java

@Repository
public class MemoryMemberRepository implements MemberRepository {
	// ...
}
  • MemberControllerMemberService에, MemberServiceMemberRepository에 의존한다.

  • MemberServiceMemberRepository는 스프링 컨테이너에 스프링 빈으로 등록된다.


싱글톤

  • 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. (유일하게 하나만 등록해서 공유함)

  • 같은 스프링 빈이면 모두 같은 인스턴스다.

  • 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.


profile
Do things that don't scale

0개의 댓글