Spring
1. Spring DI/IoC는 어떻게 동작하나요?
IoC(Inversion of Control), 제어의 역전은 프로그램 제어 흐름을 직접 제어하지 않고 외부에서 관리해주며,
코드의 최종호출은 개발자가 제어하는 것이 아닌 프레임워크 내부에서 결정한 대로 이루어집니다.
DI(Dependency Injection)는 Spring 프레임워크에서 지원하는 IoC 형태로 클래스 사이의 의존관계를 Bean 설정 정보를
바탕으로 컨테이너가 자동으로 연결해줍니다.
2. IoC 컨테이너의 역할은 무엇인가요?
어플리케이션 실행시점에 빈 오브젝트를 인스턴스화하고 DI한 후에 최초로 어플리케이션을 기동할 빈 하나를 제공해주는 역할을 합니다.
3. DI 종류는 어떤 것이 있고, 이들의 차이는 무엇인가요?
DI는 3가지 방법(종류)이 있습니다. 생성자 주입, 필드 주입, Setter 주입이 있습니다.
생성자 주입은 생성자 호출시점에 딱 1번만 호출되는 것을 보장하며 불변, 필수 의존관계에 사용합니다.
(최근에는 순환 참조 등의 문제로 인해 Spring 4.3 이후 버전부터는 생성자 주입이 많이 권장됨)
필드 주입은 '@AutoWired'를 사용하는데 외부에서 변경이 불가능하여 테스트하기 어렵습니다. 주로 어플리케이션과
관계없는 테스트코드나 '@Configuraion' 어노테이션 같은 스프링 설정 목적으로 사용합니다.
Setter 주입은 선택, 변경 가능성이 있는 의존관계에 사용되며 스프링빈을 선택적으로 등록할 수 있습니다.
4. Autowiring 과정에 대해서 설명해주세요.
Autowiring : 필요한 의존 객체의 "타입"에 해당하는 Bean을 IoC 컨테이너에서 찾아 주입해주는 것
컨테이너에서 타입(인터페이스 or 오브젝트)을 이용해 의존 대상 객체를 검색하고
할당할 수 있는 빈 객체를 찾아 주입합니다.
5. Spring Bean이란 무엇인가요?
스프링 IoC 컨테이너가 관리하는 자바 객체를 Spring Bean이라고 합니다. @Bean을 사용하거나 xml 설정을
통해 일반 객체를 Bean으로 등록할 수 있습니다.
(스프링에 의해 생성되고 관리되는 자바 객체)
6. 스프링 Bean의 생성 과정을 설명해주세요.
객체 생성 → 의존 설정 → 초기화 → 사용 → 소멸 과정의 생명주기를 가지고 있습니다. Bean은 스프링 컨테이너에 의해 생명주기를 관리하며 빈 초기화방법은 @PostConstruct를 빈 소멸에서는 @PreDestroy를 사용합니다.
생성한 스프링 빈을 등록할 때는 ComponentScan을 이용하거나 @Configuration의 @Bean 을 사용하여 빈 설정파일에 직접 빈을 등록할 수 있습니다.
7. 스프링 Bean의 Scope에 대해서 설명해주세요.
Bean Scope는 Bean이 존재할 수 있는 범위를 뜻하며 싱글톤, 프로토타입, request, session, application 등이 있습니다.
싱글톤은 기본 스코프로 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다.
프로토타입은 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다.
request는 웹 요청이 들어오고 나갈 때까지 유지하는 스코프이며, session은 웹 세션이 생성, 종료할 때까지,
application은 웹 서블릿 컨텍스트와 같은 범위로 유지하는 스코프입니다.
8. POJO란 무엇인가요? Spring Framework에서 POJO는 무엇이 될 수 있을까요?
POJO란 특정 기술에 종속되지 않은 순수한 자바 객체를 말합니다.
POJO(Plain Old Java Object)는 프레임워크 인터페이스, 클래스를 구현하거나 확장하지 않은 단순한 클래스로 Java에서 제공하는 API 외에 종속되지 않습니다. 특정 환경에 종속되지 않아 코드가 간결하고 테스트 자동화에 유리합니다.
스프링에서는 도메인과 비즈니스 로직을 수행하는 대상이 POJO 대상이 될 수 있습니다.
9. 의존성과 설정값을 생성자 인자로 주입해야 하는 이유에 대해 설명해주세요.
생성자를 통해 주입하면, 인스턴스 생성시 바로 어떠한 동작을 실행할 수 있습니다. 또한 추가적인 설정이 필요하지 않으며, 뜻하지 않게 의존성과 설정값을 빠뜨리는 일이 발생하지 않고 테스트에도 용이합니다.
*추가 정리
○ 객체의 불변성 확보
○ 테스트 코드의 작성
○ final 키워드 작성 및 Lombok과의 결합
○ 스프링에 비침투적인 코드 작성
○ 순환 참조 에러 방지
10. Spring에서 CORS에러를 해결하기 위한 방법을 설명해주세요.
○ Servlet Filter를 사용하여 커스텀한 Cors를 설정하는 방법
○ WebMvcConfigurer를 구현한 Configuration 클래스를 만들어서 addCorsMappings()를 재정의하는 방법
○ Spring Security에서 CorsConfigurationSource를 Bean으로 등록하고 Config에 추가하는 방법
11. Bean/Component 어노테이션에 대해 설명해주시고, 둘의 차이점에 대해 설명해주세요.
두 어노테이션 모두 IoC 컨테이너에 Bean을 등록하기 위해 사용합니다.
@Component : 개발자가 작성한 class를 기반으로 실행시점에 인스턴스 객체를 1회(싱글톤) 생성합니다.
@Controller, @Service, @Repository는 모두 @Component 이며 실행시점에 자동으로 의존성을 주입합니다.
@Bean : 개발자가 작성한 메서드를 기반으로 메서드에서 반환하는 객체를 인스턴스 객체로 1회(싱글톤) 생성합니다.
12. 프론트 컨트롤러 패턴이란 무엇인가요?
각각의 클라이언트 요청에 맞는 컨트롤러를 찾아 호출해서 처리하는 패턴입니다.
공통 코드에 대해서는 프론트 컨트롤러에서 처리하고, 서로 다른 코드들만 각 컨트롤러에서 처리할 수 있도록 해줍니다.
13. Spring Web MVC에서 요청마다 Thread가 생성되어 Controller를 통해 요청을 수행할텐데, 어떻게 1개의 Controller만 생성될 수 있을까요?
생성한 Controller 클래스에 대한 정보가 JVM 메모리 영역 중 '메서드 영역'에 올라가기 때문입니다.
객체는 힙에 생성 되지만, 해당 클래스의 정보는 메서드 영역에 생성됩니다.
결국 모든 Thread가 객체의 메서드를 공유할 수 있습니다.
14. Servlet Filter와 Spring Interceptor의 차이는 무엇인가요?
○ 관리되는 컨테이너가 필터는 웹 컨테이너이며 인터셉터는 스프링 컨테이너입니다.
○ 필터는 Request/Response 조작이 가능하지만 인터셉터는 불가능합니다.
○ 필터는 데이터 변환, XSL/XST를 이용한 XML 문서 변경, 사용자 인증, 자원 접근에 대한 로깅 등에 사용합니다.
인터셉터의 경우 AOP를 흉내내거나 인증/인가 등과 같은 공통 작업, Controller로 넘겨주는 정보의 가공, API 호출에
대한 로깅 또는 감사 등에 사용합니다.
15. Spring Application을 구동할 때 메서드를 실행시키는 방법에 대해 설명해주세요.
CommandLineRunner, ApplicationRunner를 구현한 클래스를 만들어서 실행시키는 방법이 있습니다.
또한 Spring의 ApplicationEvent를 사용한 방법, @PostConstruct를 사용한 방법,
InitializingBean 인터페이스를 구현하는 방법, @Bean의 initMethod를 사용한 방법이 있습니다.
16. Filter는 Servlet의 스펙이고, Interceptor는 Spring MVC의 스펙입니다. Spring Application에서 Filter와 Interceptor를 통해 예외를 처리할 경우 어떻게 해야 할까요?
Filter는 DispatcherServlet 외부에 존재하기 때문에 예외가 발생했을 때 ErrorController에서 처리해야 합니다. 하지만 Interceptor는 DispatcherServlet 내부에 존재하기 때문에 @ControllerAdvice를 적용해서 처리할 수 있습니다.
17. Spring Web MVC의 Dispatcher Servlet의 동작 원리에 대해서 간단히 설명해주세요.
이미지 출처 : https://mangkyu.tistory.com/18
1. 클라이언트의 요청을 DispatcherServlet에 전달합니다.
2. 요청한 url에 맞는 Controller 검색하여 HandlerMapping에 전달합니다.
3. HandlerMapping에서 해당 Controller에 처리 요청합니다.
4. Controller에서 처리 결과를 HandlerAdapter에서 ModelAndView 객체로 변환하여 DispatcherServlet에 전달합니다.
5. DispatcherServlet에서 전달받은 ModelAndView 객체를 이용하여 매핑되는 View를 검색
6. ViewResolver에서 처리 결과를 view에 전달합니다.
7. 처리결과가 포함된 view를 DispatcherServlet에 전달합니다.
8. DispatcherServlet에서 최종 응답 결과를 클라이언트에게 출력합니다.
*참고
https://mangkyu.tistory.com/125
https://yeonyeon.tistory.com/103
https://jckim-dev.tistory.com/12
https://yoo11052.tistory.com/133
https://velog.io/@j_user0719/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84-BE
'Study Cafe > 기술면접' 카테고리의 다른 글
자료구조/알고리즘, 컴파일러 (1) | 2023.04.17 |
---|---|
데이터베이스 + JPA (0) | 2023.03.27 |
네트워크 (0) | 2023.03.16 |
백엔드 개발 면접 질문 주요 리스트(1) (0) | 2023.01.30 |
기술 면접 주요 질문 답변 정리(5문항) (0) | 2022.12.25 |
댓글
이 글 공유하기
다른 글
-
자료구조/알고리즘, 컴파일러
자료구조/알고리즘, 컴파일러
2023.04.17 -
데이터베이스 + JPA
데이터베이스 + JPA
2023.03.27 -
네트워크
네트워크
2023.03.16 -
백엔드 개발 면접 질문 주요 리스트(1)
백엔드 개발 면접 질문 주요 리스트(1)
2023.01.30