TIL 11-14

거북·2023년 11월 14일

TIL

목록 보기
8/22

1.Bean을 사용하는 이유

객체지향적 언어인 Java를 사용하다 보면 new키워드를 통해 객체를 생성했던 경험이 다들 있을 것이다. 스프링 프레임워크 에서는 이를 자동으로 생성해주고 관리하는데 이렇게 스프링에 의해서 생성된 자바 객체들을 Bean이라고 부른다. 쉽게 말해서 일일히 new를 사용해가며 객체를 생성해주는 일을 대신 해주는 것이다!

2.Bean을 등록해보자

  1. Bean을 등록하고자 하는 객체를 반환하는 메서드를 선언하고 그 위에 @Bean을 달아준다.
  2. Bean을 등록하는 메서드가 속한 클래스에 @Configuration을 설정해준다.
@Configuration
public class PasswordConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

이렇게 간단하게 Bean을 등록해줄 수 있다!
참고로 Bean의 이름은 위 코드의 경우에 passwordEncoder이다.

3. 같은 타입의 Bean?!?!

Bean은 기본적으로 타입마다 하나씩만 등록해서 공유한다. 그렇다면 같은 타입의 다른 객체는 어떻게 등록할까? 아래 예제를 통해 알아보자
Food.java

package com.sparta.springauth.food;

public interface Food {
    void eat();
}

Chicken.java

package com.sparta.springauth.food;

import org.springframework.stereotype.Component;

@Component
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

Pizza.java

package com.sparta.springauth.food;

import org.springframework.stereotype.Component;

@Component
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

다음과 같이 Bean이 등록되어 있는 상황이다. 이 때 이렇게 Food food 필드에 Autowired를 사용하여 객체를 주입하면 어떻게 될까?

@SpringBootTest
public class BeanTest {

    @Autowired
    Food food;
    
}

에러가 발생한다!! 스프링이 Bean 두개 중에 무엇인지 구분 할 수 없기 때문이다.

이를 해결하기 위해선 등록된 Bean 이름을 명시해 주어야 한다.

@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;
    
    @Autowired
    Food chicken;
    
}

이렇게 선언해주면 정상적으로 동작함을 확인할 수 있다

0개의 댓글