Spring Bean 등록을 해보자

하윤철·2024년 7월 17일

Spring Bean 등록하기

Bean 등록 ⇒ "이 클래스 만들어놨으니, 객체 만들어서 컨테이너에 넣고 관리해줘"

  1. @Conponent
  2. @Configuration + @Bean

2가지 방법이 있다.

아래와 같이 House Class를 만들고 Bean 등록을 해보았다.

@Component
public class House {
    private String name;

    public House() {
        this.name = "A House";
        System.out.println("집이 생성되었다");
    }

    public String getName() {
        return name;
    }
}

@Component

@Component 를 사용하면 알아서 Bean 등록을 해준다. 다음은 빈 등록 후 실행 시킨 결과이다.

먼저 WebApplicationContext (컨테이너)가 생성된 후 Bean 객체가 생성되어 “생성되었다”가 출력 되는 것을 볼 수 있다.

즉, 객체를 생성하지 않고 Bean 등록만 해도 객체가 알아서 생성 된 것을 볼 수 있다.

💡Tip
1. SpringBoot에서는 xml파일로 Bean 관리를 하던 것을 @(Annotation)으로 대체하였다.
2. default 설정은 Application 보다 상위 패키지는 Component Scan을 하지않는다.

Bean을 생성했다면 이제 사용해보자.

DI

Person

@Component
public class Person {
    private House house;

    public Person(House house) {
        this.house = house;
        System.out.println(house.getName() + " 라는 집을 샀다");
    }
}

여기서 실행을 시키면 Person에 House를 넣지도 않았는데 알아서 “A House”를 출력하는 것을 볼 수 있다.

어떻게 내가 등록한 객체를 주입 시킨걸까?

DI의 3가지 방법

생성자 주입

위의 예제에서 사용한 방법이다.

		@Autowired // 얘가 생략되었던 것
    public Person(House house) {
        this.house = house;
        System.out.println(house.getName() + " 라는 집을 샀다");
    }

생성자 위에 @Autowired 를 붙여 선언하며

생성자를 사용하는 방법이 좋은 이유는 필수적으로 사용해야하는 의존성 없이는 객체를 만들지 못하도록 강제할 수 있기 때문이다. (생성자가 실행되어야 객체가 생성되니깐.)

  • @Autowired 는 생략이 가능하다. (생성자가 하나 이상이면 명시 필수)

💡그럼 어떻게 알맞는 객체를 찾아서 넣어주는걸까?
1. 컨테이너에 등록된 빈의 타입을 통해 찾는다. ⇒ 만약 인터페이스라면 타입이 겹치지 않을까?
2. 그럼 등록된 Bean 이름으로 직접 찾자!

필드로 주입

@Component
public class  Person{
    @Autowired
    private House house;
}
  • SRP 원칙을 위반하기에 왠만하며 사용하지 말자.
  • 외부에서 접근이 불가능하여 테스트 코드 작성이 어렵다.

Setter 주입

@Component
public class  Person{
    private House house;
    
    public void setHouse(House house){
    	this.house = house; //setter로 주입
    }
}

set~(){} 메서드를 통해 주입하는 것

  • 외부에서 Setter를 통해 쉽게 내부 필드에 접근 후 값을 변경 할 수 있기에 사용을 자제하자.

결론

생성자 주입을 사용하자!

  • 의존관계 설정은 한번만 일어나기 때문에 변경되면 안된다.
  • final로 선언을 하더라도 Setter는 변경이 가능하기에 쓰지말자
profile
선순환을 만드는 개발자

0개의 댓글