본문 바로가기

백엔드

[Spring Boot] 스프링 빈 (Spring Bean) & 스프링 컨테이너 (Spring Container)

728x90

Udemy 스프링부트 강좌로 학습한 내용을 바탕으로 합니다.

스프링 컨테이너를 배우기 전에 스프링빈 (Spring Bean) 이랑 자바객체 에 대해 알아보자

/* 자바 객체*/

아래의 간단한 자바 코드들을 한번 보자

public interface GamingConsole{
    void up();
} //인터페이스

 

public class MarioGame implements GamingConsole {
    @Override
    public void up() {
    System.out.println("Mario UP")
    }
} //GamingConsole 상속

 

public class PacmanGame implements GamingConsole{
    @Override
    public void up(){
    System.out.println("Pacman UP");
    }
} //GamingConsole 상속

 

 

public class GameRunner{
    private GamingConsole game;
    public GameRunner(GamingConsole game){
        this.game = game;
    }
    public void run(){
        System.out.println("Running :" + game);
        game.up();
    }
}

 

public class GamingApplication{ 
    public static void main(String[] args){ 
        var game = new PacmanGame(); 
        GameRunner gameRunner = new GameRunner(game); 
    } 
}

 

 

위의 코드들을 보면 GamingApplication 클래스안에 PacmanGame을 참조하는 변수 game이 만들어지고 그 game을 실행하는 gameRunner 가 있다. 

만약, 다른 클래스 안에서도 똑같은 코드를 돌리고 싶다면 아마 우리는 var game = new PacmanGame(); 을 계속 사용할 것이다.

즉 PacmanGame()이라는 여러 객체가 발생한다.

이는 메모리를 잡아먹는다.

또한, 만약 PacmanGame 클래스안에 private int version = 1 이라는 변수가 있다면?

version을 2로 변경할때 모든 game에 game.setVersion(2);를 사용할 것인가?

이를 해결하는 많은 방법이 있지만 이번 게시글은 스프링 빈 (Spring Bean)을 사용하는 방법에 대해 설명한다.

/* 스프링 빈 */

스프링 빈 (Spring Bean)이란 스프링에 의해 관리되는 자바 객체를 말한다. 아래의 자바 코드들을 보자

 

@Configuration
public class AppGamingConfiguration{
    @Bean
    public GamingConsole game() {
        return new PacManGame();
    }
    
    @Bean
    public GameRunner gameRunner(GamingConsole game){
        return new GameRunner(game);
    }
}

 

스프링이 객체를 관리하게 하려면 객체를 스프링에 등록해야 한다. 이때 스프링에 등록된 객체를 빈 (Bean) 이라고 한다.

빈을 생성하려면 클래스를 새로 생성을 하고 @Configuration이라는 어노테이션이 필요하다.

그리고 @Bean을 이용해 위와 같은 함수를 만들면 빈이 등록된다.

이 빈들은 스프링 컨테이너에 의해 관리된다.

/* 스프링 컨테이너 */

Spring Container manages Spring Beans and their lifecycle.

스프링 컨테이너 (Spring Container)란 스프링빈과 그들의 생명주기를 관리한다.

스프링 컨테이너는 IOC 컨테이너 또는 DI 컨테이너 라고도 불린다.

아래의 코드를 보자

 

public class AppGamingApplicationJava{
    public static void main(String[] args){
        AnnotationConfigApplicationContext context =
            new AnnotationConfigApplicationContext(AppGamingConfiguration.class);
        
        context.getBean(GamingConsole.class).up(); //Pacman UP
        
        context.getBean(GameRunner.class).run(); // Running : Pacman
    }
}

 

AnnotationConfigApplicationContext 라는 객체는 스프링에 등록된 객체들을 관리한다. 

getBean함수를 통해 Configuration 클래스에서 만들었던 빈으로 등록되어 있던

GamingConsole 객체와 GameRunner 객체를 불러온다.

아무런 설정 없이 Pacman 객체가 사용되는 것을 볼 수가 있다. 자동으로 연결을 해주는 것이다.

이것을 auto-wired라고 한다.

728x90