1. 소개

이 기사에서는 면접 중에 나타날 수있는 가장 일반적인 Spring 관련 질문 중 일부를 살펴볼 것입니다.

2. 스프링 코어

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

Spring은 Java Enterprise Edition 애플리케이션 개발에 가장 널리 사용되는 프레임 워크입니다. Spring의 핵심 기능은 모든 Java 애플리케이션 개발에 사용할 수 있습니다.

Jakarta EE 플랫폼 위에 다양한 웹 애플리케이션을 빌드하기 위해 확장을 사용할 수도 있고 단순한 독립형 애플리케이션에서 의존성 주입 프로비저닝을 사용할 수도 있습니다.

Q2. Spring을 사용하면 어떤 이점이 있습니까?

자카르타 EE 개발을 더 쉽게 만드는 Spring 목표. 사용의 장점은 다음과 같습니다.

  • 경량 : 개발에서 프레임 워크를 사용하는 데 약간의 오버 헤드가 있습니다.
  • IoC (Inversion of Control) : Spring 컨테이너는 종속 개체를 생성하거나 찾는 대신 다양한 개체의 연결 의존성을 처리합니다.
  • AOP (Aspect Oriented Programming) : Spring은 시스템 서비스에서 비즈니스 로직을 분리하기 위해 AOP를 지원합니다.
  • IoC 컨테이너 : Spring Bean 라이프 사이클 및 프로젝트 별 구성을 관리합니다.
  • MVC 프레임 워크 : XML / JSON 응답을 반환 할 수있는 웹 애플리케이션 또는 RESTful 웹 서비스를 만드는 데 사용됩니다.
  • 트랜잭션 관리 : Java 어노테이션을 사용하거나 Spring Bean XML 구성 파일을 사용하여 JDBC 작업, 파일 업로드 등에서 상용구 코드의 양을 줄입니다.
  • 예외 처리 : Spring은 기술 별 예외를 확인되지 않은 예외로 변환하기위한 편리한 API를 제공합니다.

Q3. 어떤 Spring 하위 ​​프로젝트를 알고 있습니까? 간략하게 설명하십시오.

  • Core – IoC 또는 DI와 같은 프레임 워크의 기본 부분을 제공하는 핵심 모듈
  • JDBC –이 모듈은 특정 공급 업체 데이터베이스에 대해 JDBC 코딩을 수행 할 필요가없는 JDBC 추상화 계층을 활성화합니다.
  • ORM 통합 – JPA, JDO 및 Hibernate와 같은 인기있는 객체 관계형 매핑 API에 대한 통합 계층을 제공합니다.
  • – 웹 지향 통합 모듈, 멀티 파트 파일 업로드, 서블릿 리스너 및 웹 지향 애플리케이션 컨텍스트 기능을 제공합니다.
  • MVC 프레임 워크 – Model View Controller 디자인 패턴을 구현하는 웹 모듈
  • AOP 모듈 – 깨끗한 메소드 인터셉터 및 포인트 컷을 정의 할 수있는 측면 지향 프로그래밍 구현

Q4. 의존성 주입이란?

IoC (Inversion of Control)의 한 측면 인 의존성 주입은 개체를 수동으로 생성하지 않고 대신 생성 방법을 설명하는 일반적인 개념입니다. IoC 컨테이너는 필요한 경우 필요한 클래스를 인스턴스화합니다.

자세한 내용은 여기 를 참조 하십시오 .

Q5. Spring에 Bean을 어떻게 주입 할 수 있습니까?

몇 가지 다른 옵션이 있습니다.

  • 세터 주입
  • 생성자 주입
  • Field 주입

구성은 XML 파일 또는 어노테이션을 사용하여 수행 할 수 있습니다.

자세한 내용은 이 도움말을 확인 하세요 .

Q6. Bean을 주입하는 가장 좋은 방법은 무엇이며 그 이유는 무엇입니까?

권장되는 접근 방식은 필수 의존성에는 생성자 인수를 사용하고 선택적 의존성에는 설정자를 사용하는 것입니다. 생성자 주입을 사용하면 불변 필드에 값을 주입하고 테스트를 더 쉽게 할 수 있습니다.

Q7. Beanfactory와 Applicationcontext의 차이점은 무엇입니까?

BeanFactory 는 Bean 인스턴스를 제공하고 관리하는 컨테이너를 나타내는 인터페이스입니다. 기본 구현 getBean () 이 호출 될 때 빈을 느리게 인스턴스화 합니다.

ApplicationContext애플리케이션의 모든 정보, 메타 데이터 및 Bean을 보유하는 컨테이너를 나타내는 인터페이스입니다. 또한 BeanFactory 인터페이스를 확장 하지만 기본 구현은 애플리케이션이 시작될 때 열심히 빈을 인스턴스화합니다. 이 동작은 개별 Bean에 대해 재정의 될 수 있습니다.

모든 차이점에 대해서는 참조 를 참조하십시오 .

Q8. 스프링 빈이 란?

Spring Bean은 Spring IoC 컨테이너에 의해 초기화되는 Java Object입니다.

Q9. Spring Framework의 기본 Bean 범위는 무엇입니까?

기본적으로 Spring Bean은 싱글 톤으로 초기화됩니다 .

Q10. Bean의 범위를 정의하는 방법은 무엇입니까?

Spring Bean의 범위를 설정하기 위해 XML 구성 파일에서 @Scope 어노테이션 또는 "scope"속성을 사용할 수 있습니다. 지원되는 범위는 5 개입니다.

  • 하나씩 일어나는 것
  • 원기
  • 의뢰
  • 세션
  • 글로벌 세션

차이점은 여기 를 참조 하십시오 .

Q11. Singleton Bean은 스레드로부터 안전한가요?

아니요, 싱글 톤 빈은 스레드로부터 안전하지 않습니다. 스레드 안전성은 실행에 관한 것이고 싱글 톤은 생성에 초점을 맞춘 디자인 패턴입니다. 스레드 안전성은 Bean 구현 자체에만 의존합니다.

Q12. Spring Bean 라이프 사이클은 어떻게 생겼습니까?

먼저 Java 또는 XML Bean 정의를 기반으로 Spring Bean을 인스턴스화해야합니다. 사용 가능한 상태로 만들기 위해 일부 초기화를 수행해야 할 수도 있습니다. 그 후 Bean이 더 이상 필요하지 않으면 IoC 컨테이너에서 제거됩니다.

모든 초기화 방법이 포함 된 전체주기가 이미지 ( 소스 )에 표시됩니다.

Q13. Spring Java 기반 구성이란 무엇입니까?

유형이 안전한 방식으로 Spring 기반 애플리케이션을 구성하는 방법 중 하나입니다. XML 기반 구성의 대안입니다.

또한 프로젝트를 XML에서 Java 구성으로 마이그레이션 하려면이 문서 를 참조 하십시오 .

Q14. 하나의 프로젝트에 여러 Spring 구성 파일을 가질 수 있습니까?

예, 대규모 프로젝트에서는 유지 보수성과 모듈성을 높이기 위해 여러 Spring 구성을 사용하는 것이 좋습니다.

여러 Java 기반 구성 파일을로드 할 수 있습니다.

@Configuration
@Import({MainConfig.class, SchedulerConfig.class})
public class AppConfig {

또는 다른 모든 구성을 포함 할 하나의 XML 파일을로드합니다.

ApplicationContext context = new ClassPathXmlApplicationContext("spring-all.xml");

이 XML 파일에는 다음이 있습니다.

<import resource="main.xml"/>
<import resource="scheduler.xml"/>

Q15. 스프링 Security이란?

Spring Security는 Java 애플리케이션에서 인증 및 권한 부여 방법을 제공하는 데 초점을 맞춘 Spring 프레임 워크의 별도 모듈입니다. 또한 CSRF 공격과 같은 대부분의 일반적인 Security 취약점을 처리합니다.

웹 애플리케이션에서 Spring Security를 ​​사용하려면 @EnableWebSecurity 라는 간단한 어노테이션으로 시작할 수 있습니다 .

Baeldung 에서 Security 과 관련된 전체 기사 시리즈를 찾을 수 있습니다 .

Q16. 스프링 부트 란?

Spring Boot는 가장 적은 양의 코드로 Spring 애플리케이션을 실행하고 실행할 수 있도록 상용구 구성을 줄이기 위해 미리 구성된 프레임 워크 세트를 제공하는 프로젝트입니다.

Q17. Spring Framework에서 사용되는 디자인 패턴의 이름을 지정하십시오.

  • 싱글 톤 패턴 : 싱글 톤 범위의 빈
  • 팩토리 패턴 : 빈 팩토리 클래스
  • 프로토 타입 패턴 : 프로토 타입 범위의 빈
  • 어댑터 패턴 : Spring Web 및 Spring MVC
  • 프록시 패턴 : Spring Aspect 지향 프로그래밍 지원
  • 템플릿 메소드 패턴 : JdbcTemplate , HibernateTemplate
  • 프론트 컨트롤러 : Spring MVC DispatcherServlet
  • 데이터 액세스 개체 : Spring DAO 지원
  • 모델보기 컨트롤러 : Spring MVC

Q18. 스코프 프로토 타입은 어떻게 작동합니까?

범위 프로토 타입 은 Bean의 인스턴스를 호출 할 때마다 Spring이 새 인스턴스를 생성하고 반환한다는 것을 의미합니다. 이것은 단일 객체 인스턴스가 Spring IoC 컨테이너 당 한 번 인스턴스화되는 기본 싱글 톤 범위 와 다릅니다 .

3. 스프링 웹 MVC

Q19. Spring Bean에서 ServletContextServletConfig 객체 를 얻는 방법은 무엇입니까?

다음 중 하나를 수행 할 수 있습니다.

  1. Spring 인식 인터페이스 구현. 전체 List은 여기에서 확인할 수 있습니다 .
  2. 해당 빈에서 @Autowired 어노테이션 사용 :
@Autowired
ServletContext servletContext;

@Autowired
ServletConfig servletConfig;

Q20. Spring Mvc의 컨트롤러는 무엇입니까?

간단히 말해서 DispatcherServlet에서 처리하는 모든 요청 @Controller 어노테이션이 달린 클래스로 전달 됩니다. 각 컨트롤러 클래스는 제공된 입력으로 요청을 처리하고 실행하는 메서드에 하나 이상의 요청을 매핑합니다.

한 발 뒤로 물러나야한다면 일반적인 Spring MVC 아키텍처에서 Front Controller 의 개념을 살펴 보는 것이 좋습니다 .

Q21. @Requestmapping 어노테이션은 어떻게 작동합니까?

@RequestMapping의 어노테이션은 Spring 컨트롤러 방법으로 웹 요청을 매핑하는 데 사용됩니다. 간단한 사용 사례 외에도 HTTP 헤더 매핑, URI의 일부를 @PathVariable로 바인딩 , URI 매개 변수 및 @RequestParam 어노테이션 작업에 사용할 수 있습니다.

@RequestMapping 에 대한 자세한 내용 여기에서 확인할 수 있습니다 .

더 많은 Spring MVC 질문은 Spring MVC Interview Questions  기사 를 확인 하십시오 .

4. 스프링 데이터 접근

Q22. Spring Jdbctemplate 클래스는 무엇이며 어떻게 사용합니까?

Spring JDBC 템플릿은 우리가 관심있는 데이터베이스 운영 로직에 접근 할 수있는 기본 API입니다.

  • 연결 생성 및 종료
  • 문 및 저장 프로 시저 호출 실행
  • ResultSet 반복 및 결과 반환

이를 사용하려면 DataSource 의 간단한 구성을 정의해야합니다 .

@Configuration
@ComponentScan("org.baeldung.jdbc")
public class SpringJdbcConfig {
    @Bean
    public DataSource mysqlDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
        dataSource.setUsername("guest_user");
        dataSource.setPassword("guest_password");
 
        return dataSource;
    }
}

자세한 설명은 이 빠른 기사를 참조하십시오 .

Q23. Spring에 거래를 어떻게 활성화하고 그 이점은 무엇입니까?

어노테이션을 사용하거나 AOP (Aspect Oriented Programming)를 사용하여 트랜잭션 을 구성하는 두 가지 방법이 있으며 각각 장점이 있습니다.

공식 문서 에 따르면 Spring Transactions 사용의 이점 은 다음과 같습니다.

  • JTA, JDBC, Hibernate, JPA 및 JDO와 같은 다양한 트랜잭션 API에서 일관된 프로그래밍 모델을 제공합니다.
  • 선언적 트랜잭션 관리 지원
  • JTA와 같은 복잡한 트랜잭션 API보다 프로그래밍 방식의 트랜잭션 관리를위한 더 간단한 API를 제공합니다.
  • Spring의 다양한 데이터 액세스 추상화와 잘 통합됩니다.

Q24. Spring Dao는 무엇입니까?

Spring Data Access Object는 JDBC, Hibernate 및 JPA와 같은 데이터 액세스 기술과 일관되고 쉬운 방식으로 작동하도록 제공되는 Spring의 지원입니다.

물론 전체 시리즈 에서 Spring의 지속성에 대해 논의하면서 지속성에 대해 더 심층적으로 살펴볼 수 있습니다 .

5. Spring Aspect-Oriented Programming (AOP)

Q25. Aspect-Oriented Programming이란 무엇입니까?

Aspect 는 영향을받는 클래스를 수정하지 않고 기존 코드에 추가 동작을 추가하여 여러 유형 및 객체에 걸쳐있는 트랜잭션 관리와 같은 교차 절단 문제를 모듈화 할 수 있도록합니다.

다음은 aspect 기반 실행 시간 로깅 의 예입니다 .

Q26. Aop에서 Aspect, Advice, Pointcut 및 Joinpoint는 무엇입니까?

  • Aspect : 트랜잭션 관리와 같은 교차 문제를 구현하는 클래스
  • Advice :애플리케이션에서 Pointcut 과 일치하는 특정 JoinPoint도달했을 때 실행되는 메소드
  • Pointcut : Advice 를 실행해야하는지 여부를 결정하기 위해 JoinPoint 와 일치하는 정규식 세트
  • JoinPoint : 메소드 실행 또는 예외 처리와 같은 프로그램 실행 중 지점

Q27. 위빙이란?

에 따르면 공식 문서 , 직물은 다른 응용 프로그램 유형 또는 객체와의 연계 측면이 advised 객체를 생성하는 과정이다. 이는 컴파일 타임,로드 타임 또는 런타임에 수행 할 수 있습니다. 다른 순수 Java AOP 프레임 워크와 마찬가지로 Spring AOP 는 런타임에 위빙수행 합니다.

6. Spring 5

Q28. 반응 형 프로그래밍이란?

리 액티브 프로그래밍은 생산자가 소비자를 압도하지 않도록하는 것을 목표로하는 핵심 요소 인 역압과 함께 적은 수의 스레드로 확장되는 비 차단 이벤트 기반 애플리케이션에 관한 것입니다.

반응 형 프로그래밍의 주요 이점은 다음과 같습니다.

  • 멀티 코어 및 멀티 CPU 하드웨어에서 컴퓨팅 리소스 활용도 증가
  • 직렬화를 줄여 성능 향상

반응 형 프로그래밍은 일반적으로 메시지 기반 인 반응 형 시스템과 달리 이벤트 기반입니다. 따라서 반응 형 프로그래밍을 사용한다고해서 아키텍처 스타일 인 반응 형 시스템을 구축하는 것은 아닙니다.

그러나 리 액티브 프로그래밍은 리 액티브 선언문 을 따르는 경우 리 액티브 시스템을 구현하는 수단으로 사용될 수 있습니다  . 이는 이해하는 데 매우 중요합니다.

이를 바탕으로 반응 시스템에는 네 가지 중요한 특성이 있습니다.

  • 응답 성 : 시스템이 적시에 응답해야합니다.
  • 탄력성 : 시스템에 오류가 발생하는 경우에도 계속 응답해야합니다.
  • 탄력적 : 반응 형 시스템은 변화에 반응하고 다양한 워크로드에서도 대응할 수 있습니다.
  • 메시지 기반 : 반응 시스템은 비동기 메시지 전달에 의존하여 구성 요소 간의 경계를 설정해야합니다.

Q29. Spring Webflux 란?

Spring WebFlux  는 Spring의 반응 스택 웹 프레임 워크이며 Spring MVC의 대안입니다.

이 반응 모델을 달성하고 확장 성을 높이기 위해 전체 스택은 비 차단입니다. 자세한 내용 은 Spring 5 WebFlux에 대한 자습서를 확인 하십시오.

Q30. 모노 및 플럭스 유형은 무엇입니까?

Spring Framework 5의 WebFlux 프레임 워크는 Reactor 를 비동기 기반으로 사용합니다.

이 프로젝트는 단일 비동기 값을 나타내는 Mono 와 비동기 값 의 스트림을 나타내는 Flux의 두 가지 핵심 유형을 제공  합니다. 둘 다 Reactive Streams  사양에 정의 된 게시자 인터페이스를  구현합니다  .

MonoPublisher를 구현 하고 0 또는 1 개의 요소를 반환합니다.

public abstract class Mono<T> implements Publisher<T> {...}

또한 FluxPublisher를 구현 하고 N 개의 요소를 반환 합니다.

public abstract class Flux<T> implements Publisher<T> {...}

정의에 따라 두 유형은 스트림을 나타내므로 둘 다 게으 르기 때문에 subscribe () 메서드를 사용하여 스트림을 사용할 때까지 아무것도 실행되지 않습니다 . 두 유형 모두 불변이므로 메서드를 호출하면 Flux 또는 Mono 의 새 인스턴스가 반환됩니다 .

Q31. Webclient 및 Webtestclient의 용도는 무엇입니까?

WebClient 는 비 차단 HTTP 요청을 수행하기위한 반응 적 클라이언트 역할을 할 수있는 새로운 Web Reactive 프레임 워크의 구성 요소입니다. 리 액티브 클라이언트이기 때문에 역압으로 리 액티브 스트림을 처리 할 수 ​​있으며 Java 8 람다를 최대한 활용할 수 있습니다. 또한 동기화 및 비동기 시나리오를 모두 처리 할 수 ​​있습니다.

반면에  WebTestClient  는 테스트에서 사용할 수있는 유사한 클래스입니다. 기본적으로 WebClient 주변의 얇은 셸 입니다. HTTP 연결을 통해 모든 서버에 연결할 수 있습니다. 또한 HTTP 서버 없이도 모의 요청 및 응답 객체를 사용하여 WebFlux 애플리케이션에 직접 바인딩 할 수 있습니다.

Q32. 리 액티브 스트림 사용의 단점은 무엇입니까?

반응 스트림 사용의 주요 단점은 다음과 같습니다.

  • Reactive 애플리케이션의 문제 해결은 약간 어렵습니다.  몇 가지 유용한 디버깅 팁을 보려면 반응 스트림 디버깅에 대한 자습서 를 확인하십시오. 
  • 기존의 관계형 데이터 저장소가 아직 반응 형 패러다임을 수용하지 않았기 때문에 반응 형 데이터 저장소에 대한 지원이 제한되어 있습니다.
  • 구현할 때 추가 학습 곡선이 있습니다.

Q33. Spring 5는 이전 버전의 Java와 호환됩니까?

Java 8 기능을 활용하기 위해 Spring 코드베이스가 개선되었습니다. 즉, 이전 버전의 Java를 사용할 수 없습니다. 따라서 프레임 워크에는 최소 Java 8이 필요합니다.

Q34. Spring 5는 Jdk 9 모듈 성과 어떻게 통합됩니까?

Spring 5에서는 모든 것이 모듈화되었으므로 우리가 찾고있는 기능이 없을 수도있는 jar를 강제로 가져올 필요가 없습니다.

 이 기술이 어떻게 작동하는지 심층적으로 이해 하려면 Java 9 모듈성에 대한 가이드를 참조하십시오  .

Java 9의 새로운 모듈 기능을 이해하고이 개념을 기반으로 Spring 5 프로젝트를 구성하는 방법을 이해하는 예제를 살펴 보겠습니다.

시작하려면 문자열 "HelloWorld" 를 반환하는 단일 메서드가 포함 된 새 클래스를 만들어 보겠습니다 . 우리는 이것을 새로운 자바 프로젝트 인 HelloWorldModule 안에 넣을 것입니다  :

package com.hello;
public class HelloWorld {
    public String sayHello(){
        return "HelloWorld";
    }
}

그런 다음 새 모듈을 만들어 보겠습니다.

module com.hello {
    export com.hello;
}

이제 모듈을 정의하여 위의 모듈을 사용 하는 새로운 Java 프로젝트 HelloWorldClient를 만들어 보겠습니다  .

module com.hello.client {
    requires com.hello;
}

위 모듈은 지금 테스트 할 수 있습니다.

public class HelloWorldClient {
    public static void main(String[] args){
        HelloWorld helloWorld = new HelloWorld();
        log.info(helloWorld.sayHello());
    }
}

Q35. 동일한 응용 프로그램에서 Web Mvc와 Webflux를 모두 사용할 수 있습니까?

현재 Spring Boot는 Spring Boot가 클래스 경로에 존재하는 의존성에 따라 컨텍스트를 자동 구성하려고 시도하므로 Spring MVC 또는 Spring WebFlux 만 허용합니다.

또한 Spring MVC는 Netty에서 실행할 수 없습니다. 더욱이 MVC는 차단 패러다임이고 WebFlux는 비 차단 스타일이므로 서로 다른 목적을 제공하므로 두 가지를 함께 혼합해서는 안됩니다.

7. 결론

이 광범위한 기사에서 우리는 Spring에 관한 모든 기술 인터뷰에서 가장 중요한 몇 가지 질문을 탐색했습니다.

이 기사가 다가오는 Spring 인터뷰에서 도움이되기를 바랍니다. 행운을 빕니다!