필기노트

Spring 스프링 빈을 등록하는 2가지 방법과 의존관계 본문

김영한 강의 요약

Spring 스프링 빈을 등록하는 2가지 방법과 의존관계

우퐁코기 2023. 1. 14. 17:25
반응형
목차
1. 자바 코드로 직접 스프링 빈 등록하기
2. 컴포넌트 스캔과 의존관계 자동 주입
3. @Component 를 포함하는 다른 애노테이션
4. 조회 빈이 2개 이상 -> 오류
5. 자동, 수동의 올바른 실무 운영 기준

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

1) @Configuration

AppConfig에 설정을 구성한다는 뜻의 @Configuration 을 붙여준다.

각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다. 

스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용한다.

여기서 @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.

이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다. 

스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. ( memberService , orderService )

@Configuration
public class AppConfig {

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
}

 

2) Test 시 의존관계 수동 주입하는 방법

DiscountPolicy discountPolicy;

@BeforeEach
public void beforeEach() {
    AppConfig appConfig = new AppConfig();
    discountPolicy = appConfig.discountPolicy();
}

 


2. 컴포넌트 스캔과 의존관계 자동 주입

스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.
또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. 

 

1) @ComponentScan 

@ComponentScan 은 @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다.

이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.

빈 이름 기본 전략: MemberServiceImpl 클래스 memberServiceImpl 

 

2) @Autowired 의존관계 자동 주입 

의존관계도 자동으로 주입하는 @Autowired 

생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다. 

 

3) Test 시 의존관계 자동 주입하는 방법

@SpringBootTest
public class MemberServiceTest {

    @Autowired
    MemberService memberService;

@SpringBootTest는 스프링 부트가 제공하는 스프링 컨테이너를 사용해서 실행하는 방법입니다.

@SpringBootTest를 사용하면 @SpringBootApplication이 있는 CoreApplication을 찾아서 사용합니다.

그리고 이렇게 찾은 @SpringBootApplication 안에는 @ComponentScan이 존재합니다.

이곳의 package 위치는 hello.core이기 때문에 우리가 작성한 전에 애플리케이션 코드가 컴포넌트 스캔의 대상이 됩니다.

여기에는 @Configuration도 포함됩니다.

 


3. @Component 를 포함하는 애노테이션, 스프링 빈으로 자동 등록된다.

• @Controlller : 스프링 MVC 컨트롤러에서 사용, 스프링 MVC 컨트롤러로 인식

 

 @Service : 스프링 비즈니스 로직에서 사용

 

 @Repository : 스프링 데이터 접근 계층에서 사용, 데이터 계층의 예외를 스프링 예외로 변환해준다.

 

 @Configuration : 스프링 설정 정보에서 사용, 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다.

 


4. 조회 빈이 2개 이상 -> 오류

스프링 빈을 수동 등록해서 문제를 해결해도 되지만,

의존 관계 자동 주입에서 해결하는 여러 방법이 있다. (@Autowired 필드 명, @Qualifier, @Primary)

@Autowired 는 타입(Type)으로 조회한다.

타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다.

DiscountPolicy 의 하위 타입인 FixDiscountPolicy , RateDiscountPolicy 둘다 스프링 빈으로 선언해보자.

그리고 이렇게 의존관계 자동 주입을 실행하면

오류메시지가 친절하게도 하나의 빈을 기대했는데 fixDiscountPolicy , rateDiscountPolicy 2개가 발견되었다고 알려준다.

 

 

기존 코드 

@Autowired
private DiscountPolicy discountPolicy

 

필드 명을 빈 이름으로 변경 

@Autowired
private DiscountPolicy rateDiscountPolicy

@Autowired 먼저 타입 매칭을 시도 하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가

매칭한다.

 


5. 자동, 수동의 올바른 실무 운영 기준 

편리한 자동 기능을 기본으로 사용하자

직접 등록하는 기술 지원 객체는 수동 등록

 

무 로직 빈: 웹을 지원하는 컨트롤러, 핵심 비즈니스 로직이 있는 서비스, 데이터 계층의 로직을 처리하는 리포지토리등이 모두 업무 로직이다. 보통 비즈니스구사항을 개발할 때 추가되거나 변경된다.

 

업무 로직은 숫자도 많고, 한번 개발해야 하면 컨트롤러, 서비스, 리포지토리 처럼 어느정도 유사한 패턴이 있다. 이런 경우 자동 기능을 적극 사용하는 것이다. 보통 문제가 발생해도 어떤 곳에서 문제가 발생했는지 명확하게 파악하기 쉽다.

 

기술 지원 빈: 기술적인 문제나 공통 관심사(AOP)를 처리할 때 주로 사용된다. 데이터베이스 연결이나, 공통 로그 처리 처럼 업무 로직을 지원하기 위한 하부 기술이나 공통 기술들이다. 

 

기술 지원 로직은 업무 로직과 비교해서 그 수가 매우 적고, 보통 애플리케이션 전반에 걸쳐서 광범위하게 영향을 미친다. 그리고 업무 로직은 문제가 발생했을 때 어디가 문제인지 명확하게 잘 드러나지만, 기술 지원 로직은 적용이 잘 되고 있는지 아닌지 조차 파악하기 어려운 경우가 많다. 그래서 이런 기술 지원 로직들은 가급적 수동 빈 등록을 사용해서 명확하게 드러내는 것이 좋다. 

 

애플리케이션에 광범위하게 영향을 미치는 기술 지원 객체는 수동 빈으로 등록해서 딱! 설정 정보에 바로 나타나게 하는 것이 유지보수 하기 좋다. 

 

비즈니스 로직 중에서 다형성을 적극 활용하는 비즈니스 로직은 수동 등록을 고민해보자 

 

 


REFERENCE

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

반응형
Comments