상세 컨텐츠

본문 제목

[스프링1] 섹션 4. 스프링 빈과 의존관계

23-24/Spring 1

by YUZ 유즈 2023. 9. 29. 14:02

본문

728x90

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에 주입을 해줍니다.

QUIZ

  1. Ioc 컨테이너에서 관리되는 자바 객체를 무엇이라고 합니까?
  2. ( ) 어노테이션을 의존성 주입을 자동화하기 위해 사용되며, 스프링이 관리하는 빈에서 다른 빈으로의 의존성을 자동으로 주입합니다.
  3. ( ) 어노테이션은 비즈니스 로직을 처리하는 서비스 빈을 표시한다.
  4. ( ) 어노테이션은 데이터 액세스 계층의 빈을 표시하며, 주로 데이터베이스와의 상호작용을 처리하는 데 사용됩니다.
  5. 스프링에서 빈을 직접 설정 파일에서 등록하기 위해 어떤 어노테이션을 사용하나요?
  6. Ioc 컨테이너는 스프링 빈을 등록할 때 기본적으로 ( )으로 등록한다.
  7. 직접 스프링 빈을 등록하기 위해서는 @Service, @AutoWired 와 같은 어노테이션을 삭제할 필요 없다.
    (O/X)
  8. 의존성 주입을 활용하기 위해 어노테이션을 사용하고자 합니다. 아래에 알맞는 어노테이션을 추가하십시오.
  9. public class CornerService { private final CornerRepository cornerRepository; public CornerService(CornerRepository cornerRepository) { this.cornerRepository = cornerRepository; } }
  10. 위 코드를 직접 스프링 빈으로 등록하고자 합니다. 아래 알맞게 코드를 작성하시오.(8번에 해당하는 부분만 작성할 것)
  11. @Configuration public class SpringConfig {

}

```

해당 포스트는 김영한, [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술], (2022, 11월 28일), 섹션 4. 스프링 빈과 의존관계 강의를 참고하여 작성하였습니다.

 

리미

728x90

관련글 더보기