해결된 질문
작성
·
399
·
수정됨
0
bean 등록 기준이 있을까요?
1안
public class ExcelExtractor {
private final File file;
public List<Data> excetued() {
// extract logic
}
}
2안
@Component
public class ExcelExtractor {
public List<Data> excetued(File file) {
// extract logic
}
}
1안은 스프링 빈 등록 없이 사용하는 코드입니다. 2안은 빈으로 등록하여 사용합니다.
빈으로 등록했을 때 장점은 의존성 주입을 통해서 어떤 객체를 의존하는지 한 눈에 알 수 있다고 생각합니다.
1안으로 사용하면 ExcelExtractor 객체는 서비스 클래스의 메소드 안에서 생성됩니다. 의존성이 숨겨져 있다고 생각합니다.
2안으로 사용하면 서비스 클래스 의존성에 ExcelExtractor을 추가해서 명시적으로 표시할 수 있습니다.
답변 1
1
빈(bean)은 스프링 컨테이너가 생성하고 관리하는 컴포넌트입니다. 애플리케이션을 구성하는 많은 오브젝트가 있는데 그 중에서 스프링이 직접 관리하는 대상인 것이죠.
그러면 어떤 경우엔 빈으로 만들고 어떨 때는 빈이 아닌, 그러니까 스프링이 아닌 내가 만든 코드에서 직접 관리하는(new로 만들어 사용하는) 오브젝트로 만드는 게 좋을까요?
기본적으로 어떤 오브젝트가 독립적으로 다른 오브젝트에게 기능을 제공하고 여러 오브젝트와 협력해서 일을 한다면 빈으로 등록하는 게 맞습니다. 이 빈에 의존하는, 즉 빈을 사용하는 오브젝트가 하나가 아니고 여럿인 경우, 또 이 빈이 의존하는 다른 오브젝트가 스프링의 빈으로 만들어진다면 해당 오브젝트는 빈으로 만들어야 합니다.
반면 어떤 오브젝트가 다른 빈으로 등록되는 클래스를 사용하지 않고, 즉 의존하지 않고, 다른 오브젝트 내부에서 매우 긴밀하게 사용되어질 때, 특히 이 오브젝트를 사용하는 클라이언트 오브젝트가 한 개인 경우에는 굳이 빈으로 만들지 않아도 됩니다.
코드를 보여주신 ExcelExtractor의 경우는 엑셀 파일을 제공하면 여기서 데이터를 추출해서 돌려주는 기능을 제공하고 있는데, 매우 범용적으로 사용 가능한 오브젝트로 보입니다. 이런 경우는 스프링의 빈으로 등록해서 사용하는 것이 좋아 보입니다.
예제 코드만 봐서는 알 수는 없지만, 각 기능이 오브젝트 내부의 상태 값을 변경하는 등의 고유한 상태를 가지고 있지 않는다면 하나의 오브젝트만 만들어지는 싱글톤으로 생성되는 것이 바람직한데, 이건 스프링 빈이 동작하는 방식이기도 합니다. 그런 면에서도 빈으로 등록해 사용하면 좋습니다. 굳이 상태를 유지할 필요가 없는데 이를 매번 new해서 사용하는 것은 낭비겠죠.
데이터를 추출하는 데 사용되는 다른 유틸리티성 빈 오브젝트를 사용하거나 데이터를 저장하는 다른 서비스를 활용한다면 역시 스프링의 빈으로 등록이 되어 DI로 의존 오브젝트를 받아올 필요가 있습니다.
특별한 다른 이유가 없다면 스프링의 빈으로 만들어 쓰는 것을 추천드립니다.