[스프링] 스프링 빈과 의존관계

PYOUNANI·2023년 9월 26일
0

Spring

목록 보기
4/31
post-thumbnail
📢 김영한님이 지음, 
[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 강의를 정리한 글입니다.

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

📌 IOC(Inversion of Control)?

  • 스프링 프레임워크에는 객체를 생성하고 관리하고 책임지고 의존성까지 관리해주는 컨테이너가 있는데 이를 IoC 컨테이너라고 합니다.

📌 스프링 빈이란?

  • 스프링 프레임워크는 스프링 IoC 컨테이너를 가지고 있으며 이 스프링 IoC에 의해 생성되고 관리되는 자바 객체를 빈(Bean)이라고 부릅니다.
  • 스프링은 스프링 IoC 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록합니다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스입니다.

💻 회원 컨트롤러에 의존관계 추가
우선 /hello.hellospring/controller 하위에 MemberController 를 생성합니다.
MemberControllerMemberService를 의존을 하고 있기 때문에 의존관계를 추가해줍니다.

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}
  • @Controller 어노테이션은 적용이 된 클래스가 컨트롤러임을 나타내는 빈으로 등록이 되게 됩니다.
  • @Autowired 는 스프링 IoC 컨테이너가 의존 객체에 해당하는 빈을 찾아서 의존성을 주입해주는 어노테이션입니다.

👀 의존성 주입이란?

  • 객체가 의존하는 또 다른 객체를 외부에서 선언하고 이를 주입받아 사용하는 것이다.
  • 의존성을 주입하는 방법으로는 객체를 생성할 때 생성자를 통해 전달하는 방식과 Setter() 메소드를 통해 전달하는 방식이 있습니다.
  • 의존성 주입을 이용하면 주입받는 대상이 변하더라도 기존 구현자체를 수정할 일이 없어 재사용성이 높아집니다.

💻 회원 서비스 빈 등록
MemberController가 의존하고 있는 MemberService를 찾아서 주입을 해주기 위해서는
MemberService@Service 어노테이션을 추가해 빈으로 등록을 해줘야 합니다.

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

💻 회원 리포지토리 빈 등록
MemberServiceMemoryMemberRepository을 의존을 하고 있기 때문에 MemoryMemberRepository에도 @Repository 어노테이션을 이용해 빈으로 등록해줍니다.

@Repository
public class MemoryMemberRepository implements MemberRepository {}

📌 컨포넌트 스캔

  • 컴포넌트 스캔은 @Componet 어노테이션을 가진 모든 대상을 가져와서 빈을 등록하기 위해 찾는 과정을 뜻합니다.
  • @Controller , @Service , @Repository , @Configuration 모두 코드 내부에 @Component이 들어가 있으므로 컴포넌트 스캔 대상에 포함됩니다.

2. 직접 스프링 빈 등록하기

위와 같은 방식말고도 직접 설정을 통해 스프링 빈으로 등록할 수 있는 방법이 있다.
위에서 작성한 @Service ,@Repository , @Autowired 어노테이션을 제거하고 /hello.hellospring/SpringConfig.java 파일을 생성해 다음과 같이 작성해줍니다.

@Configuration
public class SpringConfig {

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

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • @Bean 어노테이션을 통해 MemberRepository를 스프링 빈으로 등록을 하고 MemberService에 주입을 해줍니다.

0개의 댓글