[Spring] Bean, 빈

Jeanine·2022년 6월 19일
0

backend

목록 보기
3/3
post-thumbnail

1. Bean이란?

Spring 공식문서에 의하면,

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC (Inversion of Control) container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
-> Spring IoC에 의해 관리되며, 애플리케이션의 중추를 이루는 객체

📍 Spring IoC (Inversion of Control)?
A process in which an object defines its dependencies without creating them
-> 어떤 객체가 의존성을 직접 생성하지 않고도 정의할 수 있는 과정

Bean을 등록할 때는 싱글톤 (유일하게 하나만 등록해서 공유함)
-> 같은 Bean이면 모두 같은 인스턴스


2. 코드로 보는 Bean

1) Spring Boot 프로젝트 시작

  • @SpringBootApplication: 해당 패키지에 있는 모든 Bean 탐색 (@ComponentScan 사용)
@SpringBootApplication
public class BasicBeansApplication {
	public static void main(String[] args) {
    	SpringApplication.run(BasicBeansApplication.class, args);
        
        // 생성되는 모든 Bean들을 보고 싶다면 아래처럼
        // ApplicationContext apc = SpringApplication.run(BasicBeansApplication.class, args);
        // for (String s : apc.getBeanDefinitionNames()) {
        // 	 System.out.pringln(s);
        // }
    }
}

결과 화면은 아래와 같다.

2) 새로운 Bean 생성

  • at(@) annotation 사용
  • @Component: 이걸 선언하면 Bean으로 인식되고, @ComponentScan에 의해 인식됨
    • 이름을 지정해주고 싶다면, @Component(value="mycomponent")
    • 개발자가 직접 작성한 클래스를 Bean으로 등록하려 할 때 사용
    • 하위 어노테이션: @Service, @Controller, @Repository
    • 사용 예시는 아래 코드 참고
@Component
public class Customer {
	private String name;
    private Address address;
    
    public Customer(String name, Address, address) {
    	this.name = name;
        this.address = address;
    }
    
    // getter, setter 생략
}
  • @Bean
    • 이름을 지정해주고 싶다면, @Bean(name="myBean")
    • 개발자가 직접 제어할 수 없는 외부 라이브러리를 Bean으로 등록하려 할 때 사용
    • 사용 예시는 아래 코드 참고
@SpringBootApplication
public class BasicBeansApplication {
	public static void main(String[] args) {
    	SpringApplication.run(BasicBeansApplication.class, args);
    }
}

// 이렇게 Bean으로 등록을 해놓으면, 원할 때에 String이 초기화됨
@Bean
public String getName() {
	return "Jeanine";
}

📍 아래와 같이 @Service, @Repository 없이 직접 Bean 등록을 할 수 있다.
(Config 파일은 @SpringBootApplication이 정의되어 있는 파일과 같은 위치에 생성)

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

3) Bean 의존성 주입

  • @Autowired
    • 클래스 안에서 다른 클래스로 정의된 Bean을 사용하고 싶을 때 선언
    • 객체가 여러 개라면 @Qualifier("Bean이름")를 선언
    • 사용 예시는 아래 코드 참고
@Component(value="addressbean")
public class Address {
}

@Component
public class Customer {
	private String name;
    
    @Qualifier("addressbean")
    @Autowired
    private Address address;
    
    // 아래는 생략
}

3. 정리

Spring에서 Bean이란 Spring 컨테이너에 의해 관리되는 클래스의 인스턴스


참고:

profile
Grow up everyday

0개의 댓글