Spring 1-4. 스프링 빈과 의존관계

JG's Development Blog·2023년 1월 28일
0

Spring

목록 보기
5/10

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

  • 스프링 빈을 등록하는 첫번째 방법(자동)
  • 실제 html과 우리가 작업했던 서버 설정들을 이어주기 위해선 멤버 컨트롤러가 필요하다.
  • 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;
    }

}
  • 멤버 컨트롤러를 통해 멤버 서비스를 가져오는데 멤버 서비스는 다른 여러 군데에서 사용할 수 있으므로 new로 매번 생성할 필요 없이 하나만 생성해주면 된다.
  • 연결 방법
  1. 생성자(constructor)로 memberservice의 생성자를 만들어준다.
    (window 기준 alt+insert 단축키 이용)

  2. @Autowired
    스프링 컨테이너에 있는 Member Service, 즉 service파일의 MemberService와 생성자의 memberService와 연결시켜준다.

  3. 이것만으로는 memberservice를 찾지 못하여 오류가 발생한다.
    컨트롤러 같은 경우는 @controller 등의 annotation으로 스프링이 찾을 수 있지만 memberservice는 순수한 자바 코드로 이루어진 클래스이기 때문에 스프링이 찾을 수가 없다.
    따라서 MemberService 클래스 위에 @Service 라는 annotation을 넣어준다.

  4. 같은 원리로 구현체인 MemoryMemberRepository 클래스 위에 @Repository를 넣어준다.

  5. MemberController와 MemberService를 이어주었으니 MemberService와 MemoryMemberRepository도 똑같이 @Autowired로 이어준다.

  • 이 과정이 스프링 빈을 등록하는 2가지 방법 중에서 한가지인 컴포넌트 스캔 방식이다. (@Autowired와 같은 annotation 이용)

  • @Controller, @Service, @Repository를 살펴보면 그 속에 @Component가 붙어있는 것을 확인할 수 있다.

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


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

  • 스프링 빈을 등록하는 2번째 방법(수동)
  • 우선 이전 방법으로 설정했던 annotation을 전부 지운다.(membercontroller 제외)

  • hello.hellospring 패키지에 SpringConfig 클래스 생성 후 아래 코드 삽입
package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.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 MemoryMemberRepository();
    }
}
  • 스프링이 @Configuration을 인식하면 @Bean 다음에 있는 클래스들을 스프링 빈으로 등록한다.
    ※ 컨트롤러는 수동이 아닌 자동으로 등록해야함.

참고

  • DI에는 필드 주입, setter 주입, 생성자 주입 세가지 방법이 있다.
    우리는 이 중에서 생성자 주입을 사용하였다.
  • 필드 주입, setter 주입은 몇가지 문제가 있고 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.
  • 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
    그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

=> 현재 가상 시나리오는 '저장소가 정해지지 않아 바뀔 수 있으므로 구현체를 통하여 추후에 바꿀 수 있도록 설계'하였기 때문에 수동으로 스프링 빈으로 등록하여 간단하게 바꿀 수 있도록 설계한다.

※ 스프링 컨테이너, DI 관련된 자세한 내용은 스프링 핵심 원리 강의에서 설명한다.

강의 사이트
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

profile
왕왕왕초보

0개의 댓글