Spring

Bean

늦은산책 2023. 3. 22. 23:55

Bean 이란?

Bean이란 스프링 컨테이너에 등록한 객체들을 말한다.

그럼 스프링 컨테이너는 무엇인가? 스프링에서 객체를 생성할때 스프링 컨테이너에 생성하게 되는데 그렇게 들어간 객체들은 독립적이지 않고 상호작용하게 되는데 이를 "객체의 의존성"이라고 하고 그 객체들의 보관소 역할을 하는것이 컨테이너이다.

한번 더 말하자면 그 넓은 컨테이너 안에 들어가 있는 것(객체)들을"Bean"이라고 한다.

 

 

Bean을 등록하는 두가지 방법

1. 컴포넌트 스캔과 자동 의존관계 설정

스프링 부트에서 사용자 클래스를 스프링 빈으로 등록하는 가장 쉬운 방법은 클래스 선언부 위에 @Component어노테이션을 사용하는 것이다.

@Controller, @Service, @Repository는 모두 @Component를 포함라고 있는 어노테이션이다.

위에 어노테이션을 선언하는 것 자체가 @Component를 사용하고 있다는 뜻이다.

 

2. 자바 코드로 직접 스프링 빈 등록

수동으로 스프링 빈을 등록 할 수 있다.

단, 수동으로 등록하려면 자바 설정 클래스를 만들어 사용해야 한다.

설정 클래스를 만들고 @Configuration 어노테이션을 사용하고 특정 타입을 리턴하는 메소드를 만들고, @Bean어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다.

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository);
    }
    
    @Bean
    public MemberRepository memberRespository() {
        return new MemoryMemberRepository();
    }
}

 

어노테이션 하나로 해결되는 1번이 많이 사용되고 있지만, 2번 방법 또한 아주 좋은 방법이다

각자의 장단점 때문인데 

1번은 간단하지만 바꿀때 일일히 바꿔 주어야 하고 

2번은 따로 하나하나 만들어 줘야하지만 수정이 매우 간단하다.

 

@Bean 어노테이션의 주요 내용

  • @Configuration 설정된 클래스의 메소드에서 사용가능
  • 메소드의 리턴 객체가 스프링 빈 객체임을 선언함
  • 빈의 이름은 기본적으로 메소드의 이름
  • @Bean(name="name")으로 이름 변경 가능
  • @Scope를 통해 객체 생성을 조정할 수 있음
  • @Component 어노테이션을 통해 @Configuration없이도 빈 객체를 생성할 수 있음
  • 빈 객체에 init(),destroy()등 라이프 사이클 메소드를 추가한 다음 @Bean에서 지정할 수도 있음

 

@Autowired

위에서 말했듯이 Bean은 객체를 스프링 컨테이너에 넣어주는 역할이다.

하지만 객체는 의존성에 의해 움직인다고 말했듯이 의존성을 주입해줄 무언가가 필요한데 그것이 바로 @Autowired이다.

의존성을 주입하는 @Autowired의 사용법은 밑에 태그에서 알아보자

https://latewalk.tistory.com/60