[챌린지반 과제]

말하는 감자·2025년 4월 21일

내일배움캠프

목록 보기
47/73
post-thumbnail

Q1: Application Scope와 Singleton Scope의 차이점

Singleton Scope

특징

  • 스프링 컨테이너당 하나의 인스턴스(빈)만 생성
  • 기본 스코프
  • 상태를 공유하므로 주의 필요
    📌 핵심: 스프링 컨테이너가 관리하는 객체의 "하나뿐인 인스턴스"

생성되는 객체들

  • ApplicationContext
  • Spring Core Containers
  • Service Layer Beans
  • Repository Layer Beans
  • Configuration Beans
  • Spring Security Configurations

Application Scope

특징

  • 웹 애플리케이션당 하나의 인스턴스
  • ServletContext와 유사한 생명주기
    📌 핵심: 웹 애플리케이션 전체에서 공유되는 데이터 저장용

생성되는 객체들

  • 애플리케이션 전역 설정
  • 캐시 매니저
  • 전역 카운터
  • 공유 리소스 관리자
  • 애플리케이션 이벤트 리스너

애플리케이션 스코프는 웹 서버가 돌아가는 전체적인 범위(웹 컨테이너)에서 생성되는 인스턴스로, 애플리케이션 전체에서 공유되는 데이터를 저장하는 용도로 사용됨.

싱글톤 스코프는 스프링 컨테이너에서 딱 하나만 존재하는 빈(인스턴스)으로, 스프링 컨테이너가 관리하는 객체를 담는 용도임.

이 둘은 관리 주체와 사용 목적에서 차이점이 나타난다.
애플리케이션 스코프는 모든 사용자 세션에서 공유되기 떄문에 애플리케이션 전체에서 공유해야 하는 데이터를 저장할 때 사용한다.

싱글톤 스코프는 서비스나 레포지토리 계층에서 의존성 주입 등 필요한 곳에 똑같은 인스턴스를 주입하는 용도로 많이 사용된다.

"두 스코프 모두 애플리케이션 전반에서 하나의 인스턴스를 사용하는데, 왜 구분하여 사용하나요?"

해당 스코프들을 관리하는 곳과 목적이 다르기 때문에 구분할 필요가 있다.
애플리케이션 스코프는 웹 컨테이너에서 사용되는데, 이 웹 컨테이너는 http요청에 알맞는 서블릿을 관리하고 요청하는 역할을 하면서 사용자 세션에서 공통으로 사용되는 데이터들을 저장하는 인스턴스로 사용된다.
싱글톤 스코프는 해당 웹 컨테이너에서 디스패처 서블릿을 호출할 때, 이 디스패처 서블릿이 스프링 컨테이너를 초기화하게 되는데 이 때 생성되는 스프링 빈 객체를 관리하기 위한 인스턴스로 사용된다.

"ServletContext와 ApplicationContext의 생명주기 차이를 설명해주세요.

ServletContext와 ApplicationContext는 각각 웹 컨테이너와 스프링 컨테이너가 관리하는 전역 컨텍스트로, 생명주기에서 차이점이 있음.
ServletContext는 웹 컨테이너에서 관리되며 애플리케이션이 배포되고 시작할 때 생성되고, 애플리케이션이 종료될 때 소명됨. ( 애플리케이션 생명주기와 동일하게 유지됨)
ApplicationContext는 스프링 프레임워크가 관리하는 컨테이너로 디스패처 서블릿이 초기화될 때 생성되고 스프링 컨텍스트가 종료될 때 소멸함.






Q2: "의존성 주입(DI)이 필요한 이유와 이것이 없다면 어떤 문제가 발생하는지 설명해주세요."

DI를 사용하면 객체 간의 결합도가 낮아지고, 코드의 유연성을 높여주어서 재사용성이 높아진다.
DI가 없다면, 클래스가 자신의 의존 객체를 직접 생성하게 되는데, 이 경우 강한 결합도가 발생하게된다. 결합도가 높아지면 클래스 간의 관계가 매우 밀접해지고 변경이 어려워진다. 한 객체의 구현이 변경되면, 그 객체를 사용하는 모든 객체도 수정이 필요할 수 있어서 유지보수가 어려워진다.

"의존성 주입이 없다면, 개발자는 어떤 방식으로 객체 간의 의존관계를 맺어야 할까요?"

DI가 없다면, 클래스가 자신의 의존 객체를 직접 생성하게 되어서 래스 내부에서 다른 클래스를 직접 참조하고 생성하는 구조가 되어, 클래스 간의 관계가 매우 밀접해지고 변경이 어려워진다. 한 객체의 구현이 변경되면, 그 객체를 사용하는 모든 객체도 수정이 필요할 수 있음.

"DI를 사용하면서 발생할 수 있는 순환 참조 문제는 어떻게 해결할 수 있나요?"

@Lazy 어노테이션을 사용하거나 인터페이스 분리하는 방법이 있다.





Q3: "ApplicationContext와 WebApplicationContext의 차이점"

Application Context

스프링의 핵심 컨테이너로서, 스프링 애플리케이션 전체에 걸쳐 스프링 빈의 생성, 관리, 라이프사이클을 담당

ApplicationContext 인터페이스를 구현하는 다양한 컨텍스트 구현체들이 있으며 주로 사용되는 것으로는 AnnotationConfigApplicationContext, ClassPathXmlApplicationContext, FileSystemXmlApplicationContext 등이 있다.

Web Application Context

웹 애플리케이션에서 사용되는 스프링 컨텍스트로 , ApplicationContext 인터페이스를 확장한 WebApplicationContext 인터페이스를 구현한다.
웹 애플리케이션의 라이프사이클과 웹 관련 기능을 제공

주로 사용되는 것으로는 XmlWebApplicationContext, AnnotationConfigWebApplicationContext 등이 있다.

ApplicationContext는 스프링의 기본 컨테이너로 빈을 관리하는 역할을 하고,
WebApplicationContext는 이를 확장해 웹 환경에서 ServletContext 접근, DispatcherServlet 연동, ViewResolver 설정 등 웹에 특화된 기능을 담당하는 컨테이너이다.

"왜 두 개의 컨테이너로 나누어서 관리하나요?"

관심사 분리 원칙을 따르기 위해 스프링은 일반적인 빈 관리 영역과 웹에 특화된 빈 관리 영역을 명확하게 구분하고자 나누어서 관리함.

"Web Context에서 Root Context의 빈을 참조할 수 있는 이유는 무엇인가요?"

Web 컨텍스트는 루트 컨텍스트를 상속 받는 구조라서
자신이 가지고 있지 않은 빈이 요청될 경우, 부모 컨텍스트(루트)에게 빈을 위임할 수 잇음.






Q4 는 https://velog.io/@tofha054/Spring-Bean-생명주기 여기에 내용다있음.






Q5: "스프링의 컨테이너 초기화 순서"

  1. 웹 애플리케이션이 실행되면 웹 컨테이너는 web.xml을 통해 ContextLoaderListenerDispatcherServlet을 설정한다.
  2. 이때 ContextLoaderListener가 먼저 실행되어 ApplicationContext가 초기화되며, 비즈니스 로직과 관련된 ServiceRepository 빈들이 이 컨텍스트에 등록된다.
  3. 이후 DispatcherServlet이 실행되면서 WebApplicationContext가 초기화되고, ControllerViewResolver와 같은 웹 관련 빈들이 이 안에 포함된다.
    이처럼 ApplicationWeb 두 컨텍스트는 서로 계층적으로 연결되어 있으며, Web ContextApplicationContext의 빈을 참조할 수 있습니다.

"서블릿 컨테이너와 스프링 컨테이너의 관계는 무엇인가요?"

서블릿 컨테이너 = 웹 컨테이너
이 웹 컨테이너는 http요청에 알맞는 서블릿을 관리하고 요청하는 역할을 하면서 사용자 세션에서 공통으로 사용되는 데이터들을 저장하는 인스턴스로 사용된다.
디스패처 서블릿이 스프링 컨테이너를 초기화하게 되는데 이 때 생성되는 스프링 빈 객체를 관리하기 위한 인스턴스로 사용된다.

"스프링 부트에서는 이 초기화 순서가 어떻게 달라지나요?"

스프링 부트는 기존 스프링 MVC의 복잡한 설정을 자동화하여 하나의 ApplicationContext에서 Root와 Web Context를 통합하거나 확장하면서 훨씬 간편하게 컨테이너를 초기화한다.

1.애플리케이션은 main() 메서드 내에서 SpringApplication.run() 메서드를 호출하면서 시작되며, 이 과정에서 내장 톰캣과 같은 웹 서버가 자동으로 구동된다. 2.@SpringBootApplication 어노테이션을 기준으로 컴포넌트 스캔이 이루어지고, 그 결과로 단일한 ApplicationContext가 생성되어 모든 빈을 등록하고 의존성 주입을 수행한다.
3. DispatcherServlet도 자동으로 등록되며, Web Context 역할까지 자동 설정되므로 개발자가 직접 web.xml이나 수동 설정을 하지 않아도 된다.

profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글