본문 바로가기
웹 개발/Java Spring

스프링 빈(Spring Bean)

by 동배_ 2021. 8. 3.

스프링 빈은 Spring IOC 컨테이너가 관리하는 자바 객체를 Bean이라고 부른다.

spring bean을 IoC(Inversion of Control)에 등록하는 방법은 크게 두가지로 나뉜다

1. annotation을 이용한 방법(@Service , @repository, @Controller 등)

2. 빈 설정파일에 직접 등록하는 방법

내가 지금 공부하고 있는 스프링(김영한)강의 에서는 둘다 하는 방법을 알고 있어야 한다고 한다. 앞서 IoC, DI(의존성 주입) 이라는 개념을 숙지하고 이 것에 대한 것을 알고 있어야 한다 해서 글을 쓴다. 아마 이 글을 보시는 분은 IOC와 DI가 무엇인지 한번 숙지해보고 오길 바란다.

1. annotation을 이용한 방법

의존성 주입

스프링에서 컨테이너를 등록할때 컴포넌트와 관련된 annotation이 있으면 그 것들은 다 객체를 생성해서 스프링 컨테이너에 등록한다. 그리고

@Autowired를 통해 연관관계를 설정해준다.

의존성을 주입할때 setter , 생성자, 필드에서 설정하는 방법이 있는데 생성자를 통하는것을 권장한다 필드는 뭐 비효율적이라고 말하고

setter는 사실 처음 설정을 하면 바꿀일이 없다고 한다. 그래서 초기에 생성될때 실행되는 생성자를 통해 하는 것을 "권장"한다.

참고로 스프링은 스프링 컨테이너에 bean을 등록할때 기본적으로 싱글톤으로 등록한다. 한마디로 같은 스프링 빈이면 모두 같은 인스턴스 이다.

(싱글톤은 어떤 클래스가 최초 한번만 메모리를 할당하고(static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴이다( 메모리 낭비방지, 다른 클래스의 인스턴스들이; 데이터 공유 쉬움,하지만 너무 많아지면 결합도가 높아져 객체 지향 설계에 어긋난다)

2. 빈 설정파일에 직접등록하는 방법

직접 BEAN 등록

SpringConfig

이러한 식으로 SpringConfig라는 파일을 생성해 거기 안에 bean을 등록해준다 이때 주의 할점은 hellospring에 파일을 생성 해야한다 그 하위, 또는 다른 패키지내에 생성 할 경우 컨테이너에서 오인식해 제대로 등록이 되지 않는다.

하지만 1번 방법이 훨씬 편해보이는데 왜 2번과 같은 방법을 알아야할까??

그 이유는 보통 정형화된 컨트롤러, 서비스, 리포지토리 같은 경우는 기본적으로 탑재 돼있는 컴포넌트 스캔을 사용한다. 하지만

정형화 되지 않거나 상황에 따라 구현 클래스를 변경해야하면 스프링 빈으로 등록하는게 나중에 관리 측면에서 더욱 편리하다.

예를 들어 현재 듣는 강의 에서는 MemberRepository인터페이스를 구현하고 이 아래에 현재 MemoryMemberRepository가 구현돼 있는데 이것을 나중에 Memory가 아닌 DB로 변경하려고 할때 Bean을 직접 등록했다면 SpringConfig 내에 있는 MemoryMemberRepository값을 DBMemberRepository라고만 변경해주면 끝이기 때문이다.

댓글