[스프링 입문] - 스프링 빈과 의존관계(1)

stephanie·2022년 10월 9일
0

스프링 입문

목록 보기
11/13

컴포넌트 스캔과 자동 의존 관계 설정

전에 만든 서비스, 리포지토리, 도메인 등을 화면에 붙이고 싶다!
=> 컨트롤러, View 등 필요
=> 그러기 위해서는 멤버 컨트롤러가 필요한데, 멤버 컨트롤러는 멤버 서비스와 멤버 리포지토리를 사용할 수 있어야 한다. = 의존 관계

  • 멤버 서비스를 통해서 회원 가입, 데이터 조회
    => 멤버 컨트롤러가 멤버 서비스를 의존한다.

controller 하위에 MemberController 클래스를 생성한다.

  • 스프링 컨테이너가 스프링 창에 뜰 때 MemberController 객체를 생성해서 스프링에 넣어두고, 스프링이 관리하게 된다.
  • @Controller라는 annotation을 보고 Spring이 뜰 때 Controller들을 객체로 생성해서 spring이 들고 있는다.
    => 스프링 컨테이너에서 스프링 빈이 관리 된다.

스프링 컨테이너가 스프링 빈을 관리하기 때문에 컨트롤러의 기능이 동작하는 것!

new 해서 쓰지 말고, 스프링으로부터 받아서 써야 한다!

  • 다른 여러 서비스들이 MemberController를 쓸 수 있다.
  • 그런데 특별한 기능이 없기 때문에 굳이 매번 새로 만들 필요가 없다.
    => 하나 생성해서 공유해 쓰면 된다.
  • 스프링 컨테이너에 등록하고 쓰면 된다.
    => 하나만 사용 가능

@Autowired annotation을 넣고, 생성자를 만들어준다.
=> 스프링이 멤버 서비스를 스프링 컨테이너에 있는 멤버 서비스와 연결해 준다.

@Service annotation을 넣으면 스프링이 MemberService를 컨테이너에 등록해준다.

구현체에도 @Repository annotation을 달아 준다.
=> Controller, Service, Repository의 정형화된 패턴을 만든다.

  • 컨트롤러를 통해 외부 요청을 받고
  • 서비스에서 비즈니스 로직을 만들고
  • 리포지토리에서 데이터를 저장한다.

=> 이렇게 해 놓으면 스프링이 뜰 때 Controller, Service, Repository를 다 가지고 올라온다.

Controller, Service, Repository 연결하기 위해서는 @Autowired를 쓰면 된다.
이를 사용하면 멤버 컨트롤러가 생성될 때, 스프링 빈에 등록되어 있는 멤버 서비스 객체를 넣어준다.
=> Dependency Injection
싱글톤: 같은 스프링 빈이면 같은 인스턴스를 넣어준다 -> 메모리 절약

MemberService에도 @Autowired 적어주면 스프링 컨테이너가 뜰 때 멤버 서비스를 컨테이너에 등록하고, 생성자를 호출한다.
이때 @Autowired를 보고 스프링 컨테이너에 있는 멤버 리포지토리를 넣어준다.
지금은 MemoryMemberRepository가 구현체로 있기 때문에 이를 서비스에 주입해준다.
=> Controller, Service, Repository가 연결된다.

스프링 빈을 등록하는 방법 (1)

  1. annotation 활용해서 한 것: 컴포넌트 스캔
  • 사실은 @Controller가 아니라 @Component이다.
    => @Component 안에 들어가면 @Controller, @Service 등이 있다.
  • 스프링이 올라올 때 Component와 관련된 annotation이 있으면 모두 객체로 하나씩 생성해서 스프링 컨테이너에 등록하고, @Autowired는 연관 관계를 생성해 준다.

=> 컴포넌트 스캔과 자동 의존 관계

** hello.hellospring 패키지를 포함한 하위 패키지들만을 대상으로 annotation을 보고 스프링이 가져 온다.

0개의 댓글