[Spring] 스프링 빈과 의존관계

Gerry·2022년 4월 25일
0

스프링 입문

목록 보기
5/9
post-thumbnail

스프링 빈

👀 IoC(Inversion of Control)

  • IoC(제어권의 역전)은 컴포넌트 의존관계 설정(Component dependency resoulution), 설정(Configuration) 및 생명주기(LifeCycle)을 해결하기 위한 디자인 패턴입니다.
  • 이 IoC가 적용된 경우에는 객체의 생성과 생명주기 관리까지 모든 객체에 대한 제어권을 특별한 관리자가 맡게되는데, 이 관리자를 IoC 컨테이너라고 부릅니다.

스프링 빈이란?

  • 스프링 프레임워크는 스프링 IoC 컨테이너를 가지고 있으며 이 스프링 IoC에 의해 생성되고 관리되는 자바 객체를 빈(Bean)이라고 부릅니다.
  • 스프링은 스프링 IoC 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록합니다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스입니다.


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

💻 회원 컨트롤러에 의존관계 추가

우선 /hello.hellospring/controller 하위에 MemberController 를 생성합니다.
회원 컨트롤러가 회원 서비스를 의존하고 있기 때문에 아래와 같이 작성해 의존관계를 추가해줍니다.

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • @Controller 어노테이션이 적용된 클래스는 컨트롤러임을 나타내며 빈으로 등록됩니다.
  • @Autowired 는 필요한 의존 객체의 타입에 해당하는 빈을 스프링 IoC 컨테이너가 찾아서 주입해주는 어노테이션입니다.

💻 회원 서비스 빈 등록

회원 컨트롤러가 의존하고 있는 memberService 를 찾아 주입해주기 위해 memberService@Service 어노테이션을 이용해 빈으로 등록해줍니다.

@Service
public class MemberService {

    private final MemberRepository memberRepository;

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

💻 회원 리포지토리 빈 등록

회원 서비스도 회원 리포지토리를 의존하고 있기에 다음과 같이 @Repository 어노테이션을 사용해 스프링 빈으로 등록해줍니다.

@Repository
public class MemoryMemberRepository implements MemberRepository {}

컴포넌트 스캔

  • 컴포넌트 스캔은 @Component 어노테이션을 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정을 말합니다.
  • @Component 외에 @Controller , @Service , @Repository , @Configuration 어노테이션도 컴포넌트 스캔대상에 포함됩니다.


직접 스프링 빈 등록하기

💻 설정파일 작성

주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔방식을 사용하지만, 정형화 되지 않거나 상황에 따라 구현 클래스를 변경해야 하면 직접 설정을 통해 스프링 빈으로 등록합니다.
위에서 작성한 @Service , @Repository , @Autowired 어노테이션을 제거하고 /hello.hellospring/SpringConfig.java 파일을 생성해 다음과 같이 작성해줍니다.

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • @Bean 어노테이션을 통해 memberRepository 를 스프링 빈에 등록하고 memberService 에 주입해줍니다.
  • memberService 도 마찬가지로 스프링 빈에 등록되며 컴포넌트 스캔방식으로 빈에 등록된 memberController 에 주입됩니다.

👉 스프링 빈 의존관계

아래와 같이 memberControllermemberService 를 의존하고 있고 memberServicememberRepository 를 의존하고 있는 모습을 볼 수 있습니다.

🙏 이 포스트는 김영한 개발자님의 <스프링 입문 강의> 를 듣고 공부한 내용을 바탕으로 작성되었습니다.

1개의 댓글

comment-user-thumbnail
2022년 9월 2일

감사합니다..!

답글 달기