Backend/Spring

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

Dlawoct 2025. 3. 2. 00:01
728x90
인프런 김영한의 스프링 입문을 듣고 작성한 글입니다

 

 

멤버 컨트롤러가 멤버 서비스를 통해 회원가입하고, 데이터를 조회 할 수 있다 

이런 관계를 의존 관계라고 한다

우리는 회원 컨트롤러가 회원 서비스와 리포지토리를 사용할 수 있도록 의존관계를 준비 해보자

 

 

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

일단 들어가기 전에 컴포넌트 스캔과 자동 의존관계 설정이 뭘까?

컴포넌트 스캔은 스프링이 특정 패키지를 탐색하며, 특정 어노테이션(여기서는 @Controller) 이 붙은 클래스를 자동으로 스프링 빈으로 등록하는 기능이다

그럼 스프링 빈은 뭘까?
스프링 빈은 스프링 컨테이너가 관리하는 객체를 의미한다
new 키워드를 통해서 직접 생성하는 것이 아닌 스프링이 대신 생성하고 관리하는 객체를 의미한다
예전에 helloController를 만들었을 때 사진은 참고하면 이해하기가 더 쉬울 것 같다!

자동 의존관계 설정은 @Autowired과 같은 어노테이션을 사용해 스프링 빈(객체)들 간의 의존 관계를 자동으로 주입하는 기능이다

 

자 이렇게 기본적으로 개념을 알아봤고 구현으로 넘어가보자

package hello.hello_spring.controller;

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

@Controller
public class MemberController {

    private final MemberService memberService;

    // Autowired가 있으면 스프링 컨테이너에 있는 memberService를 가져와 연결 시켜준다
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

- 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 저번 시간에 공부했던 DI, 의존성 주입이라 한다

- 이전 테스트에선 우리가 직접 주입했었고, 여기에선 @Autowired를 사용해 스프링이 주입해준다는 차이가 있다

 

하지만 실행해보면 아래와 같은 오류가 뜨게 된다

Consider defining a bean of type 'hello.hello_spring.service.MemberService' in your configuration.

 

그 이유는 바로 memberService를 스프링 빈으로 등록하지 않았기 때문이다

memberService 클래스를 들어가보면 순수한 자바 코드일 뿐이여서, 스프링이 알 길이 없기 때문이다

 

그래서 memberService에는 @Service를, memoryMemberRepository에는 @Repository를 추가 해주었다

컨트롤러, 서비스, 리포지토리 이렇게 정형화된 패턴이라고 볼 수 있다

컨트롤러를 통해서 외부 요청을 받고, 서비스에서 비지니스 로직을 만들고, 리포지토리에서 데이터를 저장하는 정형화된 패턴이다

정상적으로 스프링 빈을 생성하고 의존관계를 만들면 위 이미지와 같은 구조가 완성된다고 보면 된다

 

스프링 빈을 등록하는 방법은 두가지가 있는데

하나는 우리가 지금 한 애노테이션으로 스프링 빈에 자동으로 등록시키고, 의존관계를 설정한 방법이고 

하나는 다음 단계에서 할 직접 스프링 빈을 등록하는 방법이다

 

 

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

package hello.hello_spring;

import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MeomoryMemberRepository;
import hello.hello_spring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

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

    @Bean
    public MemberRepository memberRepository() {
        return new MeomoryMemberRepository();
    }
}

SpringConfig 클래스를 새로 만들어 위와 같이 코드를 짜줬다

 

그러면 아래 이미지와 같은, 아까 이전 단계에서 애노테이션으로 구현했던 기능 똑같이 사용할 수 있게 된다

 

 

728x90