스프링 입문 Section4. 스프링 빈과 의존관계

Bae YuSeon·2024년 4월 11일
1

spring스터디

목록 보기
4/15
post-thumbnail

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

지금까지 member service와 리포지토리를 만들고, member 객체를 만들어 가입, 저장, 불러오기 기능의 로직들을 만들었다. 이번 시간에는 화면을 붙여, 사용자가 보는 화면에 HTML을 뿌려주는 일을 하려고 한다. 이를 위해서는 Member Controller를 만들어야 한다. Member Controller가 member service를 통해 데이터를 조회할 수 있어야 한다. 이러한 것을 Member Controller가 member service를 의존하는 의존관계가 있다고 한다

회원 컨트롤러에 의존관계 추가
src/main/java/hello.spring/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;
 }
}

@Controller를 통해 컨트롤러가 스프링 빈에 등록!

그러나 이 상태에서 코드를 바로 실행하면 오류가 발생한다.
MemberController가 MemberService를 통해 기능을 수행해야 하므로 @Autowired를 통해 스프링 컨테이너에 있는 MemberService를 가져와야 하는데, 현재 스프링 컨테이너에는 memberService가 스프링 빈으로 등록되어 있지 않기 때문이다.

따라서 의존 관계가 정상적으로 작동하기 위해 MemberService도 스프링 빈에 등록해야 한다.

스프링 빈을 등록하는 2가지 방법
1. 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록하기

  • 컴포넌트 스캔 원리

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

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

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

      • @Controller
      • @Service
      • @Repository

회원 서비스 스프링 빈 등록
java/hello/hellospring/service/MemberService.java 파일을

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

이렇게 수정한다.

회원 리포지토리 스프링 빈 등록
java/hello/hellospring/repository/MemoryMemberRepository.java 파일을

@Repository
public class MemoryMemberRepository implements MemberRepository {}

이렇게 수정한다.

그러면 아래 그림처럼

memberService 와 memberRepository 가 스프링 컨테이너에 스프링 빈으로 등록된다.

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

스프링 빈을 등록하는 방법 2가지 중 하나인 1. 컴포넌트 스캔과 자동 의존관계 설정은 방금 직접 해 봤고, 또 다른 방법인 2. 자바 코드로 직접 스프링 빈 등록하기를 실습한다.

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고 진행해야 한다.

java/hello/hellospring/SpringConfig.java 파일을 새로 만들고 직접 연결하는 코드를 작성한다.

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 어노테이션
    • 스프링 컨텍스트에서 관리할 빈을 정의하는 메서드 위에 사용
    • 각 메서드는 스프링 컨텍스트에 하나의 빈을 정의하고, 해당 빈을 반환해야 함
  • memberService() 메서드
    • 이 메서드는 MemberService 빈을 정의
    • MemberRepository를 생성하는 memberRepository() 메서드를 호출하여 MemberService 객체를 생성
    • memberRepository() 메서드에서 반환된 MemoryMemberRepository 객체는 MemberService의 생성자에 전달되어, MemberService 객체를 초기화할 때 주입
  • memberRepository() 메서드
    • 이 메서드는 MemberRepository 빈을 정의
    • MemoryMemberRepository 객체를 생성하여 반환

이렇게 하면 아까 위에 그림처럼 memberService 와 memberRepository 가 스프링 컨테이너에 스프링 빈으로 등록된다.

0개의 댓글

관련 채용 정보