Web/Spring

[Spring] 김영한 스프링 입문 강의 정리 #12 스프링 빈과 의존관계(컴포넌트 스캔과 자동 의존관계 설정)

도탱 2023. 1. 9. 14:04

인프런 스프링 입문 강의 정리 #12 스프링 빈과 의존관계(컴포넌트 스캔과 자동 의존관계 설정)

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

- 스프링 컨테이너

spring이 실행될 때 스프링 컨테이너가 생김

이 때 @Controller가 있다면 MemberController객체를 생성하여 spring에 해당 객체를 넣어두고 관리

 

 HelloController 클래스

@Controller를 보고 spring이 HelloController 객체를 생성하여 관리

이거를 스프링 컨테이너에서 스프링 빈이 관리된다고 표현

 

 

- spring container

MemberController가 MemberService를 사용해야 함

@Controller
public class MemberController {
    private final MemberService memberService = new MemberService();
}

new를 사용해서 쓸 수 있음

but spring이 관리를 하게 되면 다 스프링 컨테이너에 등록을 해야 하며 스프링 컨테이너로부터 받아서 쓰도록 바꾸어야 함

 

스프링 컨테이너에 등록을 하고 사용 (하나만 등록됨)

* 스프링은 스프링 컨테이너에 스프링 빈 등록 시 싱글톤(유일하게 하나만 등록해서 공유)으로 등록

* 같은 스프링 빈이면 모두 같은 인스턴스

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

다른 Controller에서도 MemberService를 가져와 사용 가능

 

package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

    private final MemberService memberService;

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

생성자를 호출할 때 @AutoWired가 있으면 spring이 스프링 컨테이너에 있는 memberService를 가져와 연결을 시켜줌

 

코드를 실행하면 memberService를 찾을 수 없다는 오류 발생

memberService가 스프링 컨테이너에 스프링 빈으로 등록되어있어야 연결 가능

but memberService는 순수한 java class이기 때문에 스프링 빈으로 등록되어있지 않음

 

@Service
public class MemberService {
...
}


@Repository
public class MemoryMemberRepository implements MemberRepository {
...
}

애노테이션을 붙여줌

 

 memberController와 memberService 연결 => @AutoWired

(memberController가 생성될 때 스프링 빈에 등록되어있는 memberService 객체를 가져와 넣어줌)

Dependency Injection(DI) = 의존관계 주입

 

memberService는 memberRepository 필요

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    ...
}

memberService가 생성될 때 스프링 컨테이너에 등록하며 생성자 호출

생성자를 호출할 때 @AutoWired가 있으면 spring이 스프링 컨테이너에 있는 memberRepository를 넣어줌

(MemoryMemberRepository 구현체를 MemberService에 주입)

 

 

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

 스프링 빈 등록 방식 : 컴포넌트 스캔과 자동 의존관계 설정, 자바 코드로 직접 스프링 빈 등록

컴포넌트 스캔 : 애노테이션(@) 사용

(@Service, @Controller, @Repository의 내부 코드를 보면 @Component 애노테이션이 있는 것을 알 수 있음)

spring이 올라올 때 @Component와 관련된 애노테이션이 있으면 객체를 하나씩 생성하여 스프링 컨테이너에 등록, @Autowired는 연결해주는 역할 (memberController와 memberService 연결, memberServicememberRepository 연결)

 

@Component : 스프링 빈으로 자동 등록

@Controller : 컨트롤러가 스프링 빈으로 자동 등록 => 컴포넌트 스캔 때문

@Component를 포함하는 애노테이션도 스프링 빈으로 자동 등록 (@Service, @Controller, @Repository)

 

* 컴포넌트 스캔은 main 메서드가 있는 package의 하위만 스캔, 등록