SPRING 입문 [ 코드로 배우는 스프링 부트 ]

[스프링 입문] 섹션 4.1 스프링 빈과 의존관계 (컴포넌트 스캔과 자동 의존관계 설정)

wlalsu_u 2023. 1. 10. 04:53

4.1.0  스프링 빈을 등록하는 방법

 

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

: 정형화된 Controller / Service / Repository 구현시 사용

 

2) java 코드로 직접 스프링 빈 등록

: 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 할 때 사용

 


 

4.1.1  스프링 빈 등록과 의존관계 설정

 

 

Spring 에서는 Controller 가 외부 요청을 하고,

Service 에서 비즈니스 로직을 작성하고,

Repository 에서 저장을 하는,

 

정형화된 패턴이 있음을 알 수 있다.

 

 

따라서,

앞서 섹션 3에서 만든 Service 와 Repository를 화면에 연결하기 위해서는,

Member Controller 를 작성해야 한다.

 

 

MemberController 가 MemberService 를 통해 회원가입하고,

MemberService 를 통해 Repository 데이터를 조회할 수 있는 기능을 만들어 보고자 한다.

 

 

 

 

 

이를 위해서는,
MemberController - MemberService - MemoryMemberRepository 가 서로 연결되어야 한다.

 

 

 

이러한 관계는, Controller, Service, Repository가 서로 의존관계에 있다고 말한다.

 

 

 


 

 

 

 

먼저, src  >  main  >  java  > hello.hellospring  >  controller 패키지

 

MemberController 클래스를 다음과 같이 작성하였다.

 

 

 

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;
    }

}

 

 

 

MemberController 클래스 코드를 하나씩 살펴보자.

 

 

 

@Controller

 

스프링이 처음 시작되면,

스프링 컨테이너 틀이 생성된다.

 

 

이때, Controller annotation 이 작성되어 있으면, 

MemberController 객체를 생성하고,

자동으로 스프링에 넣어두고 관리한다.

 

 

이를, ' 스프링 컨테이너에서 스프링 빈이 관리된다 ' 라고 말한다.

 

 

 

@Autowired

 

 

private final MemberService memberService = new MemberService();

 

 

memberService 객체를 생성할 때,

아래와 같이 'new' 를 사용해서 생성할 수도 있을 것이다.

 

 

하지만 이러한 방식은

다른 Controller 가 MemberService 를 사용할 때마다, 새로운 instance를 계속 생성한다는 문제점이 있다.

 

 

따라서, MemberService 를 스프링 컨테이너에 한 번 등록하고,

스프링 컨테이너에서 받아 쓸 수 있도록 관리하고자 한다.

 

 

+ 참고 )
스프링 컨테이너에 스프링 빈이 등록될 때, 기본적으로 싱글 톤으로 등록된다
즉 유일하게 하나가 등록 된 후, 공유된다.

 

 

 

이때, 스프링 컨테이너에서 받아 사용할 수 있도록 연결하기 위해,

Autowired 를 사용할 수 있다.

 

 

 

@Autowired 를 사용하여,
스프링 컨테이너에 있는 MemberService 를 가져와서 연결할 수 있다.

 

 

 

 


 

4.1.2  컴포넌트 스캔

 

 

앞서 4.1.1 에서 작성한 코드를 실행하면, 오류가 발생한다.

 

이는 MemberService 가 순수한 자바 클래스 이므로, 스프링이 인식할 방법이 없기 때문이다.

 

따라서 다음과 같은 특정한 annotation 을 상단에 작성하여,

스프링이 스프링 서비스를 등록할 수 있도록 해야 한다.

 

 

다음과 같은 애노테이션이 있으면, 
스프링이 시작되고 스프링 컨테이너에 자동으로 등록된다.

@ Component 애노테이션 : 스프링 빈에 자동 등록
@ Controller / @Repository : 컴포넌트 스캔 때문에 스프링 빈에 자동 등록

 

 

 

 

또한 앞선 예제와 동일하게, 

MemberService 와 MemberRepository 가 연결되어야 하므로,

 

@Autowired 도 추가로 작성한다.

 

 

 

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository){

        this.memberRepository = memberRepository;
    }

 

 

 

동일하게, MemoryMemberRepository 상단에는 Repository annotation 을 추가한다.

 

 

 

@Repository
public class MemoryMemberRepository implements MemberRepository

 

 

 

이제, helloController - MemberService - MemoryMemberRepository 가 모두 연결되었다.

 

 

 

메인 메소드를 실행시켜보면, 

다음과 같이 정상 동작 하는 것을 확인 할 수 있다.

 

 

 

 

 

 

 

 

 

+ 추가 ) 기본적으로, hello.hellospring 포함 하위 패키지만 컴포넌트 스캔을 진행한다.

              따라서, 모든 @Component 를 실행시키지 않는다.

 

 

 

 

 

 

김영한 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 기반으로 작성하였습니다.

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