[Spring] Spring Bean

soohee·2023년 4월 2일
1

Spring

목록 보기
9/13
post-thumbnail

Bean이란?

Spring은 DI를 사용하여 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입시켜주는 방식을 사용한다.
이 DI를 통해 모듈간의 결합도는 낮아지고 유연성은 높아지게 된다.
Spring에서는 이 객체를 Bean이라고 부르며, 프로젝트가 실행될 때 Bean 컨테이너가 객체를 생성해준다.

Spring에서 객체 실행 순서

  1. 객체 생성
  2. 제어권을 스프링에 위임하여 스프링이 만들어놓은 객체를 주입
  3. 의존성 객체 메서드 호출

이 때, Bean은 Default로 싱글턴 패턴으로 만들어진다.

Singleton패턴의 단점

Bean을 singleton패턴으로 만들면, 먼저 단점이 있다.

  1. 다형성을 적용하지 못한다.

  2. 안정성이 필요한 프로젝트에서 단위 테스트가 어렵다.
    → 테스트의 순서에 따라 결과가 달라짐.

그럼 Spring IoC 컨테이너는 Bean을 어떻게 관리할까?

  1. Spring IoC 컨테이너 생성되면 → Bean Scope가 Singleton인 객체 생성
  2. 이 때, Bean으로 등록하기 위해서 Annotation/Java Config/Xml 기반으로 Bean definition을 생성
  3. 이를 활용해 평범한 자바 객체로 Bean을 생성
  4. 컨테이너 속 Singleton Registrydptj Bean 객체를 key-value 형식으로 저장 ( Key : Bean 이름 / Value : 객체 )
  5. 해당 객체 설정이 되면, IoC 컨테이넌는 의존 설정을 해줌
    (의존성 자동 주입 발생)
  6. 사용 전 초기화 과정이 필요한 객체를 초기화함

→ 이 과정을 거치고 나면 Bean으로 등록된 객체를 사용할 수 있게 됨.
→ 컨테이너가 종료되면 Singleton으로 설정된 객체들도 소멸됨

Bean 설정시 주의점

1. Bean 상태 유지 문제

만약 Bean이 상태값을 가지게 된다면, Bean 상태가 똑같이 유지되지 못하는 단점을 가지고 있다.
예를들어, Thread 1은 value를 증가시키고, Thread 2는 value를 조회하는 로직이 수행된다면, 이는 실행 순서에 따라 값이 달라질 수 있다.
따라서 Singleton으로 생성된 객체는 상태값을 가질 수 없다.

그러나, Prototype으로 Bean Scope을 설정해주면, IoC 컨테이너와 함께 생성/소멸되는 것이 아니라 요청일 올때마다 생성/소멸되기 때문에 상태값을 가질 수 있도록 할 수 있다.

대신 호출한 객체의 상태가 다를 수 있다!

2. 의존성을 자동 주입해야 할 인터페이스의 구현체가 두 개 이상이라면 충돌

이럴 때는 의존성을 주입해야할 구현체가 1개라면 @Primary를 써줌으로써 해결할 수 있다.

혹은, 상황에 따라 다르게 주입되게 하고 싶으면 @Qualifier을 사용해서 설정할 수 있다.

정리

Spring Bean이 필요한 이유

스프링 IoC 컨테이너가 특정 객체의 라이프사이클을 알아서 관리해준다.

Spring IoC 컨테이너가 Bean을 관리하는 이유

  • 의존성을 사용하는 로직에만 집중 가능
  • 의존성이 주입될 객체가 싱글 오브젝트임을 보장할 수 있음.

결론

소프트웨어공학프로그램 강의 수강시, 객체 생명주기를 그려서 확인했던 경험이 있는데..
Spring은 알아서 IoC 컨테이너가 관리해주고, 의존성 주입도 해주니까 되게 편하다라는 것을 느꼈다.

profile
🐻‍❄️

2개의 댓글

comment-user-thumbnail
2023년 4월 3일

좋은내용이네요. 정말 예전에, 인터페이스 구현체가 2개여서 문제가 생긴적이 있었던 생각이 납니다.
그런데, 저 2개가 웹어플리케이션 동작시, 둘 다 사용되지는 않는 것이 맞나요 ? 코드상으론 그렇게 보이네요. 궁금하네용

답글 달기
comment-user-thumbnail
2023년 4월 3일

Spring Bean은 무상태로 값을 유지하지 않고 바로 반환하는 부분을 잘 설명해주셨네요.
@Qualifier 어노테이션이 @Primary 어노테이션보다 우선순위가 높다는 점도 언급하면 좋을 것 같아요!

답글 달기