ACHO.pk devlog

[Springboot] 스프링 빈과 의존관계 본문

프레임워크/Springboot

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

Acho 2023. 1. 21. 16:44

인프런 김영한 강사님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술"의 강의를 듣고 학습하였습니다.


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

회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비

 

 

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

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

▹컴포넌트 스캔 : 스프링이 스프링 빈(Bean)으로 등록될 준비가 된 클래스들을 스캔하여 빈(Bean)으로 등록해주는 과정

@Configuration, @Service, @Repository, @Controller,  등의 어노테이션에도 전부 @Component이 포함되어 있어 자동으로 컴포넌트 스캔의 대상이 된다. 

 내 프로젝트인 Springboot.study 패키지 하위의 패키지에는 스프링이 스캔을 한다.

 

② 자바 코드로 직접 스프링 빈 등록하기

 

 

컴포넌트 스캔 원리

 @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.

 @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

@Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.

    ▹@Controller

    ▹@Service

    ▹@Repository

 

 

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

① controller 폴더 하위에 "MemberController" 클래스를 생성한다.

스프링 컨테이너MemberController 객체를 생성해서 스프링에 넣어두고, 관리를 한다.

 

 

② MemberController 클래스 내부의 코드를 작성한다.

MemberService를 통해 회원가입을 하고, 회원을 조회할 수 있어야한다.

즉, MemberController가 MemberService를 의존한다 == 의존관계에 있다 !

package Springboot.study.controller;

import Springboot.study.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;

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

 @Autowired : 스프링이 연관된 객체스프링 컨테이너에서 찾아서 넣어준다.

    ▹MemberController가 생성될 때 스트링 빈에 등록되어 있는 MemberService 객체를 가져다 넣어준다. 

    ▹ 이렇게 객체 의존관계를 외부에서 넣어주는 것 DI (Dependency Injection), 의존성 주입이라 한다. 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다.

 

 

private final MemberService memberservice = new MemberService();

 ▹ 위와 같은 코드도 가능하지만, new 연산자를 사용해서 생성하게 되면 MemberController 이외에도 다른 컨트롤러에서 MemberService를 가져다 사용할 수 있다.

 ▹ 스프링 컨테이너에 등록을 하고 사용하면 하나만 등록이 된다.

 

 

에러

 Consider defining a bean of type 'Springboot.study.service.MemberService' in your configuration

MemberService가 스프링 빈으로 등록되어 있지 않아서 그런 것이다. 

이를 해결하기 위해 MemberService에는 @Serivce 어노테이션을, MemberRepository에는 @Repository 어노테이션을 추가해주면 된다.

스프링이 해당 어노테이션을 확인하고 스프링 컨테이너에 MemberService와 MemberRepository를 등록해준다. 

   

 

③ MemberService와 MemberRepository에 각각 어노테이션을 추가하고, MemberService에는 @AutoWired 어노테이션을 추가해준다.

@Service
public class MemberService {
    private final MemberRepository memberRepository;
    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

 

 참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.

 

Comments