스터디코딩

컴포넌트 스캔과 자동 의존관계 설정(DI) 본문

SpringBoot/inflearn - 스프링 입문

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

퓨처디벨로퍼 2021. 6. 30. 17:02

Dependancy injection(DI, 의존관계 주입)

1. 생성자 주입

2. 필드 주입 - 바뀔 여지가 없다는 단점

3. setter 주입 - public으로 항상 열려있어야한다는 단점

@Controller

멤버 컨트롤러가 멤버 서비스를 통해서 회원가입 등을 한다. 이것을 의존관계가 있다고 한다.

@Controller
public class MemberController {

   /* private final MemberService memberService = new MemberService();
   *  new하면 여러 controller들이 memberService를 가져다 쓰며 여러개를 쓰게됨. 그럴필요없이
   * 공유하자!
   * */
    
    //1. 생성자 주입(권장)
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
    
     //2. 필드 주입
    @Autowired private final MemberService memberService;
    
    //3. setter 주입
    private final MemberService memberService;

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

  • @Controller : 스프링이 뜰때 스프링 컨테이너란 통이 생긴다. @Controller가 있으면 MemberController 객체를 생성해서 스프링에 넣어두고 관리한다. 이것을 스프링 컨테이너에서 스프링 빈이 관리된다고 한다.
  • @Autowired : 스프링 컨테이너에서 멤버 서비스를 가져온다. 스프링 컨테이너 등록된 것들만 사용시 동작한다.
  • MemberController가 생성될 때, spring been에 등록된 memberService 객체를 가져다가 넣어준다.

 

@Service

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
}
    • new를 이용하여 여러개를 쓰지않고 공유한다 -> @Service이용하여 스프링 컨테이너 등록.
    • @Service : 스프링이 서비스임을 알고 등록시켜준다.
         

@Repository

@Repository
public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }
}

 

  • @Repository : 스프링이 repository임을 알고 등록시켜준다.

 

결과

컴포넌트 스캔

  • @Service, @Controller, @Repository => @Component 사용가능
  • 컴포넌트 관련 @가 있으면 객체를 하나씩 생성해서 컨테이너 등록.
  • @autowired는 연관관계, 선을 연결해준다.
  • HelloSpringApplication을 실행시키는데, 여기 부터 시작해서 package hello.hellospring,포함해서 하위들은 자동으로 스프링이 다 뒤져서 스프링 빈으로 등록. 하위패키지가 아닌 것은 스프링 빈으로 컴포넌트 스캔 안함. 기본적으로 대상이 안됨. @componentScan이 있어야함.
  • 싱글톤으로 등록

 

Controller 통해서 외부 요청 받고 Service에서 비즈니스 로직을 만들고,  Repository에서 data를 저장한다. 

 

Comments