Spring 인터뷰 질문 및 답변

I have posted a lot of Spring Tutorials recently. This post will help you get through Spring interview Questions explaining the core concepts in detail.

Spring Framework은 웹 애플리케이션을 위한 가장 인기 있는 Java EE 프레임워크 중 하나입니다. 의존성 주입과 관점 지향 프로그래밍은 Spring 프레임워크의 핵심입니다. Spring Framework에 능숙하다면, Java 인터뷰에서 선택될 확률이 실제로 높아집니다.

전문 팁: 코어 자바는 모든 Java 기반 프레임워크의 기반이므로, 인터뷰 준비 중이라면 반드시 코어 자바 인터뷰 질문자바 인터뷰 질문 문서를 참고하세요.

Spring 인터뷰 질문과 답변

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

1. Spring Framework란 무엇인가요?

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

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

I like spring because it provides a lot of features and different modules for specific tasks such as Spring MVC and Spring JDBC. Since it’s an open-source framework with a lot of online resources and active community members, working with the Spring framework is easy and fun at the same time.

추천 독서: Spring Framework

2. Spring Framework의 중요한 기능은 무엇인가요?

스프링 프레임워크는 의존성 주입과 관점 지향 프로그래밍이라는 두 가지 디자인 개념 위에 구축되었습니다.

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

  • 경량화되어 개발에 프레임워크를 사용하는 데 거의 부담이 없습니다.
  • 의존성 주입 또는 제어 반전을 사용하여 서로 독립적인 구성 요소를 작성하고, 스프링 컨테이너가 이를 연결하여 작업을 수행합니다.
  • Spring IoC 컨테이너는 Spring Bean의 생명주기와 JNDI 조회와 같은 프로젝트별 구성을 관리합니다.
  • Spring MVC 프레임워크는 웹 응용 프로그램 및 XML 및 JSON 응답을 반환할 수 있는 restful 웹 서비스를 만드는 데 사용할 수 있습니다.
  • 트랜잭션 관리, JDBC 작업, 파일 업로드, 예외 처리 등을 지원하며 주석 또는 Spring Bean 구성 파일을 사용하여 매우 적은 구성으로 가능합니다.

3. Spring Framework를 사용하는 장점은 무엇입니까?

Spring Framework를 사용하는 장점 중 일부는 다음과 같습니다:

  • 애플리케이션의 다른 구성 요소 간 직접 종속성을 줄입니다. Spring IoC 컨테이너는 리소스 또는 Bean을 초기화하고 종속성으로 주입합니다.
  • Spring 프레임워크에서 단위 테스트 케이스를 작성하는 것이 쉽습니다. 비즈니스 로직이 실제 리소스 구현 클래스에 직접 종속되지 않기 때문입니다. 테스트 구성을 쉽게 작성하고 테스트 목적으로 모의 Bean을 주입할 수 있습니다.
  • 객체 초기화, 리소스 오픈/닫기와 같은 불필요한 코드의 양을 줄입니다. JDBC 프로그래밍과 관련된 모든 불필요한 코드를 제거하는 데 도와주는 JdbcTemplate 클래스가 마음에 듭니다.
  • Spring 프레임워크는 여러 모듈로 나눠져 있으며, 애플리케이션을 가볍게 유지하는 데 도움을 줍니다. 예를 들어, 만약 Spring 트랜잭션 관리 기능이 필요하지 않다면, 해당 종속성을 프로젝트에 추가할 필요가 없습니다.
  • Spring 프레임워크는 대부분의 Java EE 기능과 더 나아가는 기능을 지원합니다. 항상 최신 기술을 적용하고 있으며, 예를 들어 Android용 Spring 프로젝트가 있어 네이티브 Android 애플리케이션에 더 나은 코드를 작성하는 데 도움이 됩니다. 이로써 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 WebFlux를 통해 반응형 프로그래밍을 Spring에 도입합니다.
  • JUnit 5를 지원합니다.
  • 클래스패스 스캐닝 대신 “META-INF/spring.components” 인덱스 파일을 통해 스프링 컴포넌트 정보를 제공하는 지원.

자세한 내용은 Spring 5 기능을 참조하세요.

5. 스프링 WebFlux란?

스프링 WebFlux는 스프링 5에서 도입된 새로운 모듈입니다. 스프링 WebFlux는 스프링 프레임워크에서 반응형 프로그래밍 모델로 나아가는 첫 번째 단계입니다.

스프링 WebFlux는 스프링 MVC 모듈의 대안입니다. 스프링 WebFlux는 이벤트 루프 실행 모델을 기반으로 완전히 비동기적이고 논블로킹 애플리케이션을 만드는 데 사용됩니다.

더 자세한 내용은 스프링 WebFlux 튜토리얼에서 읽어볼 수 있습니다.

6. 의존성 주입이란 무엇인가요?

의존성 주입 디자인 패턴을 사용하면 하드코딩된 의존성을 제거하고 애플리케이션을 느슨하게 결합시키고 확장 가능하며 유지보수가능하게 만들 수 있습니다. 의존성 주입 패턴을 구현하여 의존성 해결을 컴파일 시간에서 런타임으로 이동시킬 수 있습니다.

의존성 주입 사용의 일부 이점은 관심사 분리, 보일러플레이트 코드 감소, 구성 가능한 구성 요소 및 쉬운 단위 테스트입니다.

Dependency Injection Tutorial에서 자세히 알아보세요. 의존성 주입의 자동화를 위해 Google Guice를 사용할 수도 있습니다. 그러나 대부분의 경우, 우리는 의존성 주입 이상을 찾고 있으며 그것이 Spring이 최고로 인정받는 이유입니다.

7. Spring 프레임워크에서 DI를 어떻게 구현합니까?

Spring 애플리케이션에서 DI를 구현하기 위해 Spring XML 기반 및 주석 기반 구성을 사용할 수 있습니다. 더 잘 이해하기 위해 Spring Dependency Injection 예제를 읽어보세요. 여기에서 JUnit 테스트 케이스와 함께 두 가지 방법을 배울 수 있습니다. 이 게시물에는 샘플 프로젝트 압축 파일도 포함되어 있어서 더 많은 것을 배우고 싶다면 다운로드하여 실험할 수 있습니다.

8. Spring Tool Suite 사용의 이점은 무엇인가요?

우리는 이클립스에 플러그인을 설치하여 Spring Tool Suite의 모든 기능을 얻을 수 있습니다. 그러나 STS는 Maven 지원, 다양한 종류의 Spring 프로젝트를 생성하기 위한 템플릿, Spring 애플리케이션의 성능 향상을 위한 tc server와 같은 기타 중요한 기능들을 갖춘 Eclipse와 함께 제공됩니다.

I like STS because it highlights the Spring components and if you are using AOP pointcuts and advice, then it clearly shows which methods will come under the specific pointcut. So rather than installing everything on our own, I prefer using STS when developing Spring-based applications.

9. 몇 가지 중요한 Spring 모듈의 이름을 말씀해주세요.

중요한 몇 가지 Spring Framework 모듈은 다음과 같습니다:

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

Aspect-Oriented Programming(관점 지향 프로그래밍)이란 무엇을 이해하고 있습니까?

기업 애플리케이션에는 로깅, 트랜잭션 관리, 데이터 유효성 검사, 인증 등과 같은 일반적인 교차 관심사가 있으며, 이는 다양한 유형의 객체 및 애플리케이션 모듈에 적용됩니다. 애플리케이션의 모듈성은 객체 지향 프로그래밍의 클래스에 의해 달성됩니다. AOP에서는 관점(Aspects)에 의해 애플리케이션의 모듈성이 달성되며, 이러한 관점은 다른 클래스 메서드를 가로지르도록 구성됩니다.

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

AOP에서 Aspect, Advice, Pointcut, JointPoint 및 Advice Arguments는 무엇입니까?

측면: 측면은 트랜잭션 관리와 같은 횡단 관심사를 구현하는 클래스입니다. 측면은 일반 클래스로 구성되어 Spring Bean 구성 파일에 구성하거나 Spring AspectJ 지원을 사용하여 클래스를 측면으로 선언할 수 있습니다. @Aspect 주석을 사용합니다.

조언: 조언은 특정 결합 지점에 대한 조치입니다. 프로그래밍 관점에서는 응용 프로그램에서 일치하는 포인트컷을 가진 특정 결합 지점이 도달될 때 실행되는 메서드입니다. 조언을 Spring 인터셉터 또는 Servlet 필터로 생각할 수 있습니다.

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

결합 지점: 결합 지점은 메서드 실행, 예외 처리, 객체 변수 값 변경 등과 같은 응용 프로그램의 특정 지점입니다. Spring AOP에서 결합 지점은 항상 메서드 실행입니다.

조언 인수: 우리는 조언 메서드에서 인수를 전달할 수 있습니다. 우리는 인수 패턴과 일치하는 메서드에 적용될 포인트컷에서 args() 표현식을 사용할 수 있습니다. 이를 사용하면 인수 유형이 결정된 조언 메서드에서 동일한 이름을 사용해야 합니다.

이러한 개념들은 처음에 혼란스러울 수 있지만, 스프링 관점, 조언 예제를 통해 쉽게 연관시킬 수 있습니다.

12. 스프링 AOP와 AspectJ AOP의 차이점은 무엇인가요?

AspectJ는 관점 지향 프로그래밍의 산업 표준 구현체이며, 스프링은 일부 경우에 대해 AOP를 구현합니다. 스프링 AOP와 AspectJ의 주요 차이점은 다음과 같습니다:

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

13. Spring IoC 컨테이너란 무엇인가요?

제어의 역전 (IoC)은 객체 의존성 간에 느슨한 결합을 달성하는 메커니즘입니다. 런타임에서 객체의 느슨한 결합과 동적 바인딩을 달성하기 위해 객체는 다른 조립기 객체에 의해 주입되는 종속성을 정의합니다. Spring IoC 컨테이너는 종속성을 객체에 주입하고 사용할 수 있게 만드는 프로그램입니다.

Spring 프레임워크 IoC 컨테이너 클래스는 org.springframework.beansorg.springframework.context 패키지의 일부이며 객체 의존성을 분리하는 다양한 방법을 제공합니다.

사용하는 몇 가지 유용한 ApplicationContext 구현은 다음과 같습니다;

  • AnnotationConfigApplicationContext: 주석 기반 구성을 사용하는 독립형 자바 응용 프로그램에 대한 것입니다.
  • ClassPathXmlApplicationContext: XML 기반 구성을 사용하는 독립형 자바 응용 프로그램에 대한 것입니다.
  • FileSystemXmlApplicationContext: ClassPathXmlApplicationContext와 유사하지만 XML 구성 파일을 파일 시스템의 어디에서나로드 할 수 있습니다.
  • AnnotationConfigWebApplicationContext 및 XmlWebApplicationContext는 웹 응용 프로그램에 대한 것입니다.

14. 무엇이 스프링 빈인가요?

스프링 IoC 컨테이너에서 초기화된 일반적인 자바 클래스를 스프링 빈이라고 합니다. 우리는 Spring ApplicationContext를 사용하여 Spring Bean 인스턴스를 얻습니다.

Spring IoC 컨테이너는 Spring Bean의 생명주기, 빈 스코프 및 빈에 필요한 종속성을 주입하는 것을 관리합니다.

15. 스프링 빈 구성 파일의 중요성은 무엇인가요?

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

스프링 빈 구성 이외에도 이 파일은 스프링 MVC 인터셉터, 뷰 리졸버 및 주석 기반 구성을 지원하기 위한 다른 요소도 포함하고 있습니다.

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

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

XML 구성: 이것은 가장 인기 있는 구성 방법이며 컨텍스트 파일에서 빈 요소를 사용하여 Spring Bean을 구성할 수 있습니다. 예를 들어:

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

Java 기반 구성: 어노테이션만 사용하는 경우에는 @Bean 어노테이션을 사용하여 Spring 빈을 구성할 수 있습니다. 이 어노테이션은 @Configuration 클래스와 함께 사용되어 spring 빈을 구성합니다. 샘플 구성은 다음과 같습니다:

@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);

어노테이션 기반 구성: 또한 클래스에 @Component, @Service, @Repository@Controller 어노테이션을 사용하여 spring 빈으로 구성할 수 있습니다. 이를 위해 이러한 클래스를 스캔할 기본 패키지 위치를 제공해야 합니다. 예를 들어:

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

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

Spring Bean에는 다섯 가지 범위가 정의되어 있습니다.

  1. singleton: 컨테이너당 빈의 인스턴스가 하나만 생성됩니다. 이것은 스프링 빈의 기본 범위입니다. 이 범위를 사용할 때는 스프링 빈에 공유 인스턴스 변수가 없어야 하며, 그렇지 않으면 스레드 안전하지 않아 데이터 일관성 문제를 일으킬 수 있습니다.
  2. prototype: 빈이 요청될 때마다 새 인스턴스가 생성됩니다.
  3. request: 이것은 프로토타입 범위와 같지만 웹 애플리케이션에 사용됩니다. HTTP 요청마다 빈의 새 인스턴스가 생성됩니다.
  4. session: 컨테이너에 의해 각 HTTP 세션마다 새로운 빈이 생성됩니다.
  5. global-session: 이것은 포틀릿 애플리케이션을 위한 전역 세션 빈을 생성하는 데 사용됩니다.

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

18. 봄 빈의 생명주기는 무엇인가요?

봄 빈은 봄 컨테이너에 의해 초기화되며 모든 종속성이 주입됩니다. 컨텍스트가 파괴될 때 모든 초기화된 빈도 파괴됩니다. 대부분의 경우 이것은 잘 작동하지만 때로는 빈을 사용할 준비가 되기 전에 다른 리소스를 초기화하거나 유효성을 검사하고 싶을 수 있습니다. 봄 프레임워크는 봄 빈에서 사후 초기화 및 사전 소멸 메서드를 지원합니다.

이를 두 가지 방법으로 수행할 수 있습니다. InitializingBeanDisposableBean 인터페이스를 구현하거나 봄 빈 구성에서 init-methoddestroy-method 속성을 사용하는 것입니다. 자세한 내용은 봄 빈 생명주기 메서드를 참조하십시오.

19. 봄 빈에서 ServletContext 및 ServletConfig 객체를 어떻게 얻을 수 있나요?

봄 빈에서 컨테이너별 객체를 얻는 두 가지 방법이 있습니다.

  • 구현 중인 Spring *Aware 인터페이스에 대해 말하면, 이 ServletContextAware 및 ServletConfigAware 인터페이스에 대한 완전한 예제는 Spring Aware Interfaces를 참조하십시오.
  • @Autowired 주석을 ServletContextServletConfig 유형의 빈 변수와 함께 사용합니다. 이것들은 서블릿 컨테이너 특정 환경에서만 작동합니다.
@Autowired
ServletContext servletContext;

20. 빈 배선 및 @Autowired 주석이 무엇인가요?

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

보통은 모든 빈 종속성을 명시적으로 배선하는 것이 가장 좋지만, 스프링 프레임워크는 또한 자동 배선을 지원합니다. 우리는 @Autowired 주석을 자동 배선 byType에 대한 필드 또는 메서드와 함께 사용할 수 있습니다. 이 주석이 작동하려면 스프링 빈 구성 파일에서 어노테이션 기반 구성을 활성화해야합니다. 이는 context:annotation-config 요소로 수행 할 수 있습니다.

@Autowired 주석에 대한 자세한 내용은 Spring Autowire Example를 참조하십시오.

21. Spring Bean 자동 배선의 다양한 유형은 무엇입니까?

스프링 프레임워크에는 네 가지 유형의 자동 배선이 있습니다.

  1. 이름에 의한 자동 배선
  2. 유형별 자동 배선
  3. 생성자에 의한 자동 배선
  4. @Autowired@Qualifier 주석으로 자동 배선

스프링 3.1 이전에는 자동 감지에 의한 자동 배선도 지원되었으며 이는 생성자 또는 유형별 자동 배선과 유사했습니다. 이러한 옵션에 대한 자세한 내용은 Spring Bean Autowiring을 참조하십시오.

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

Spring bean의 기본 범위는 싱글톤이므로 컨텍스트 당 하나의 인스턴스만 있습니다. 이는 모든 스레드가 업데이트할 수 있는 클래스 수준 변수가 있음을 의미합니다. 따라서 기본 모드에서 스프링 빈은 스레드 안전하지 않습니다.

그러나 우리는 성능의 대가로 스레드 안전성을 달성하기 위해 스프링 빈의 범위를 요청(request), 프로토타입(prototype) 또는 세션(session)으로 변경할 수 있습니다. 이것은 설계 결정이며 프로젝트 요구 사항에 기반합니다.

23. Spring MVC에서 Controller란 무엇인가요?

MVC 디자인 패턴과 마찬가지로, Controller는 모든 클라이언트 요청을 처리하고 이를 구성된 리소스로 보내는 클래스입니다. Spring MVC에서 DispatcherServlet은 스프링 빈 구성에 따라 컨텍스트를 초기화하는 프론트 컨트롤러 클래스입니다.

A Controller class is responsible to handle a different kind of client requests based on the request mappings. We can create a controller class by using @Controller annotation. Usually, it’s used with @RequestMapping annotation to define handler methods for specific URI mapping.

24. Spring에서 @Component, @Controller, @Repository@Service 주석의 차이점은 무엇인가요?

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

@Controller는 MVC 애플리케이션에서 사용되는 특정 유형의 구성 요소로, 주로 RequestMapping 주석과 함께 사용됩니다.

@Repository 주석은 구성 요소가 저장소로 사용되며 데이터를 저장/검색하는 메커니즘임을 나타냅니다. 이 주석은 DAO 패턴 구현 클래스와 함께 적용할 수 있습니다.

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

위의 어노테이션 중 어느 것이든 클래스에 자동 감지를 위해 사용할 수 있지만, 목적을 쉽게 구별할 수 있도록 다른 유형이 제공됩니다.

25. DispatcherServlet 및 ContextLoaderListener란 무엇입니까?

DispatcherServlet는 Spring MVC 애플리케이션의 프론트 컨트롤러이며 스프링 빈 구성 파일을 로드하고 구성된 모든 빈을 초기화합니다. 주석이 활성화된 경우 패키지를 스캔하고 @Component, @Controller, @Repository, 또는 @Service 주석이 달린 빈을 구성합니다.

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

26. 스프링에서 ViewResolver란 무엇입니까?

ViewResolver 구현체는 이름별로 뷰 페이지를 해결하는 데 사용됩니다. 이를 스프링 빈 구성 파일에서 구성합니다. 예를 들어:

<!-- 컨트롤러에서 선택된 뷰를 /WEB-INF/views 디렉터리의 .jsp 리소스로 해석합니다. -->
<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 인터페이스의 구현 중 하나이며 빈 속성을 통해 보기 페이지 디렉터리와 접미사 위치를 제공합니다. 따라서 컨트롤러 핸들러 메서드가 “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 프레임워크는 글로벌 예외 처리기를 만들기 위해 구현할 수 있는 HandlerExceptionResolver 인터페이스를 제공합니다. 글로벌 예외 처리기를 정의하는 이 추가적인 방법의 이유는 Spring 프레임워크가 기본 구현 클래스도 제공하기 때문입니다. 이를 사용하여 spring bean 구성 파일에서 spring 프레임워크 예외 처리 혜택을 얻을 수 있습니다.

완벽한 예제를 보려면 Spring Exception Handling Example를 읽어보세요.

29. 자바 프로그램에서 ApplicationContext를 생성하는 방법은 무엇인가요?

스프링 컨텍스트를 독립적인 자바 프로그램에서 만드는 방법은 다음과 같습니다.

  1. AnnotationConfigApplicationContext: 독립적인 Java 애플리케이션에서 Spring을 사용하고 구성에 주석을 사용하는 경우에는 이를 사용하여 컨테이너를 초기화하고 빈 객체를 얻을 수 있습니다.
  2. ClassPathXmlApplicationContext: 독립적인 애플리케이션에 스프링 빈 구성 XML 파일이 있는 경우에는 이 클래스를 사용하여 파일을 로드하고 컨테이너 객체를 얻을 수 있습니다.
  3. FileSystemXmlApplicationContext: 이것은 ClassPathXmlApplicationContext와 유사하지만 XML 구성 파일을 파일 시스템의 어디에서나 로드할 수 있습니다.

30. 여러 개의 스프링 구성 파일을 가질 수 있을까요?

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

<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을 통해 여러 개의 루트 레벨 Spring 구성도 정의하고 로드할 수 있습니다. 예를 들면;

<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>

또 다른 옵션은 context 구성 파일에서 다른 구성을 가져오는 import 요소를 사용하는 것입니다. 예를 들면:

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

31. ContextLoaderListener란 무엇인가요?

ContextLoaderListener는 루트 컨텍스트를 로드하고 다른 모든 컨텍스트에서 볼 수 있는 Spring 빈 구성을 정의하는 데 사용되는 리스너 클래스입니다. 이는 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 빈 구성 파일을 구성하고, 어노테이션을 사용하는 경우 여기에서 구성해야 합니다. 또한, 뷰 페이지를 위한 뷰 리졸버를 구성해야 합니다.
  • 클라이언트 요청을 처리하기 위해 요청 매핑이 정의된 컨트롤러 클래스가 있어야 합니다.

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

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

이름에서 알 수 있듯이, Spring MVC는 모델-뷰-컨트롤러 아키텍처 위에 구축되었습니다. DispatcherServlet은 Spring MVC 애플리케이션에서 프론트 컨트롤러로서 모든 들어오는 요청을 처리하고 다른 컨트롤러 핸들러 메소드로 위임합니다.

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

뷰 페이지는 JSP, 정적 HTML 등이 될 수 있으며, 뷰 리졸버는 올바른 뷰 페이지를 찾는 역할을 담당합니다. 뷰 페이지가 식별되면 제어는 다시 DispatcherServlet 컨트롤러에게 넘겨집니다. DispatcherServlet은 뷰를 렌더링하고 최종 응답을 클라이언트에게 반환하는 역할을 담당합니다.

34. Spring MVC 애플리케이션에서 로컬라이제이션을 어떻게 구현할 수 있습니까?

Spring은 리소스 번들을 통한 로컬라이제이션 또는 i18n에 대한 훌륭한 지원을 제공합니다. 애플리케이션을 로컬라이즈하려면 다음과 같은 기본 단계가 필요합니다:

  • 다른 로캘을 위한 메시지 리소스 번들을 생성합니다. 예를 들어, messages_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 웹 서비스를 만들 수 있나요?

우리는 Spring Framework를 사용하여 JSON 데이터를 반환하는 Restful 웹 서비스를 만들 수 있습니다. Spring은 Jackson JSON API와 통합되어 있어 Restful 웹 서비스에서 JSON 응답을 보낼 수 있습니다.

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

1. Jackson JSON 종속성을 추가합니다. Maven을 사용하는 경우 다음 코드로 수행할 수 있습니다:

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

2. 스프링 빈 구성 파일에서 RequestMappingHandlerAdapter 빈을 구성하고 메시지 컨버터 속성을 MappingJackson2HttpMessageConverter 빈으로 설정합니다. 샘플 구성은 다음과 같습니다:

<!-- 메서드 핸들러에 JSON을 플러그인으로 구성합니다 -->
<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>
     
<!-- JSON을 POJO로 변환하고 반대로 변환하는 빈을 구성합니다 -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>

3. 컨트롤러 핸들러 메서드에서 Object를 응답으로 반환하고 @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 클래스를 사용하여 쉽게 수행할 수 있습니다.

완전한 예제는 스프링 Restful 웹 서비스 예제를 참조하십시오.

36. 사용한 중요한 스프링 어노테이션은 무엇인가요?

저는 프로젝트에서 다음과 같은 스프링 어노테이션을 사용했습니다:

  • @Controller – 스프링 MVC 프로젝트의 컨트롤러 클래스에 대한 어노테이션입니다.
  • @RequestMapping – 컨트롤러 핸들러 메소드의 URI 매핑을 구성하기 위한 어노테이션입니다. 이 어노테이션은 매우 중요하므로 스프링 MVC RequestMapping 어노테이션 예제를 참고해야 합니다.
  • @ResponseBody – 응답으로 Object를 보내는 데 사용되며, 일반적으로 XML 또는 JSON 데이터를 응답으로 보냅니다.
  • @PathVariable – URI에서 핸들러 메소드 인수로 동적 값 매핑을 위한 어노테이션입니다.
  • @Autowired – 봄 빈에서 의존성을 자동으로 연결하는 데 사용됩니다.
  • @Qualifier – 여러 인스턴스의 빈 유형이있을 때 @Autowired 주석을 사용하여 혼란을 피합니다.
  • @Service – 서비스 클래스에 대한 것입니다.
  • @Scope – 봄 빈의 범위를 구성하는 데 사용됩니다.
  • @Configuration, @ComponentScan, 및 @Bean – 자바 기반 구성에 사용됩니다.
  • AspectJ 주석을 사용하여 측면 및 조언을 구성하는 @Aspect, @Before, @After, @Around, @Pointcut 등이 있습니다.

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

네, @ResponseBody 주석을 사용하여 가능합니다. 이것은 RESTful 웹 서비스에서 JSON 또는 XML 기반 응답을 보내는 방법입니다.

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

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

39. Spring Web MVC Framework에서 양식 데이터를 유효성 검사하는 방법은 무엇인가요?

스프링은 JSR-303 어노테이션 기반의 유효성 검사를 지원하며 우리가 직접 사용자 정의 유효성 검사기를 만들 수 있는 Validator 인터페이스를 제공합니다. JSR-303 기반의 유효성 검사를 사용하려면 빈 변수에 필요한 유효성 검사를 어노테이션으로 지정해야 합니다.

사용자 정의 유효성 검사기를 구현하려면 이를 컨트롤러 클래스에 구성해야 합니다. 완전한 예제는 Spring MVC Form Validation Example를 참조하세요.

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

Spring MVC Interceptor는 서블릿 필터와 유사하며 클라이언트 요청을 가로채고 처리할 수 있도록 합니다. 우리는 클라이언트 요청을 세 곳에서 가로챌 수 있습니다 – preHandle, postHandle, 그리고 afterCompletion.

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

우리는 스프링 빈 구성 파일에서 인터셉터를 구성해야합니다. 클라이언트 요청을 모두 가로채도록 인터셉터를 정의할 수 있으며 특정 URI 매핑에 대해 구성할 수도 있습니다. 자세한 예는 Spring MVC 인터셉터 예제를 참조하십시오.

41. 스프링 JdbcTemplate 클래스는 무엇이며 어떻게 사용합니까?

스프링 프레임워크는 JDBC API와 우수한 통합을 제공하며 데이터베이스 작업 로직에서 boiler-plate 코드를 피할 수 있도록 JdbcTemplate 유틸리티 클래스를 제공합니다. Connection 열기/닫기, ResultSet, PreparedStatement 등.

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

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

Servlet 컨테이너 구성 JNDI DataSource를 사용하려면 스프링 빈 구성 파일에서 구성해야하며, 그런 다음 스프링 빈에 종속성으로 주입해야합니다. 그런 다음 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 Example를 참조하십시오.

43. 스프링에서 트랜잭션 관리를 어떻게 구현하나요?

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

선언적 트랜잭션 관리를 위해 메서드에 @Transactional 주석을 사용합니다. 스프링 빈 구성 파일에서 DataSource에 대한 트랜잭션 관리자를 구성해야합니다.

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

44. 스프링 DAO란 무엇입니까?

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

스프링 DAO는 예외 계층 구조에서도 일관성을 제공하므로 특정 예외를 잡을 필요가 없습니다.

45. 스프링과 하이버네이트 프레임워크를 통합하는 방법은 무엇인가요?

스프링 ORM 모듈을 사용하여 스프링과 하이버네이트 프레임워크를 통합할 수 있습니다. 하이버네이트 3+를 사용하는 경우 SessionFactory가 현재 세션을 제공하므로 HibernateTemplate이나 HibernateDaoSupport 클래스를 사용하지 않고 의존성 주입과 DAO 패턴을 사용하는 것이 좋습니다.

스프링 ORM은 스프링 선언적 트랜잭션 관리를 사용할 수 있도록 지원하므로 트랜잭션 관리를 위해 하이버네이트 보일러플레이트 코드를 사용하는 대신 그것을 활용해야 합니다.

더 잘 이해하기 위해 다음 튜토리얼을 참고해야 합니다:

46. 무엇이 스프링 보안인가요?

스프링 보안 프레임워크는 자바 애플리케이션에서 인증 및 권한 부여를 중점적으로 제공합니다. 또한 CSRF 공격과 같은 일반적인 보안 취약점에 대한 대비도 합니다.

웹 애플리케이션에서는 @EnableWebSecurity와 같은 주석을 사용하여 스프링 보안을 매우 효과적이고 쉽게 활용할 수 있습니다. 스프링 보안 프레임워크를 사용하는 방법을 학습하려면 다음 게시물을 참조해보세요.

47. 어떻게 java.util.Properties를 Spring Bean에 주입하나요?

주어진 속성 파일에서 속성을 로드하는 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>

만약 스프링 빈을 구성하는 데 주석을 사용하고 있다면, 다음과 같이 속성을 주입할 수 있습니다.

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

48. Spring Framework에서 사용되는 몇 가지 디자인 패턴의 이름을 말해보세요?

Spring Framework는 많은 디자인 패턴을 사용합니다. 일반적으로 사용되는 것 중 일부는 다음과 같습니다:

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

49. 스프링 프레임워크의 몇 가지 최상의 실천 방법은 무엇인가요?

스프링 프레임워크의 몇 가지 최상의 실천 방법은 다음과 같습니다:

  • 최신 구성을 보장하기 위해 스키마 참조에 버전 번호를 피하십시오.
  • spring-jdbc.xml, spring-security.xml과 같은 관심사를 기반으로 스프링 빈 구성을 분할하십시오.
  • Spring MVC에서 여러 컨텍스트에서 사용되는 스프링 빈의 경우, 루트 컨텍스트에서 생성하고 리스너로 초기화하십시오.
  • 가능한 한 빈 의존성을 구성하고, 가능한 한 자동 배선을 피하십시오.
  • 애플리케이션 수준의 속성의 경우, 가장 좋은 방법은 속성 파일을 만들고 스프링 빈 구성 파일에서 읽는 것입니다.
  • 더 작은 애플리케이션의 경우, 주석은 유용하지만 더 큰 애플리케이션의 경우 주석이 고통스러울 수 있습니다. 모든 구성을 XML 파일에 가지고 있다면, 유지 관리가 더 쉬워질 것입니다.
  • 컴포넌트의 목적을 쉽게 이해하기 위해 올바른 어노테이션을 사용하십시오. 서비스에는 @Service를 사용하고 DAO 빈에는 @Repository를 사용하십시오.
  • Spring 프레임워크에는 많은 모듈이 있으므로 필요한 것만 사용하십시오. Spring Tool Suite 템플릿을 통해 프로젝트를 생성할 때 일반적으로 추가되는 모든 종속성을 제거하십시오.
  • Aspect를 사용하는 경우, 불필요한 메서드에 대한 어드바이스를 피하기 위해 조인 포인트를 가능한 한 좁게 유지하십시오. 사용하기 쉬운 사용자 정의 어노테이션을 고려하고 어떠한 문제도 피하십시오.
  • 실제로 이점이 있는 경우에만 의존성 주입을 사용하십시오. 유지 관리가 어려워지기 때문에 단지 느슨한 결합을 위해서만 사용하지 마십시오.

50. 스프링 부트란 무엇인가요?

Spring Boot는 스프링 프레임워크를 독특하게 만듭니다. 다양한 유형의 Java 애플리케이션을 쉽게 만들고 서블릿 컨테이너 실행 환경과 연결하는 간편한 방법을 제공합니다. 그래서 프로젝트를 실행할 수 있는 단일 JAR 파일을 얻게 됩니다. 이렇게 하면 제품 배포 준비가 빠른 스켈레톤 프로젝트를 얻는 시간을 많이 절약할 수 있습니다. 이렇게 함으로써 우리는 코드를 빌드하고 그것을 서블릿 컨테이너에 배포하는 일반적인 프로세스를 거치는 대신에 비즈니스 로직에 더 많은 관심을 기울일 수 있습니다. 이는 매우 방대한 주제이므로 Spring Boot 인터뷰 질문을 살펴보시기를 권장합니다.

이것으로 스프링 프레임워크 인터뷰 질문에 대한 설명을 마칩니다. 이 질문들이 여러분의 Java EE 인터뷰에 도움이 되기를 바랍니다. 새로운 질문이 발견되는 대로 목록에 계속 추가하겠습니다. 목록에 포함되어야 할 추가적인 질문이 있다면 댓글에 추가하시고 포함하도록 하겠습니다.

Source:
https://www.digitalocean.com/community/tutorials/spring-interview-questions-and-answers