웹사이트 검색

봄 인터뷰 질문 및 답변


최근에 Spring Tutorials을 많이 게시했습니다. 이 게시물은 핵심 개념을 자세히 설명하는 Spring 인터뷰 질문을 통과하는 데 도움이 됩니다.

종속성 주입 및 측면 지향 프로그래밍은 Spring 프레임워크의 핵심입니다. 스프링 프레임워크를 잘 한다면 자바 인터뷰에서 뽑힐 확률이 정말 높아진다.

프로 팁: Java 인터뷰 질문 기사.

봄 인터뷰 질문 및 답변

여기서 저는 거의 50개의 봄 인터뷰 질문과 답변을 제공하고 있습니다. Spring 5까지 업데이트되었으므로 반응형 프로그래밍을 위한 Spring WebFlux와 같은 모든 최신 기능을 다룹니다.

1. 스프링 프레임워크란?

Spring은 가장 널리 사용되는 Java EE 프레임워크 중 하나입니다. 스프링 프레임워크의 핵심 개념은 \의존성 주입\과 \측면 지향 프로그래밍\입니다.

스프링 프레임워크는 일반 자바 애플리케이션에서도 의존성 주입을 구현하여 서로 다른 구성 요소 간의 느슨한 결합을 달성하는 데 사용할 수 있습니다. 관점 지향 프로그래밍을 위한 스프링 지원을 사용하여 로깅 및 인증과 같은 교차 절단 작업을 수행할 수 있습니다.

Spring MVC 및 Spring JDBC와 같은 특정 작업에 대해 많은 기능과 다양한 모듈을 제공하기 때문에 Spring을 좋아합니다. 많은 온라인 리소스와 활동적인 커뮤니티 구성원이 있는 오픈 소스 프레임워크이기 때문에 Spring 프레임워크로 작업하는 것이 쉽고 재미있습니다.

추천 읽기: 스프링 프레임워크

2. Spring Framework의 중요한 기능은 무엇입니까?

Spring Framework는 의존성 주입과 측면 지향 프로그래밍이라는 두 가지 디자인 개념 위에 구축됩니다.

스프링 프레임워크의 일부 기능은 다음과 같습니다.

  • 개발을 위해 프레임워크를 사용하는 데 드는 비용이 매우 적고 가볍습니다.
  • 서로 독립적인 구성 요소를 작성하기 위한 종속성 주입 또는 Inversion of Control, 스프링 컨테이너는 작업을 수행하기 위해 구성 요소를 함께 연결합니다.
  • Spring IoC 컨테이너는 JNDI 조회와 같은 프로젝트별 구성 및 Spring Bean 수명 주기를 관리합니다.
  • Spring MVC 프레임워크를 사용하여 XML 및 JSON 응답을 반환할 수 있는 편안한 웹 서비스는 물론 웹 애플리케이션을 만들 수 있습니다.
  • 주석을 사용하거나 스프링 빈 구성 파일을 사용하여 아주 적은 구성으로 트랜잭션 관리, JDBC 작업, 파일 업로드, 예외 처리 등을 지원합니다.

3. Spring Framework를 사용하면 어떤 장점이 있나요?

Spring Framework 사용의 이점 중 일부는 다음과 같습니다.

  • 응용 프로그램의 서로 다른 구성 요소 간의 직접적인 종속성을 줄입니다. Spring IoC 컨테이너는 리소스 또는 빈을 초기화하고 종속성으로 주입하는 역할을 합니다.
  • 비즈니스 로직이 실제 리소스 구현 클래스와 직접 종속되지 않기 때문에 Spring 프레임워크에서 단위 테스트 케이스 작성이 쉽습니다. 테스트 구성을 쉽게 작성하고 테스트 목적으로 모의 빈을 주입할 수 있습니다.
  • 객체 초기화, 리소스 열기/닫기와 같은 상용구 코드의 양을 줄입니다. JDBC 프로그래밍과 함께 제공되는 모든 상용구 코드를 제거하는 데 도움이 되기 때문에 JdbcTemplate 클래스를 많이 좋아합니다.
  • Spring 프레임워크는 여러 모듈로 나뉘며 애플리케이션을 가볍게 유지하는 데 도움이 됩니다. 예를 들어 Spring 트랜잭션 관리 기능이 필요하지 않은 경우 해당 종속성을 프로젝트에 추가할 필요가 없습니다.
  • Spring 프레임워크는 대부분의 Java EE 기능과 훨씬 더 많은 기능을 지원합니다. 예를 들어 기본 Android 애플리케이션을 위한 더 나은 코드를 작성하는 데 도움이 되는 Android용 Spring 프로젝트가 있습니다. 이렇게 하면 Spring 프레임워크가 완전한 패키지가 되며 다양한 요구 사항에 대해 서로 다른 프레임워크를 돌볼 필요가 없습니다.

4. Spring 5의 중요한 기능은 무엇입니까?

Spring 5는 Spring 4의 대대적인 점검입니다. 중요한 기능 중 일부는 다음과 같습니다.

  • Java 8 이상 버전을 지원하므로 람다 식을 사용할 수 있습니다.
  • Java EE7 및 Servlet 4.0 사양 지원
  • 파일 작업은 이제 NIO 2 스트림을 통해 수행되며, 앱에서 많은 파일 처리를 수행하는 경우 크게 개선됩니다.
  • 로깅을 간소화하기 위한 spring-jcl 도입, 이전에는 로깅을 위한 단일 지점이 없었기 때문에 엉망이었습니다.
  • Kotlin, Lombok, Reactor 3.1 Flux, Mono 및 RxJava를 지원합니다.
  • Spring에 반응형 프로그래밍을 제공하는 Spring WebFlux.
  • JUnit 5 지원
  • 클래스 경로 스캐닝이 아닌 색인 파일 "META-INF/spring.components\를 통해 스프링 구성 요소 정보 제공 지원.

이 릴리스에 대한 자세한 개요를 보려면 Spring 5 기능을 살펴보십시오.

5. 스프링 웹플럭스란?

Spring WebFlux는 Spring 5에 도입된 새로운 모듈입니다. Spring WebFlux는 Spring 프레임워크에서 반응형 프로그래밍 모델을 향한 첫 번째 단계입니다.

Spring WebFlux는 Spring MVC 모듈의 대안입니다. Spring WebFlux는 이벤트 루프 실행 모델에 구축된 완전히 비동기적이고 차단되지 않는 애플리케이션을 만드는 데 사용됩니다.

Spring WebFlux Tutorial에서 자세한 내용을 읽을 수 있습니다.

6. 의존성 주입이란 무엇을 이해합니까?

종속성 주입 디자인 패턴을 사용하면 하드 코딩된 종속성을 제거하고 응용 프로그램을 느슨하게 결합하고 확장 가능하며 유지 관리할 수 있습니다. 종속성 분석을 컴파일 타임에서 런타임으로 이동하기 위해 종속성 주입 패턴을 구현할 수 있습니다.

종속성 주입 사용의 이점 중 일부는 관심사 분리, 상용구 코드 감소, 구성 가능한 구성 요소 및 쉬운 단위 테스트입니다.

종속성 주입 프로세스를 자동화하려면 종속성 주입에 대한 Google Guice에서 자세히 읽어보세요. 그러나 대부분의 경우 우리는 단순한 종속성 주입 이상의 것을 찾고 있으며 Spring이 맨 위에 오는 곳입니다.

7. Spring Framework에서 DI를 어떻게 구현합니까?

Spring XML 기반 및 Annotation 기반 구성을 사용하여 Spring 애플리케이션에서 DI를 구현할 수 있습니다. 더 나은 이해를 위해 JUnit 테스트 케이스로 두 가지 방법을 모두 배울 수 있는 Spring Dependency Injection 예제를 읽으십시오. 게시물에는 샘플 프로젝트 zip 파일도 포함되어 있으며 다운로드하여 자세히 알아보기 위해 사용할 수 있습니다.

8. Spring Tool Suite를 사용하면 어떤 이점이 있습니까?

Eclipse에 플러그인을 설치하여 Spring Tool Suite의 모든 기능을 사용할 수 있습니다. 그러나 STS는 Eclipse와 함께 Maven 지원, 다양한 유형의 Spring 프로젝트 생성을 위한 템플릿, Spring 애플리케이션의 성능 향상을 위한 tc 서버와 같은 다른 중요한 종류의 항목과 함께 제공됩니다.

Spring 컴포넌트를 강조하고 AOP 포인트컷과 어드바이스를 사용하는 경우 특정 포인트컷 아래에 어떤 메소드가 있는지 명확하게 보여주기 때문에 STS를 좋아합니다. 그래서 직접 모든 것을 설치하는 것보다 Spring 기반 애플리케이션을 개발할 때 STS를 사용하는 것을 선호합니다.

9. 중요한 Spring 모듈의 이름을 지정하시겠습니까?

중요한 Spring Framework 모듈 중 일부는 다음과 같습니다.

  • Spring Context – 종속성 주입용.
  • Spring AOP – 관점 지향 프로그래밍용.
  • Spring DAO – DAO 패턴을 사용하는 데이터베이스 작업용
  • Spring JDBC – JDBC 및 DataSource 지원용.
  • Spring ORM – 최대 절전 모드와 같은 ORM 도구 지원
  • Spring Web Module – 웹 애플리케이션 생성용.
  • Spring MVC – 웹 애플리케이션, 웹 서비스 등을 만들기 위한 Model-View-Controller 구현

10. Aspect-Oriented Programming으로 무엇을 이해합니까?

엔터프라이즈 응용 프로그램에는 로깅, 트랜잭션 관리, 데이터 유효성 검사, 인증 등과 같은 다양한 유형의 객체 및 응용 프로그램 모듈에 적용할 수 있는 몇 가지 일반적인 교차 편집 문제가 있습니다. 응용 프로그램의 모듈성은 객체 지향 프로그래밍의 클래스에 의해 달성됩니다. AOP에서 애플리케이션 모듈성은 Aspects에 의해 달성되며 서로 다른 클래스 메서드를 가로지르도록 구성됩니다.

AOP는 일반 객체 지향 프로그래밍에서는 불가능한 클래스의 교차 절단 작업의 직접적인 종속성을 제거합니다. 예를 들어 로깅을 위한 별도의 클래스를 가질 수 있지만 다른 클래스는 이러한 메서드를 호출해야 합니다. 그러나 AOP에서는 Aspect를 구성하고 메서드 실행이 자동으로 발생합니다. Spring AOP 예제에서 Spring AOP 지원에 대해 자세히 읽어보십시오.

11. AOP에서 Aspect, Advice, Pointcut, JointPoint 및 Advice 인수는 무엇입니까?

Aspect: Aspect는 트랜잭션 관리와 같은 교차 관심사를 구현하는 클래스입니다. Aspects는 Spring Bean 구성 파일에서 구성된 일반 클래스이거나 Spring AspectJ 지원을 사용하여 @Aspect 주석을 사용하여 클래스를 Aspect로 선언할 수 있습니다.

조언: 조언은 특정 조인 포인트에 대해 수행되는 작업입니다. 프로그래밍 측면에서 애플리케이션에서 일치하는 포인트컷이 있는 특정 조인포인트에 도달했을 때 실행되는 메서드입니다. 조언을 서블릿 필터로 생각할 수 있습니다.

Pointcut: Pointcuts는 어드바이스를 실행해야 하는지 여부를 결정하기 위해 조인 포인트와 일치하는 정규식입니다. Pointcut은 조인 포인트와 일치하는 다양한 종류의 표현식을 사용합니다. 스프링 프레임워크는 어드바이스 메소드가 적용될 조인 포인트를 결정하기 위해 AspectJ 포인트컷 표현 언어를 사용합니다.

JoinPoint: 조인 포인트는 메소드 실행, 예외 처리, 객체 변수 값 변경 등과 같은 애플리케이션의 특정 지점입니다. Spring AOP에서 조인 포인트는 항상 메소드 실행입니다.

조언 인수: 조언 메소드에서 인수를 전달할 수 있습니다. 인수 패턴과 일치하는 모든 메서드에 적용할 포인트컷의 args() 표현식을 사용할 수 있습니다. 이것을 사용한다면 인자 타입이 결정되는 어드바이스 메소드에서 같은 이름을 사용해야 합니다.

이러한 개념은 처음에는 혼란스러워 보이지만 Spring Aspect, Advice Example을 살펴보면 쉽게 관련될 수 있습니다.

12. Spring AOP와 AspectJ AOP의 차이점은 무엇인가?

AspectJ는 Aspect-Oriented 프로그래밍을 위한 산업 표준 구현인 반면 Spring은 일부 경우에 AOP를 구현합니다. Spring AOP와 AspectJ의 주요 차이점은 다음과 같습니다.

  • Spring AOP는 직조 과정에 대해 걱정할 필요가 없기 때문에 AspectJ보다 사용하기 쉽습니다.
  • Spring AOP는 AspectJ 주석을 지원하므로 AspectJ에 익숙하다면 Spring AOP 작업이 더 쉽습니다.
  • Spring AOP는 프록시 기반의 AOP만 지원하므로 메서드 실행 조인포인트에만 적용할 수 있다. AspectJ는 모든 종류의 포인트컷을 지원합니다.
  • Spring AOP의 단점 중 하나는 Spring Context를 통해 생성된 Bean에만 적용할 수 있다는 점입니다.

13. 스프링 IoC 컨테이너란?

IoC(Inversion of Control)는 개체 종속성 간의 느슨한 연결을 달성하는 메커니즘입니다. 런타임에 개체의 느슨한 결합 및 동적 바인딩을 달성하기 위해 개체는 다른 어셈블러 개체에 의해 주입되는 종속성을 정의합니다. Spring IoC 컨테이너는 객체에 종속성을 주입하고 사용할 수 있도록 준비하는 프로그램입니다.

Spring Framework IoC 컨테이너 클래스는 org.springframework.beansorg.springframework.context 패키지의 일부이며 개체 종속성을 분리하는 다양한 방법을 제공합니다.

우리가 사용하는 유용한 ApplicationContext 구현 중 일부는 다음과 같습니다.

  • AnnotationConfigApplicationContext: 주석 기반 구성을 사용하는 독립형 Java 애플리케이션용.
  • ClassPathXmlApplicationContext: XML 기반 구성을 사용하는 독립 실행형 Java 애플리케이션용.
  • FileSystemXmlApplicationContext: XML 구성 파일을 파일 시스템의 어느 곳에서나 로드할 수 있다는 점을 제외하면 ClassPathXmlApplicationContext와 유사합니다.
  • 웹 애플리케이션용 AnnotationConfigWebApplicationContext 및 XmlWebApplicationContext.

14. 스프링빈이란?

Spring IoC 컨테이너에 의해 초기화되는 모든 일반 Java 클래스를 Spring Bean이라고 합니다. Spring ApplicationContext를 사용하여 Spring Bean 인스턴스를 가져옵니다.

Spring IoC 컨테이너는 Spring Bean의 수명 주기, Bean 범위를 관리하고 Bean에 필요한 종속성을 주입합니다.

15. Spring bean 구성 파일의 중요성은 무엇입니까?

우리는 Spring Context에 의해 초기화될 모든 bean을 정의하기 위해 Spring Bean 구성 파일을 사용합니다. Spring ApplicationContext의 인스턴스를 만들 때 Spring Bean XML 파일을 읽고 모두 초기화합니다. 컨텍스트가 초기화되면 이를 사용하여 다른 빈 인스턴스를 얻을 수 있습니다.

Spring Bean 구성 외에도 이 파일에는 Spring MVC 인터셉터, 뷰 확인자 및 주석 기반 구성을 지원하는 기타 요소가 포함되어 있습니다.

16. 클래스를 Spring Bean으로 구성하는 다른 방법은 무엇입니까?

Spring Bean을 구성하는 세 가지 방법이 있습니다.

XML 구성: 가장 많이 사용되는 구성이며 컨텍스트 파일의 빈 요소를 사용하여 Spring Bean을 구성할 수 있습니다. 예를 들어:

<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>

Java 기반 구성: 주석만 사용하는 경우 @Bean 주석을 사용하여 Spring 빈을 구성할 수 있습니다. 이 주석은 스프링 빈을 구성하기 위해 @Configuration 클래스와 함께 사용됩니다. 샘플 구성은 다음과 같습니다.

@Configuration
@ComponentScan(value="com.journaldev.spring.main")
public class MyConfiguration {

	@Bean
	public MyService getService(){
		return new MyService();
	}
}

스프링 컨텍스트에서 이 빈을 가져오려면 다음 코드 스니펫을 사용해야 합니다.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
		MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);

주석 기반 구성: @Controller 주석을 클래스와 함께 사용하여 스프링 빈으로 구성할 수도 있습니다. 이를 위해 이러한 클래스를 검색할 기본 패키지 위치를 제공해야 합니다. 예를 들어:

<context:component-scan base-package="com.journaldev.spring" />

17. Spring Bean의 다양한 범위는 무엇입니까?

Spring Beans에 대해 정의된 다섯 가지 범위가 있습니다.

  1. singleton: 각 컨테이너에 대해 하나의 빈 인스턴스만 생성됩니다. 이는 Spring Bean의 기본 범위입니다. 이 범위를 사용하는 동안 Spring Bean에 공유 인스턴스 변수가 없는지 확인하십시오. 그렇지 않으면 스레드로부터 안전하지 않기 때문에 데이터 불일치 문제가 발생할 수 있습니다.
  2. prototype: 빈이 요청될 때마다 새 인스턴스가 생성됩니다.
  3. 요청: 프로토타입 범위와 동일하지만 웹 애플리케이션에 사용하기 위한 것입니다. 각 HTTP 요청에 대해 빈의 새 인스턴스가 생성됩니다.
  4. 세션: 컨테이너에 의해 각 HTTP 세션에 대해 새 빈이 생성됩니다.
  5. global-session: 포틀릿 애플리케이션을 위한 전역 세션 빈을 생성하는 데 사용됩니다.

Spring Framework는 확장 가능하며 자체 범위도 만들 수 있습니다. 그러나 대부분의 경우 우리는 프레임워크에서 제공하는 범위를 잘 알고 있습니다. Spring 빈 범위를 설정하기 위해 빈 요소의 "scope\ 속성 또는 주석 기반 구성을 위한 @Scope 주석을 사용할 수 있습니다.

18. Spring Bean의 라이프 사이클은 무엇입니까?

Spring Beans는 Spring Container에 의해 초기화되고 모든 종속성도 주입됩니다. 컨텍스트가 소멸되면 초기화된 모든 Bean도 소멸됩니다. 이것은 대부분의 경우에 잘 작동하지만 때로는 빈을 사용할 준비가 되기 전에 다른 리소스를 초기화하거나 일부 유효성 검사를 수행하려고 합니다. Spring 프레임워크는 Spring Bean에서 사후 초기화 및 사전 소멸 방법을 지원합니다.

InitializingBeanDisposableBean 인터페이스를 구현하거나 Spring Bean 구성에서 init-method 및 destroy-method 속성을 사용하여 두 가지 방법으로 이를 수행할 수 있습니다. 자세한 내용은 Spring Bean Life Cycle Methods를 참조하십시오.

19. Spring Bean에서 ServletContext 및 ServletConfig 객체를 얻는 방법은 무엇입니까?

Spring Bean에서 컨테이너 특정 객체를 얻는 방법에는 두 가지가 있습니다.

  • 이러한 ServletContextAware 및 ServletConfigAware 인터페이스에 대한 Spring *Aware 인터페이스 구현, 이러한 인식 인터페이스의 전체 예는 Spring Aware 인터페이스를 참조하십시오.
  • ServletContextServletConfig 유형의 빈 변수와 함께 @Autowired 주석 사용. 서블릿 컨테이너 관련 환경에서만 작동합니다.

@Autowired
ServletContext servletContext;

20. 빈 배선 및 @Autowired 주석이란 무엇입니까?

초기화하는 동안 Spring Bean 종속성을 주입하는 프로세스를 Spring Bean Wiring이라고 합니다.

일반적으로 모든 빈 종속성을 명시적으로 연결하는 것이 가장 좋은 방법이지만 스프링 프레임워크는 자동 연결도 지원합니다. @Autowired 주석을 필드 또는 byType 자동 연결 방법과 함께 사용할 수 있습니다. 이 주석이 작동하려면 스프링 빈 구성 파일에서 주석 기반 구성도 활성화해야 합니다. 이는 context:annotation-config 요소로 수행할 수 있습니다.

@Autowired 주석에 대한 자세한 내용은 Spring Autowire 예제를 참조하세요.

21. Spring Bean autowiring의 다른 유형은 무엇입니까?

Spring 프레임워크에는 네 가지 유형의 autowiring이 있습니다.

  1. 이름으로 autowire
  2. 자동 연결 byType
  3. 생성자에 의한 autowire
  4. @Qualifier 주석에 의한 자동 연결

Spring 3.1 이전에는 생성자 또는 byType에 의한 autowire와 유사한 autodetect에 의한 autowire도 지원되었습니다. 이러한 옵션에 대한 자세한 내용은 Spring Bean Autowiring을 참조하세요.

22. Spring Bean은 스레드 안전성을 제공합니까?

Spring bean의 기본 범위는 싱글톤이므로 컨텍스트당 하나의 인스턴스만 있습니다. 즉, 모든 스레드가 업데이트할 수 있는 클래스 수준 변수가 있으면 데이터가 일관성이 없게 됩니다. 따라서 기본 모드에서 스프링 빈은 스레드로부터 안전하지 않습니다.

그러나 Spring Bean 범위를 요청, 프로토타입 또는 세션으로 변경하여 성능 비용으로 스레드 안전성을 달성할 수 있습니다. 설계 결정이며 프로젝트 요구 사항을 기반으로 합니다.

23. Spring MVC에서 컨트롤러란?

MVC 디자인 패턴과 마찬가지로 컨트롤러는 모든 클라이언트 요청을 처리하고 이를 처리하기 위해 구성된 리소스로 전송하는 클래스입니다. Spring MVC에서 DispatcherServlet은 Spring Bean 구성을 기반으로 컨텍스트를 초기화하는 전면 컨트롤러 클래스입니다.

Controller 클래스는 요청 매핑을 기반으로 다른 종류의 클라이언트 요청을 처리할 책임이 있습니다. 특정 URI 매핑에 대한 핸들러 메서드를 정의하기 위해 @RequestMapping 주석을 사용하여 컨트롤러 클래스를 만들 수 있습니다.

24. Spring에서 @Component, @Controller, @Repository 및 @Service 주석의 차이점은 무엇입니까?

@Component는 클래스가 구성 요소임을 나타내는 데 사용됩니다. 이러한 클래스는 자동 감지에 사용되며 주석 기반 구성이 사용될 때 bean으로 구성됩니다.

@Controller는 MVC 응용 프로그램에서 사용되며 주로 RequestMapping 주석과 함께 사용되는 특정 유형의 구성 요소입니다.

@Repository 어노테이션은 컴포넌트가 데이터를 저장/검색/검색하는 저장소 및 메커니즘으로 사용됨을 나타내는 데 사용됩니다. 이 주석을 DAO 패턴 구현 클래스에 적용할 수 있습니다.

@Service는 클래스가 서비스임을 나타내는 데 사용됩니다. 일반적으로 일부 서비스를 제공하는 비즈니스 파사드 클래스에는 이 주석이 달려 있습니다.

자동 감지를 위해 위의 클래스에 대한 주석을 사용할 수 있지만 주석이 달린 클래스의 목적을 쉽게 구분할 수 있도록 다른 유형이 제공됩니다.

25. DispatcherServlet과 ContextLoaderListener는 무엇입니까?

DispatcherServlet은 Spring MVC 애플리케이션의 전면 컨트롤러이며 Spring Bean 구성 파일을 로드하고 구성된 모든 Bean을 초기화합니다. 주석이 활성화되면 패키지도 스캔하고 @Service 주석으로 주석이 달린 빈을 구성합니다.

ContextLoaderListener는 Spring의 루트 WebApplicationContext를 시작하고 종료하는 리스너입니다. 중요한 기능은 ApplicationContext의 수명 주기를 ServletContext의 수명 주기에 연결하고 ApplicationContext 생성을 자동화하는 것입니다. 이를 사용하여 서로 다른 스프링 컨텍스트에서 사용할 수 있는 공유 빈을 정의할 수 있습니다.

26. Spring의 ViewResolver는 무엇입니까?

ViewResolver 구현은 이름으로 보기 페이지를 확인하는 데 사용됩니다. Spring Bean 구성 파일에서 구성합니다. 예를 들어:

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/views/" />
	<beans:property name="suffix" value=".jsp" />
</beans:bean>

InternalResourceViewResolver는 ViewResolver 인터페이스 구현 중 하나이며 bean 속성을 통해 뷰 페이지 디렉토리 및 접미사 위치를 제공하고 있습니다. 따라서 컨트롤러 핸들러 메서드가 "home\을 반환하면 뷰 리졸버는 /WEB-INF/views/home.jsp에 있는 뷰 페이지를 사용합니다.

27. MultipartResolver는 무엇이며 언제 사용됩니까?

MultipartResolver 인터페이스는 파일 업로드에 사용됩니다. CommonsMultipartResolver와 StandardServletMultipartResolver는 파일 업로드를 위해 스프링 프레임워크에서 제공하는 두 가지 구현입니다. 기본적으로 구성된 멀티파트 리졸버는 없지만 파일 업로드에 사용하려면 스프링 빈 구성에서 MultipartResolver 유형의 "multipartResolver\라는 빈을 정의하기만 하면 됩니다.

일단 구성되면 구성된 MultipartResolver에 의해 모든 멀티파트 요청이 해결되고 래핑된 HttpServletRequest를 전달합니다. 그런 다음 컨트롤러 클래스에서 파일을 가져오고 처리하는 데 사용됩니다. 전체 예제를 보려면 Spring MVC 파일 업로드 예제를 읽어보세요.

28. Spring MVC Framework에서 예외를 처리하는 방법은 무엇입니까?

Spring MVC Framework는 강력한 예외 처리를 달성하는 데 도움이 되는 다음과 같은 방법을 제공합니다.

컨트롤러 기반 – 컨트롤러 클래스에서 예외 처리기 메서드를 정의할 수 있습니다. 필요한 것은 @ExceptionHandler 주석으로 이러한 메서드에 주석을 추가하는 것입니다.

전역 예외 처리기 – 예외 처리는 교차 관심사이며 Spring은 전역 예외 처리기를 정의하기 위해 모든 클래스와 함께 사용할 수 있는 @ControllerAdvice 주석을 제공합니다.

HandlerExceptionResolver 구현 – 일반 예외의 경우 대부분 정적 페이지를 제공합니다. Spring Framework는 전역 예외 핸들러를 생성하기 위해 구현할 수 있는 HandlerExceptionResolver 인터페이스를 제공합니다. 전역 예외 처리기를 정의하는 이 추가 방법 뒤에 있는 이유는 Spring 프레임워크가 Spring 프레임워크 예외 처리 이점을 얻기 위해 Spring Bean 구성 파일에서 정의할 수 있는 기본 구현 클래스도 제공하기 때문입니다.

전체 예제를 보려면 Spring Exception Handling Example을 읽으십시오.

29. Java 프로그램에서 ApplicationContext를 생성하는 방법은 무엇입니까?

독립형 자바 프로그램에서 스프링 컨텍스트를 생성하는 방법은 다음과 같습니다.

  1. AnnotationConfigApplicationContext: 독립형 Java 애플리케이션에서 Spring을 사용하고 구성에 주석을 사용하는 경우 이를 사용하여 컨테이너를 초기화하고 빈 개체를 가져올 수 있습니다.
  2. ClassPathXmlApplicationContext: 독립 실행형 애플리케이션에 스프링 빈 구성 XML 파일이 있는 경우 이 클래스를 사용하여 파일을 로드하고 컨테이너 개체를 가져올 수 있습니다.
  3. FileSystemXmlApplicationContext: XML 구성 파일을 파일 시스템의 어느 곳에서나 로드할 수 있다는 점을 제외하면 ClassPathXmlApplicationContext와 유사합니다.

30. Spring 구성 파일을 여러 개 가질 수 있습니까?

Spring MVC 애플리케이션의 경우 contextConfigLocation을 통해 여러 스프링 컨텍스트 구성 파일을 정의할 수 있습니다. 이 위치 문자열은 쉼표와 공백으로 구분된 여러 위치로 구성될 수 있습니다. 예를 들어;

<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
            <param-name>contextConfigLocation</param-name>
	    <param-value>/WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

또한 여러 루트 수준 스프링 구성을 정의하고 context-param을 통해 로드할 수 있습니다. 예를 들어;

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml</param-value>
</context-param>

또 다른 옵션은 컨텍스트 구성 파일에서 가져오기 요소를 사용하여 다른 구성을 가져오는 것입니다. 예를 들면 다음과 같습니다.

<beans:import resource="spring-jdbc.xml"/>

31. ContextLoaderListener란 무엇입니까?

ContextLoaderListener는 루트 컨텍스트를 로드하고 다른 모든 컨텍스트에 표시될 스프링 빈 구성을 정의하는 데 사용되는 리스너 클래스입니다. web.xml 파일에서 다음과 같이 구성됩니다.

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
	
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

32. Spring MVC 애플리케이션을 생성하는 데 필요한 최소 구성은 무엇입니까?

간단한 Spring MVC 애플리케이션을 생성하려면 다음 작업을 수행해야 합니다.

  • 프로젝트에 spring-contextspring-webmvc 종속성을 추가합니다.
  • spring 컨테이너를 통해 요청을 처리하도록 web.xml 파일에서 DispatcherServlet을 구성합니다.
  • 빈을 정의하기 위한 Spring bean 구성 파일, 주석을 사용하는 경우 여기에서 구성해야 합니다. 또한 뷰 페이지에 대한 뷰 리졸버를 구성해야 합니다.
  • 클라이언트 요청을 처리하기 위해 정의된 요청 매핑이 있는 컨트롤러 클래스.

위의 단계는 간단한 Spring MVC Hello World 애플리케이션을 만드는 데 충분해야 합니다.

33. Spring MVC 프레임워크를 MVC 아키텍처와 어떻게 연결하시겠습니까?

이름에서 알 수 있듯이 Spring MVC는 Model-View-Controller 아키텍처 위에 구축됩니다. DispatcherServlet은 들어오는 모든 요청을 처리하고 다른 컨트롤러 핸들러 메서드에 위임하는 Spring MVC 애플리케이션의 프런트 컨트롤러입니다.

모델은 다른 MVC 프레임워크와 마찬가지로 Spring 프레임워크의 모든 Java Bean이 될 수 있습니다. Spring은 양식 데이터를 Java Bean에 자동으로 바인딩합니다. 보기 페이지에서 사용할 속성으로 모델 빈을 설정할 수 있습니다.

보기 페이지는 JSP, 정적 HTML 등이 될 수 있으며 보기 확인자는 올바른 보기 페이지를 찾는 역할을 합니다. 보기 페이지가 식별되면 DispatcherServlet 컨트롤러에 제어가 다시 제공됩니다. DispatcherServlet은 뷰를 렌더링하고 최종 응답을 클라이언트에 반환하는 일을 담당합니다.

34. Spring MVC 애플리케이션에서 현지화를 달성하는 방법은 무엇입니까?

Spring은 리소스 번들을 통해 현지화 또는 i18n에 대한 탁월한 지원을 제공합니다. 애플리케이션을 현지화하는 데 필요한 기본 단계는 다음과 같습니다.

  • message_en.properties, messages_fr.properties 등과 같은 다양한 로케일에 대한 메시지 리소스 번들 생성
  • ResourceBundleMessageSource 또는 ReloadableResourceBundleMessageSource 유형의 스프링 빈 구성 파일에서 messageSource 빈을 정의합니다.
  • 로케일 지원 변경을 위해 CookieLocaleResolver 유형의 localeResolver 빈을 정의하고 LocaleChangeInterceptor 인터셉터를 구성합니다. 구성 예는 다음과 같습니다.

<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
 
<beans:bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <beans:property name="defaultLocale" value="en" />
    <beans:property name="cookieName" value="myAppLocaleCookie"></beans:property>
    <beans:property name="cookieMaxAge" value="3600"></beans:property>
</beans:bean>
 
<interceptors>
    <beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <beans:property name="paramName" value="locale" />
    </beans:bean>
</interceptors>

  • 보기 페이지에서 키 이름이 있는 spring:message 요소를 사용하면 DispatcherServlet이 해당 값을 선택하고 해당 로케일에서 페이지를 렌더링하고 응답으로 반환합니다.

전체 예제를 보려면 Spring Localization Example을 읽어보세요.

35. Spring을 사용하여 JSON 응답을 반환하는 Restful Web Service를 생성하려면 어떻게 해야 합니까?

Spring Framework를 사용하여 JSON 데이터를 반환하는 Restful 웹 서비스를 만들 수 있습니다. Spring은 편안한 웹 서비스에서 JSON 응답을 보내는 데 사용할 수 있는 Jackson JSON API와의 통합을 제공합니다.

JSON 응답을 보내도록 Spring MVC 애플리케이션을 구성하려면 다음 단계를 수행해야 합니다.

1. Maven을 사용하는 경우 Jackson JSON 종속성을 추가하려면 다음 코드를 사용하여 수행할 수 있습니다.

<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.databind-version}</version>
</dependency>

2. spring bean 구성 파일에서 RequestMappingHandlerAdapter bean을 구성하고 메시지 변환기 속성을 MappingJackson2HttpMessageConverter bean으로 설정합니다. 샘플 구성은 다음과 같습니다.

<!-- Configure to plugin JSON as request and response in method handler -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <beans:property name="messageConverters">
        <beans:list>
            <beans:ref bean="jsonMessageConverter"/>
        </beans:list>
    </beans:property>
</beans:bean>
     
<!-- Configure bean to convert JSON to POJO and vice versa -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>

3. 컨트롤러 핸들러 메서드에서 @ResponseBody 주석을 사용하여 객체를 응답으로 반환합니다. 샘플 코드:

@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) {
    logger.info("Start getEmployee. ID="+empId);
     
    return empData.get(empId);
}

4. REST 서비스는 어떤 API를 통해서도 호출할 수 있지만 Spring을 사용하고 싶다면 RestTemplate 클래스를 사용하면 쉽게 할 수 있다.

전체 예제를 보려면 Spring Restful Webservice 예제를 읽어보세요.

36. 사용한 중요한 Spring 주석은 무엇입니까?

내 프로젝트에서 사용한 일부 Spring 주석은 다음과 같습니다.

  • @Controller – Spring MVC 프로젝트의 컨트롤러 클래스용.
  • Spring MVC RequestMapping 주석 예시
  • @ResponseBody – 객체를 응답으로 전송하기 위해, 일반적으로 XML 또는 JSON 데이터를 응답으로 전송하기 위해.
  • @PathVariable – URI의 동적 값을 핸들러 메서드 인수에 매핑합니다.
  • @Autowired - 스프링 빈의 종속성을 자동으로 연결합니다.
  • 빈 유형의 여러 인스턴스가 존재할 때 혼동을 피하기 위한 @Autowired 주석.
  • @Service – 서비스 클래스용.
  • @Scope – Spring Bean의 범위를 구성합니다.
  • @Bean – Java 기반 구성용.
  • Aspect 및 어드바이스 구성을 위한 AspectJ 주석, @Pointcut 등

37. 컨트롤러 핸들러 메서드의 응답으로 객체를 보낼 수 있습니까?

예, @ResponseBody 주석을 사용하면 가능합니다. 편안한 웹 서비스에서 JSON 또는 XML 기반 응답을 보내는 방법입니다.

38. Spring MVC 애플리케이션에서 파일을 업로드하는 방법은 무엇입니까?

Spring은 MultipartResolver 인터페이스 구현을 통해 파일을 업로드하기 위한 내장 지원을 제공합니다. 사용하기가 매우 쉽고 구성을 변경하기만 하면 작동합니다. 들어오는 파일을 처리하고 처리하기 위해 컨트롤러 핸들러 메서드를 작성해야 합니다. 전체 예제는 Spring 파일 업로드 예제를 참조하세요.

39. Spring Web MVC 프레임워크에서 폼 데이터의 유효성을 검사하는 방법은 무엇입니까?

Spring은 JSR-303 주석 기반 유효성 검사를 지원하고 사용자 정의 유효성 검사기를 만들기 위해 구현할 수 있는 유효성 검사기 인터페이스를 제공합니다. JSR-303 기반 유효성 검사를 사용하려면 필요한 유효성 검사로 빈 변수에 주석을 달아야 합니다.

사용자 지정 유효성 검사기 구현을 위해 컨트롤러 클래스에서 구성해야 합니다. 전체 예제를 보려면 Spring MVC 양식 유효성 검사 예제를 읽어보세요.

40. Spring MVC Interceptor는 무엇이고 어떻게 사용하나요?

Spring MVC 인터셉터는 서블릿 필터와 같으며 클라이언트 요청을 가로채서 처리할 수 있습니다. preHandle, postHandle 및 afterCompletion의 세 위치에서 클라이언트 요청을 가로챌 수 있습니다.

HandlerInterceptor 인터페이스를 구현하거나 추상 클래스 HandlerInterceptorAdapter를 확장하여 스프링 인터셉터를 만들 수 있습니다.

스프링 빈 구성 파일에서 인터셉터를 구성해야 합니다. 모든 클라이언트 요청을 가로채기 위해 인터셉터를 정의하거나 특정 URI 매핑에 대해 구성할 수도 있습니다. 자세한 예제는 Spring MVC 인터셉터 예제를 참조하세요.

41. Spring JdbcTemplate 클래스는 무엇이고 어떻게 사용하나요?

Spring Framework는 JDBC API와의 탁월한 통합을 제공하며 연결 열기/닫기, ResultSet, PreparedStatement 등과 같은 데이터베이스 작업 논리에서 bolier-plate 코드를 방지하는 데 사용할 수 있는 JdbcTemplate 유틸리티 클래스를 제공합니다.

JdbcTemplate 예제는 Spring JDBC 예제를 참조하십시오.

42. Spring 웹 애플리케이션에서 Tomcat JNDI DataSource를 사용하는 방법은 무엇입니까?

서블릿 컨테이너 구성 JNDI DataSource를 사용하려면 Spring Bean 구성 파일에서 구성한 다음 종속성으로 Spring Bean에 주입해야 합니다. 그런 다음 JdbcTemplate과 함께 사용하여 데이터베이스 작업을 수행할 수 있습니다.

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

전체 예제는 Spring Tomcat JNDI 예제를 참조하십시오.

43. Spring에서 트랜잭션 관리를 어떻게 달성하시겠습니까?

Spring 프레임워크는 Declarative Transaction Management와 프로그래밍 방식의 트랜잭션 관리를 통해 트랜잭션 관리 지원을 제공합니다. 선언적 트랜잭션 관리는 사용하기 쉽고 대부분의 경우에 작동하기 때문에 가장 널리 사용됩니다.

선언적 트랜잭션 관리를 위해 메서드에 @Transactional 주석을 추가합니다. Spring Bean 구성 파일에서 DataSource에 대한 트랜잭션 관리자를 구성해야 합니다.

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

44. 스프링 DAO란?

Spring DAO 지원은 JDBC, Hibernate와 같은 데이터 액세스 기술과 일관되고 쉬운 방식으로 작동하도록 제공됩니다. 예를 들어 각 기술에 대해 JdbcDaoSupport, HibernateDaoSupport, JdoDaoSupport 및 JpaDaoSupport가 있습니다.

Spring DAO는 또한 예외 계층 구조의 일관성을 제공하므로 특정 예외를 잡을 필요가 없습니다.

45. Spring과 Hibernate 프레임워크를 통합하는 방법은 무엇입니까?

Spring ORM 모듈을 사용하여 Spring 및 Hibernate 프레임워크를 통합할 수 있습니다. SessionFactory가 현재 세션을 제공하는 Hibernate 3+를 사용하는 경우 HibernateTemplate 또는 HibernateDaoSupport 클래스를 사용하지 말고 통합을 위해 종속성 주입과 함께 DAO 패턴을 사용하는 것이 좋습니다.

Spring ORM은 Spring 선언적 트랜잭션 관리를 사용하기 위한 지원을 제공하므로 트랜잭션 관리를 위해 Hibernate 상용구 코드를 사용하는 대신 이를 활용해야 합니다.

더 나은 이해를 위해 다음 자습서를 진행해야 합니다.

  • Spring Hibernate 통합 예제
  • Spring MVC Hibernate 통합 예제

46. 스프링 시큐리티란?

Spring 보안 프레임워크는 Java 애플리케이션에서 인증과 권한 부여를 모두 제공하는 데 중점을 둡니다. 또한 CSRF 공격과 같은 일반적인 보안 취약점 대부분을 처리합니다.

@EnableWebSecurity와 같은 주석을 사용하여 웹 애플리케이션에서 Spring 보안을 사용하는 것은 매우 유익하고 쉽습니다. Spring Security 프레임워크를 사용하는 방법을 배우려면 다음 게시물을 살펴봐야 합니다.

  • 서블릿 웹 애플리케이션의 스프링 보안
  • Spring MVC 및 Spring Security 통합 예제

47. Spring Bean에 java.util.Properties를 주입하는 방법은 무엇입니까?

주어진 속성 파일에서 속성을 로드할 propertyConfigurer 빈을 정의해야 합니다. 그런 다음 Spring EL 지원을 사용하여 속성을 다른 빈 종속성에 주입할 수 있습니다. 예를 들어:

<bean id="propertyConfigurer" 
  class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location" value="/WEB-INF/application.properties" />
</bean> 

<bean class="com.journaldev.spring.EmployeeDaoImpl">
    <property name="maxReadResults" value="${results.read.max}"/>
</bean>

주석을 사용하여 Spring Bean을 구성하는 경우 아래와 같이 속성을 주입할 수 있습니다.

@Value("${maxReadResults}") 
private int maxReadResults;

48. Spring Framework에서 사용되는 디자인 패턴의 이름은 무엇입니까?

Spring Framework는 많은 디자인 패턴을 사용하고 있으며 일반적인 패턴 중 일부는 다음과 같습니다.

  1. 싱글톤 패턴: 기본 범위로 빈 생성
  2. 팩토리 패턴: 빈 팩토리 클래스
  3. 프로토타입 패턴: 빈 스코프
  4. 어댑터 패턴: Spring Web 및 Spring MVC
  5. 프록시 패턴: Spring Aspect Oriented 프로그래밍 지원
  6. 템플릿 메서드 패턴: JdbcTemplate, HibernateTemplate 등
  7. 전면 컨트롤러: Spring MVC DispatcherServlet
  8. 데이터 액세스 개체: Spring DAO 지원
  9. 의존성 주입 및 측면 지향 프로그래밍

49. Spring Framework의 모범 사례는 무엇입니까?

Spring Framework의 몇 가지 모범 사례는 다음과 같습니다.

  • 최신 구성을 유지하려면 스키마 참조에 버전 번호를 사용하지 마세요.
  • spring-jdbc.xml, spring-security.xml과 같은 관심사에 따라 Spring Bean 구성을 나눕니다.
  • Spring MVC에서 여러 컨텍스트에서 사용되는 Spring Bean의 경우 루트 컨텍스트에서 생성하고 리스너로 초기화합니다.
  • 가능한 한 bean 종속성을 구성하고 가능한 한 자동 배선을 피하십시오.
  • 애플리케이션 수준 속성의 경우 가장 좋은 방법은 속성 파일을 만들고 Spring Bean 구성 파일에서 읽는 것입니다.
  • 작은 응용 프로그램의 경우 주석이 유용하지만 큰 응용 프로그램의 경우 주석이 어려울 수 있습니다. XML 파일에 모든 구성이 있으면 유지 관리가 더 쉬울 것입니다.
  • 목적을 쉽게 이해할 수 있도록 구성 요소에 올바른 주석을 사용하십시오. 서비스의 경우 @Repository를 사용하십시오.
  • Spring 프레임워크에는 많은 모듈이 있으므로 필요한 것을 사용하십시오. Spring Tool Suite 템플릿을 통해 프로젝트를 생성할 때 일반적으로 추가되는 모든 추가 종속성을 제거합니다.
  • Aspects를 사용하는 경우 원치 않는 방법에 대한 조언을 피하기 위해 조인 핀트를 가능한 한 좁게 유지해야 합니다. 사용하기 쉽고 문제를 방지하는 맞춤 주석을 고려하세요.
  • 실제 이점이 있을 때 종속성 주입을 사용하세요. 느슨한 결합을 위해서라면 유지 관리가 더 어렵기 때문에 사용하지 마세요.

50. 스프링부트란?

Spring Boot는 스프링 프레임워크를 독특하게 만듭니다. 다양한 유형의 Java 애플리케이션을 생성하고 서블릿 컨테이너 런타임 환경에 연결할 수 있는 쉬운 방법을 제공합니다. 따라서 프로젝트를 실행하기 위해 실행할 수 있는 단일 JAR 파일을 얻습니다. 이렇게 하면 제품 배포 준비가 된 골격 프로젝트를 매우 빠르게 가져오는 데 많은 시간을 절약할 수 있습니다. 이렇게 하면 코드를 빌드한 다음 서블릿 컨테이너에 배포하는 일반적인 프로세스를 거치지 않고 비즈니스 논리에 더 집중할 수 있습니다. 매우 광범위한 주제이므로 Spring Boot 인터뷰 질문을 살펴보는 것이 좋습니다.

Spring Framework 면접 질문은 여기까지입니다. 이 질문들이 다가오는 Java EE 인터뷰에 도움이 되기를 바랍니다. 질문을 찾는 즉시 목록에 더 많은 질문을 계속 추가하겠습니다. 목록에 포함되어야 하는 몇 가지 질문을 더 알고 있는 경우 해당 질문에 대한 의견을 추가하면 포함하겠습니다.