[Spring]Spring bean 개념과 생성 원리

HelloWorld·2022년 11월 3일
3

a knowing

목록 보기
3/3

스프링 빈(Spring Bean)이란?

Spring IoC 컨테이너가 관리하는 자바 객체
Spring에서는 직접 new를 이용하여 생성한 객체가 아니라, 필요한 객체를 생성하고 생성한 객체에 의존을 주입한다. Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라 한다.

new 연산자로 어떤 객체를 생성한 것은 빈이 아님
ApplicationContext.getBean()으로 얻어질 수 있는 객체가 빈

✔️ 제어의 역전(Inversion of Control)이란?
일반적으로 처음에 배우는 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성하고 조작하는 작업을 한다.
(즉, 모든 작업을 사용자가 제어한다.)

public class Student {
	private int age;
    private String name;
    
    public Student(String name, int age) {
    	this.name = name;
        this.age = age;
    }
}
Student student = new Student("Tom", 22);

하지만, IoC가 적용된 경우 객체를 사용자가 직접 생성하지 않고, 객체의 생명주기를 Spring IoC 컨테이너가 컨트롤 하도록 한다.

Spring Bean 사용 이유

스프링에서는 각각의 자바 클래스들이 의존관계를 가지고 있다.
MVC 구조에 따라 설계를 하면, 먼저 Model 클래스를 만들고, Model 객체를 담는 Repository 클래스를 구현한다. 또한 Repository에 인덱싱하기 위한 Service 클래스, Service를 통해 Model이 담겨 있는 Repository에 접근하기 위한 Controller 클래스가 있다.

웹 프로그래밍은 멀티유저에 대한 동시성 제어가 중요하기 때문에 이를 위해 스프링 컨테이너에서는 싱글톤 패턴으로 관리한다.

✔️ 싱글톤패턴(Singleton Pattern) 이란?
객체의 인스턴스가 오직 1개만 생성되는 패턴
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이며 이후에 호출된 생성자는 최초의 생성자가 객체를 리턴하는 것

자주 사용하는 객체를 싱글톤 패턴으로 생성해 둔 후, 필요할 때 언제든 사용 가능하다.
즉, 매번 요청 시마다 빈 객체를 생성하는 것보다 한 번 생성해 둔 후 사용하는 것이 서버의 성능에 훨씬 좋기 때문에 사용한다.

또한 의존성 주입과 라이프사이클 관리에도 용이하기에 빈을 등록하여 사용한다.

Spring Bean을 Spring IoC Container에 등록하는 방법

1) 자바 어노테이션(Java Annotation)을 사용하는 방법

ㄱ) @ComponentScan

어느 지점부터 컴포넌트를 찾으라고 알려주는 역할이다.
@ComponentScan이 붙어있는 클래스가 있는 패키지에서부터 모든 하위 패키지의 모든 클래스를 훑어 보며 @Component이 붙은 클래스를 찾는다.

ㄴ) @Component

자동으로 스프링 빈으로 등록됨
@Controller, @Service, @Repository 들은 @Component를 포함하고 있다.

2) 빈 설정파일(Bean Configuration File)에 직접 Bean 등록하는 방법

자바 클래스를 생성해서 작성 가능(일반적으로 xxxConfiguration으로 명명)

@Configuration
public class SpringConfig {

	@Bean
    public MemberService memberService() {
    	return new MemberService();
    }
}

@Configuration 안에 @Component를 사용하기 때문에 @ComponentScan의 스캔 대상이 된다.
그에 따라 빈 설정 파일이 읽힐 때 그 안에 정의된 빈들이 IoC 컨테이너에 등록된다.

의존관계 설정

스프링 빈을 등록한다고 해서 의존관계가 설정되는 것은 아니고, 싱글톤 객체로 생성되어 관리되는 클래스들의 의존관계를 설정해주어야 한다.

1) 자동 의존관계

컴포넌트 스캔을 통해 스프링 빈을 등록했을 경우, 클래스 생성자에 @Autowired를 명시해주면 된다.

@Service
public class MemberService {

	private final MemberRepository memberRepository;
    
    @Autowired
    public MemberService(MemberRepository memberRepository) {
    	this.memberRepostiory = memberRepository;
    }
    
    //이후 서비스 관련 코드
    ...
}

2) 수동 의존관계

Configuration을 통해 직접 빈을 등록할 경우, 실제 클래스의 구현된 생성자의 형태와 동일하게 Configuration에서도 객체를 리턴해주면 된다.

@Configuration
public class SpringConfig {

	@Bean
    public MemberService memberService() {
    	return new MemberService(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepostiory() {
    	return new MemberRepository();
    }
}

0개의 댓글