StudyRepository
article thumbnail
728x90

 

 

 

 

 

이번 시간엔 자바 코드로 직접 스프링 빈에 등록하는 법을 배워보겠습니다.

 

 

 

먼저, SpringConfig라는 파일을 하나 만들어주겠습니다.

 

@Configuration이라는 애노테이션을 써보겠습니다.

 

package hello.hellospring.service;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService(){
        return new MemberService();
    }
}

 

이 코드를 실행하면 Configuration을 읽고, @Bean애노테이션으로 인해 스프링이 "아! 스프링 빈에 등록하라는 말이구나!"

라고 인식합니다.

 

즉 memberService가 스프링 빈에 등록됩니다.

 

이 때 memberService생성자에 무엇인가를 넣어줘야하는데 이땐 command+p를 사용하여 무엇을 넣어줘야하는지 알 수 있습니다.

 

MemberRepository를 넣어주라고 하네요

 

 

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

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

코드를 이렇게 수정해주겠습니다.

 

이렇게 해주면 처음과 같이 @Bean을 읽고 memberService와 memberRepository를 스프링에 등록해 주고,

return new MemberService(memberRepository());

이 코드로 인해 스프링빈에 등록되어있는 memberRepository를 memberService에 넣어줍니다.

 

 

 

 

물론 @Service를 사용하는게 더 편하긴 하지만 

각각의 장단점이 있기 때문에 상황에 맞게 사용해주시는게 좋습니다.

 

 

 

위 코드를 보시면 생성자를 통해 memberService가 memberController에 주입이 되고 있는데 이것을 '생성자 주입'이라고 부릅니다.

 

 

 

 

@Controller
public class MemberController {
    @Autowired private MemberService memberService;

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

 

위 코드는 '필드 주입'이라는 것인데 필드에 바로 의존 관계를 주입하는 방법입니다. IntelliJ에서 필드 인젝션을 사용하면 Field injection is not recommended이라는 경고 문구가 발생합니다. 추천하는 방법은 아닙니다.

 

 

 

 

 

@Controller
public class MemberController {
    private MemberService memberService;

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

 

위 코드는 setter주입 이라는 것인데 필드 값을 변경하는 Setter를 통해서 의존 관계를 주입하는 방법입니다. Setter 주입은 생성자 주입과 다르게 주입받는 객체가 변경될 가능성이 있는 경우에 사용합니다.

 

생성은 생성대로 되고, setter는 나중에 호출이 되서 memberservice가 들어옵니다.

 

setter injection의 안좋은점은 아무 개발자나 호출할 수 있도록 열려있다는 점입니다.

개발은 최대한 호출하지 않아야 할 메소드는 호출하지 않아야 좋습니다.

 

 

 

이처럼 Spring 프레임워크와 같은 DI 프레임워크를 이용하면 다양한 의존성 주입을 이용하는 방법이 있는데, 이에 대해서는 다음 시간에 자세히 다뤄보도록 하겠습니다.

 

 

 

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용합니다.

그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록합니다.

 

 

 

 

 

728x90
profile

StudyRepository

@Minseo26262

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!