기본부터 다지는 Spring(udemy 참고) Ch01.정리

khyojun·2023년 12월 16일
1
post-thumbnail

해당 챕터에서는 다음과 같은 6가지 질문에 대해서 대답을 하면 된다고 하신다.

  • 질문 1: Spring Container vs Spring Context vs IOC
    Container vs Application Context
  • 질문 2: Java Bean vs Spring Bean
  • 질문 3: Spring 프레임워크에서 관리하는 모든 빈을 나열하는 방법은 무엇인가요?
  • 질문 4: 여러 일치하는 빈이 있는 경우 어떻게 처리되나요?
  • 질문 5: Spring은 객체를 관리하고 오토 와이어링을 수행하고 있습니다.
    그런데 우리는 객체를 생성하기 위한 코드를 작성하고 있지 않나요?
    Spring에게 객체를 생성하도록 어떻게 하나요?
  • 질문 6: Spring이 정말로 모든 것을 쉽게 만들고 있는 건가요?

그렇지만 5,6 번에 대한 질문은 이후 챕터에서 대답을 들어볼 수 있다고 하셔서 1~4번까지 우선 알아보도록한다!

그래서 이번 챕터는 답변을 해보면서 시작하려고 한다.

Spring Container vs Spring Context vs IOC Container vs Application Context

  • Spring Container : 스프링 빈을 관리하고, 생명주기를 관리하여주는 친구
  • IOC Container : Spring Container 랑 같은 의미로 생각해도 되는 친구이다. IOC(Inversion of Control의 약자로, 제어의 역전을 의미합니다. 스프링에서는 객체의 생성 및 생명주기 관리를 개발자가 아닌 컨테이너가 담당합니다.)
  • Spring Context : Spring 컨테이너의 하나의 구현체를 일컫는다.
    • Bean Factory : 가장 기본적인 Spring 컨테이너 구현체
    • Application Context : 더 기능들이 많아진 Spring 컨테이너 구현체
      • 국제화, web app, aop 등에 지원하는 기능들이 많다.

기능들이 많기 때문에 Application Context 를 많이 사용한다. 강의를 해주시는 분도 20년동안 Spring을 사용했지만 BeanFactory는 거의 안 썼다고 한다.

Java Bean vs Spring Bean vs POJO

사실 이 질문에는 POJO 관련한 언급도 나온다.

  • POJO : Plain Old Java Object
    • 제약사항이 없다.
    • 어떤 자바 object도 POJO다.
  • Java Bean : 기존 POJO 에 여러가지 제약사항이 추가된 형태이다. EJB 시절 사용했던 것이다.
    • public 생성자에는 no-args 여야 한다.
    • getter, setter 만 허용한다.
    • java.io.Serializable를 implements 받아야 한다.
  • Spring Bean
    • IOC Container 에 의해 관리되어지는 객체들을 Spring Bean이라고 부른다.

Spring 프레임워크에서 관리하는 모든 빈을 나열하는 방법은 무엇인가요?

var context = new AnnotationConfigApplicationContext(GameConfig.class);
context.getBeanDefinitionNames();

다음과 같이 getBeanDefinitionNames를 사용해서 긁어올 수 있다.

여러 일치하는 빈이 있는 경우 어떻게 처리되나요?

context.getBean(GamingConsole.class).up();

해당하는 경우에서 클래스의 형태로 부르게 되었을 경우

    @Bean
    @Primary
    public GamingConsole game(){
        return new MarioGame();
    }

    @Bean
    public GamingConsole game2(){
        return new PacmanGame();
    }

    @Bean
    @Qualifier("pacman")
    public GamingConsole game2(){
        return new PacmanGame();
    }

    @Bean
    @Primary
    public GameRunner gameRunner2(@Qualifier("pacman") GamingConsole game){
        return new GameRunner(game);
    }

위와 같은 코드를 작성한 경우 @Primary 가 작성되어진 친구를 더 우선으로 찾는다. 그리고 @Qualifier과 같은 경우 디테일하게 이름을 지정하여 다음과 같이 gameRunner2와 같이
파라미터로 자동으로 매핑하게 되었을 때 @Qualifier를 통해 지정해줄 수 있다.
요약하면 다음과 같다.

@Primray는 하나의 구현체만을 사용하게 하는 것
@Qualifier는 @Primary보다 귀찮지만, 디테일하게 접근하고 사용할 수 있음
--> @Primary보다 우선순위가 높다!

질문 5,6 관련

  • 질문 5: Spring은 객체를 관리하고 오토 와이어링을 수행하고 있습니다.
    그런데 우리는 객체를 생성하기 위한 코드를 작성하고 있지 않나요?
    Spring에게 객체를 생성하도록 어떻게 하나요?
  • 질문 6: Spring이 정말로 모든 것을 쉽게 만들고 있는 건가요?
@Configuration
public class GameConfig {


    @Bean
    @Primary
    public GamingConsole game(){
        return new MarioGame();
    }

    @Bean
    @Qualifier("pacman")
    public GamingConsole game2(){
        return new PacmanGame();
    }

    @Bean
    //@Primary
    public GameRunner gameRunner(){
        return new GameRunner(game());
    }

5번과 같은 경우는 사실 Configuration을 사용해서 @Bean 을 생성해서 진행하였다. 그렇지만 이게 객체를 내가 만들었지 Spring이 만들어준 건 아니다.
그리고 6번과 같은 경우 생각해보게 되었을 때 간단해졌나? 라는 의문이 들긴 하여서 이 해당 질문에 대한 정보들은 이후 챕터에서 알아보도록 한다고 하셨다!

이후 챕터에서 계속...

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

2개의 댓글

comment-user-thumbnail
2023년 12월 17일

효준 더 스프링킹..

1개의 답글