• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

어플리케이션의 구조와 스프링 컨테이너

22.06.10 01:12 작성 조회수 95

1

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
 
전체적인 그림이 머릿속에 잘 그려지지를 않아서 질문 드립니다...
 
1.
예를 들어, 클라이언트가 웹에서 요청을 하면 해당 요청이 서버 컴퓨터에 있는 프로그램의 main 메서드로 전달이 되고 main 메서드에서 MemberService 빈을 불러와서 처리가 되는 것인가요?
 
실제로 웹 어플리케이션(?)을 운영할 때에 CoreApplication 클래스의 main 메소드에서
AnnotationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig);
같은 코드를 적고 이 때 생성된 스프링 컨테이너 ac를 이용해서 요청이 들어올 때마다 MemberService 빈을 꺼내오는 건가요?
 
아니면 이런 코드가 필요없이 스프링에서 알아서 컨테이너를 만들고 컴포넌트 스캔을 해주는 건가요?
만약 그렇다면 이렇게 스프링 자체적으로 만든 컨테이너에는 어떻게 접근을 할 수 있나요?
 
2.
테스트 함수 내부에서 빈을 꺼내서 사용하는 일련의 코드들이 테스트가 아닌 실제 코드에서는 메인 메서드에서 구현되는 것인지 각 서비스 객체에 구현되는 것인지를 잘 모르겠습니다.
 
예를 들어, test.hello.core.autowired.AllBeansTest 에서 고객이 할인 정책을 선택하게끔 하는 예시는 실제로는 DiscountService 객체 내부에 메소드를 만들어서 처리하는 상황인 건가요?
 
3.
스프링 컨테이너에 직접 접근하고 getBean을 통해 빈을 꺼내오는 건 테스트 상황에서만 필요한 작업인가요?
프로토타입 빈을 받아오거나 하는 경우를 제외하면 서비스 객체나 리포지토리 객체 등에서 스프링 컨테이너에 접근할 일은 없는 건가요?
 
4.
실제 개발을 하면서
 
 
이 질문에서와 같이
 
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);
AnnotationConfigApplicationContext ac2 = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);
 
와 같은 코드를 짜서 컨테이너가 2개 생성될 일은 없는 건가요? 교재에 있는 그림들을 보면 여러 클라이언트들이 하나의 컨테이너로부터 빈을 받는데 이 컨테이너는 스프링이 자체적으로 관리하는 컨테이너가 맞나요?
 
 
추가 질문.
지금처럼 전체적인 그림이 잘 안잡힌다면 이 상태로 mvc 강의를 듣는게 나을까요? 아니면 확실하게 모든 걸 이해하고 가는게 좋을까요?

답변 1

답변을 작성해보세요.

1

David님의 프로필

David

2022.06.10

안녕하세요. 이승재님, 공식 서포터즈 David입니다.

1. 

예를 들어, 클라이언트가 웹에서 요청을 하면 해당 요청이 서버 컴퓨터에 있는 프로그램의 main 메서드로 전달이 되고 main 메서드에서 MemberService 빈을 불러와서 처리가 되는 것인가요?

실제로 웹 어플리케이션(?)을 운영할 때에 CoreApplication 클래스의 main 메소드에서 AnnotationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig); 같은 코드를 적고 이 때 생성된 스프링 컨테이너 ac를 이용해서 요청이 들어올 때마다 MemberService 빈을 꺼내오는 건가요?

아니면 이런 코드가 필요없이 스프링에서 알아서 컨테이너를 만들고 컴포넌트 스캔을 해주는 건가요?

만약 그렇다면 이렇게 스프링 자체적으로 만든 컨테이너에는 어떻게 접근을 할 수 있나요?

=> 요청이 스프링의 컨트롤러까지 도달하는 과정은 MVC1편을 수강해주세요. 직접 컨테이너에서 빈을 꺼내쓰는 경우는 드뭅니다. 일반적으로 필요한 의존관계를 컨테이너로부터 주입받아 사용합니다. 현재 사용중인 컨테이너에 접근하려면 ApplicationContext를 다른 빈들을 주입받듯 주입받거나 ApplicationContextAware를 구현하면 됩니다.

 

2. 테스트 함수 내부에서 빈을 꺼내서 사용하는 일련의 코드들이 테스트가 아닌 실제 코드에서는 메인 메서드에서 구현되는 것인지 각 서비스 객체에 구현되는 것인지를 잘 모르겠습니다. 예를 들어, test.hello.core.autowired.AllBeansTest 에서 고객이 할인 정책을 선택하게끔 하는 예시는 실제로는 DiscountService 객체 내부에 메소드를 만들어서 처리하는 상황인 건가요?

=>  메인메서드와는 관련없으며 의존관계 설정에 따라 주입된 정책을 실행합니다.

 

3. 스프링 컨테이너에 직접 접근하고 getBean을 통해 빈을 꺼내오는 건 테스트 상황에서만 필요한 작업인가요?

프로토타입 빈을 받아오거나 하는 경우를 제외하면 서비스 객체나 리포지토리 객체 등에서 스프링 컨테이너에 접근할 일은 없는 건가요?

 => 일반적으로는 컨테이너에 직접 접근할 일이 없습니다.

 

4. 실제 개발을 하면서 https://www.inflearn.com/questions/331154 이 질문에서와 같이 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);

AnnotationConfigApplicationContext ac2 = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);

와 같은 코드를 짜서 컨테이너가 2개 생성될 일은 없는 건가요?

=> 일반적으로 없습니다.

교재에 있는 그림들을 보면 여러 클라이언트들이 하나의 컨테이너로부터 빈을 받는데 이 컨테이너는 스프링이 자체적으로 관리하는 컨테이너가 맞나요? 

 => 네, 맞습니다.

 

추가 질문.

지금처럼 전체적인 그림이 잘 안잡힌다면 이 상태로 mvc 강의를 듣는게 나을까요? 아니면 확실하게 모든 걸 이해하고 가는게 좋을까요?

=> MVC 강의를 들으시면서 필요한 부분을 핵심원리 강의를 통해 복습하시는 것을 추천합니다.

한 번에 다 이해되지 않을 뿐더러 MVC강의를 들으시면서 핵심원리에서 궁금해하셨던 부분이 풀리는 부분도 있습니다.

감사합니다.