spring - 입문3

» BE

인프런 김영한님 스프링 입문 강의를 듣고 정리한 내용입니다
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#

스프링 빈과 의존관계

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

스프링 빈(Spring Bean)

  • Spring 컨테이너가 관리하는 자바 객체
  • 스프링 빈으로 등록을 해야 Spring 컨테이너가 인식할 수 있음

스프링 빈 등록 방법

  1. 어노테이션을 활용한 컴포넌트 스캔과 Autowired 설정
  2. 자바 코드로 직접 스프링 빈 등록하기

Image

  • memberController 에서는 memberService 객체를 사용
  • memberService 에서는 memberRepository 객체를 사용

1. 어노테이션을 활용한 컴포넌트 스캔과 Autowired 설정

controller/MemberController.java

@Controller
public class MemberController {
    private final MemberService memberService;

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

@Controller 어노테이션을 달면 MemberController라는 객체를 만들어서 스프링에 넣어서 관리 = 스프링 컨테이너에 스프링 빈으로 등록
@Autowired가 있으면 스프링이 스프링 컨테이너에 있는 memberService를 가져다가 연결
-> MemberController 객체가 생성될 때 스프링 빈으로 등록된 memberService 객체를 가져다가 넣어줌 = DI(의존관계 주입)


service/Memberservice.java

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
    //생략..
}

✅ 그냥 MemberService 는 스프링 빈에 등록 안 된 순수한 자바 클래스라서 @Service 어노테이션을 달아줘야 스프링 컨테이너에 스프링 빈으로 등록


📌 cmd + option + b 로 구현체로 navigate

repository/MemoryMemberRepository.java

@Repository
public class MemoryMemberRepository implements MemberRepository{
	// 생략 ..
}

✅ 이것도 @Repository 어노테이션을 달아줘야 스프링 컨테이너에 스프링 빈으로 등록


📌 컴포넌트 스캔 범위

spring.hello.spring/HelloSpringApplication.java

package spring.hello.spring;

메인함수가 속한 패키지까지만 스프링이 스캔(여기선 hello.hellospring만)


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

컨트롤러는 그대로 두고 @Service, @Repository지우기

SpringConfig.java 생성

@Configuration
public class SpringConfig {

	@Bean //스프링 빈 등록
	public MemberService memberService() {
		return new MemberService(memberRepository()); //memberService는 memberRepository 사용하도록 함
	}

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

📌 Bean 등록 경우

  • 정형화된 코드(컨트롤러, 서비스, 리포지토리)는 컴포넌트 스캔을 쓰는 것이 편리
  • 정형화되지 않거나 상황에 따라 구현 클래스를 변경해야 하면 직접 스프링 빈을 등록하는 것이 편리