나도 스프링 부트를 사용해보자! - 스프링 빈과 의존관계

출처
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
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
김영한 강사님

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

회원 컨트롤러가 회원 서비스와 회원 리포지토리를 사용 할 수 있게 의존 관계를 만들어 보자!

@Controller라는 어노테이션을 들고 있는 순간 스프링 컨테이너에서 관리를 하기 시작함.

사실 Controller에서

private final MemberService memberService = new MemberService();

이렇게 MemberService를 선언해서 사용 할 수도 있지만 다른 컨트롤러단에서도 new MemberService를 통해 새롭게 객체를 생성해서 사용 할 수도 있음. 그러면 컨트롤러단 마다 새로운 객체 MemberService가 나타나게 됨. 이것은 너무 비효율적인 방법이다!

이 문제를 해결하기 위해서 하나만 등록해놓고 공용으로 사용하기 위해서 스프링 컨테이너에 등록을 해놓고 사용 할 수 있다!

@Autowired 어노테이션을 이용해서 의존성 관계를 적용해준다.

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

그 전에! memberSerivce를 스프링 빈에 등록을 해주어야 한다.

@Component: 스프링 컨테이너가 올라올 때 이 어노테이션을 가지고 있는 애들을 객체로 가지고 있음
@Autowired: 연관 관계를 설정 해줌

@SpringbootApplication과 같은 위치에 있는 파일들에 대해서만 컴포넌트 스캔이 가능하다.

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본적으로는 싱글톤으로 등록한다! ..갑자기 생각나는 TestBean1...

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

✨중요
컴포넌트 스캔 방식으로 자동으로 하는 것이 아니라 직접 하나 하나 소중하게 스프링 빈에 등록하는 방식이다.

@Configuration
public class SpringConfig {

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

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

@Bean 어노테이션을 통해서 스프링 컨테이너에 빈으로 등록해준다.
@Controller의 경우에는 어쩔 수 없이 컴포넌트 스캔 형식이기 때문에 @Autowired 형식을 이용해줘야 한다.

✨ XML로 설정하는 방식도 있지만 최근에는 잘 사용하지 않는다!!! 이게 내가 쓰던건데!!! (충격 진실)

DI에는 생성자 주입, 필드 주입, setter 주입이 있다.
필드는 사용 거의 하지 않고
setter의 경우에는 public 한 setter를 이용해서 다른 친구들을 set 해버릴 수 있기 때문에 주의한다.
요즘에는 생성자 주입을 많이 이용한다.

주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 사용!
정형화되지 않거나 상황에 따라 변경이 필요한 경우 스프링 빈으로 등록한다.
예를 들어 MemroyMemberRepositoryMysqlMemberRepository로 변경해야 하는 경우! 기존 코드에는 아애 손을 대지 않고 설정을 통해서 변경이 필요한 경우! @Configuration 파일을 통해서 내가 직접 관리하는 것이 좋다.

@Autowired를 통한 DI는 스프링이 관리하는 객체(ex: controller, @Service 어노테이션을 달고 있는 서비스)에서만 동작을 하고 내가 직접 new를 통하여 생성한 객체와 같은 경우에는 동작하지 않는다.

정리하면서 듣느라 생각보다 속도가 나지는 않지만..
꾸준하게 계속 듣자..

좋은 웹페이지 즐겨찾기