230619_ Spring Bean

hoy_·2023년 6월 19일
0

Today, I Learned

목록 보기
21/36

1. 오늘의 일정

  1. Spring 숙련




2. 배운 내용

  1. Bean 등록하기

1-1. 자바 애너테이션(Java Annotation)을 사용하는 방법

  • @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해준다.

  • 일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋다.

    • 프로젝트의 규모가 커질 수록 등록할 Bean들이 많아지기 때문에 자동등록을 사용하면 편리함.
    • 비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리함.


1-2. Bean Configuration File에 직접 수동 등록하는 방법

@Configuration
public class HelloConfiguration {

    @Bean
    public HelloController sampleController() {
        return new SampleController;
    }
}

-------------


@Configuration
public class PasswordConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • Bean으로 등록하고자하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정한다.
  • Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정한다.



  1. Bean 수동 등록을 사용하는 순간은?
  • 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋다.
    • 공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동 등록 한다.
    • 비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않음.
    • 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있다.



  1. 같은 타입의 Bean이 2개라면?

Food food; 필드에 @Autowired를 사용하여 Bean 객체를 주입려고 시도했지만, food 타입의 객체가 하나 이상 존재하기 때문에 오류가 발생한다.

@Autowired는 기본적으로 Bean Type으로 DI를 지원, 이로 연결이 되지않을 경우 Bean Name으로 찾는다.

3-1. 해결방법

  • 등록된 Bean 이름 명시하기
	@Autowired
    Food pizza;

    @Autowired
    Food chicken;

    @Test
    @DisplayName("테스트")
    void test1() {
        pizza.eat();
        chicken.eat();
    }

    1. @Primary 애너테이션 사용
@Component
@Primary // 애너테이션 선언 - 기본값으로 사용
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

-----------

	@Autowired
    Food food;

    @Test
    @DisplayName("테스트")
    void test1() {
        food.eat();
    }

같은 타입의 Bean이 여러개 있더라도 Primary가 붙어있는 Bean 객체 우선 주입한다.


    1. @Qualifier 애너테이션 사용
@Component
@Qualifier("pizza") // 애너테이션 선언, 이름 지정
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

-----------

 	@Autowired
    @Qualifier("pizza")
    Food food;

    @Test
    @DisplayName("테스트")
    void test1() {
        food.eat();
    }
}
  • 같은 타입의 Bean들에 @Qualifier@Primary가 동시에 적용되어있다면 @Qualifier의 우선순위가 더 높다.
  • 하지만 @Qualifier는 주입 받고자하는 곳에 애너테이션을 반드시 추가해 주어야 한다.
  • 따라서 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 @Primary를 설정하고 지엽적으로 사용되는 Bean 객체에는 @Qualifier를 사용하는 것이 좋다.
profile
배우는 사람

0개의 댓글