- POJO와 Spring Framework
- Spring MVC와 Java Servlet
- Filter와 Interceptor
- Spring Application 구동 방식
- 생성자 주입
- Spring Web MVC의 Controller 관리
- AOP 개념
1. POJO와 Spring Framework
POJO (Plain Old Java Object)
- 특정 프레임워크나 라이브러리에 종속되지 않은 순수한 Java 객체
- extends, implements를 통해 상속받거나 인터페이스를 구현하지 않는 간단한 클래스
- getter, setter, constructure, 멤버 변수를 가짐
- 특정 기술에 의존하지 않음
- 단순하고, 가독성이 좋음
- 테스트가 쉽고 다양한 프레임워크에서 재사용이 가능
- 객체지향적인 설계를 제한없이 적용할 수 있다
Spring framework와 POJO
- Spring Framework는 POJO 프로그래밍을 지향하는 프레임워크
- 다른 환경이나 기술에 종속되지 않도록 IoC/DI, AOP등 지원
- POJO는 Spring에서 도메인 모델이나 비즈니스 로직이 될 수 있음
2. Spring MVC와 Java Servlet
Java Servlet
- 클라이언트의 요청을 처리하고 응답을 생성하기 위한 API
- Http 요청이 servlet 컨테이너(tomcat)에 도달하면 컨테이너는 요청을 특정 servlet에 매핑하고 servlet이 요청을 처리하여 응답 반환
- http 요청과 응답을 직접 다룸
- 단순한 구조, 기본적인 웹 애플리케이션 개발에 적합
- 요청 매핑, 데이터 변환 등을 수작업으로 처리해야 함
- 수작업이라 규모가 커지만 복잡해지고, 확장성이 부족해 유지보수가 어려움
Spring MVC
- Model-View-Controller 패턴을 기반으로 웹 애플리케이션 구조화
- Java Servlet의 상위 추상화 계층
- Servlet의 복잡한 작업을 간소화하고 생산성을 높여줌
- DispatcherServlet : 모든 http 요청을 중앙에서 관리, 컨트롤러에 요청 위임
- Annotation : @Controller, @RequestMapping등으로 요청 처리
- 다양한 뷰 템플릿 (thymeleaf, JSP)과 통합하여 사용 가능
- 확장성 있는 애플리케이션 개발 지원
- Dispatcher servlet을 통해 요청을 처리할 컨트롤러를 찾아서 위임하고 결과를 받아오는 형태

Question
Spring MVC의 핵심 구성 요소?
Dispatcher servlet을 중심으로 작동하며, 주요 구성요소는 Handler Mapping, Handler Adapter, View Resolver등으로 구성되어 있습니다.
Question
Java Servlet과 MVC의 차이점
Java Servlet은 Http 요청과 응답을 처리하는 저수준 API로 개발자가 직접 요청을 파싱하고 응답을 생성하고, 설정을 직접 관리해야 합니다. Spring MVC는 이러한 servlet기능을 추상화하여 제공합니다. 예를들어 Request Mapping을 통해 URL 매핑을 지원하고, 응답은 뷰 템플릿 엔진을 사용해 생성합니다. Spring MVC는 DI와 AOP를 활용하여 생산성과 유지보수성을 향상시킵니다.
Question
Spring MVC에서 예외를 처리하는 방법?
Exception Handler를 사용해 특정 예외를 처리하거나 Controller Advice를 사용해 애플리케이션 전역에서 발생하는 예외를 처리할 수 있습니다.
Question
Servlet 필터와 Spring Interceptor 차이점
Servlet 필터는 Java의 표준 기능으로 요청과 응답을 처리하기 전에 서블릿 컨테이너 수준에서 작동하며, Spring Interceptor는 Spring MVC 요청에서 Dispatcher servlet 이후와 컨트롤러 실행 전후에 작동합니다.
3. Filter와 Interceptor
웹 애플리케이션에서 요청과 응답을 처리하는 공통적인 작업을 수행하는 구성 요소
Filter
- 요청이 Dispatcher Servlet에 도달하기 전에 응답이 클라이언트로 반환되기 전에 처리
- 전체 요청/응답에 대해 전역적으로 사용
- 주로 요청 전처리, 응답 후처리, 보안, 로깅등을 처리
Interceptor
- 요청이 Dispatcher servlet에 도달한 후에, 컨트롤러 실행 전후에 실행
- Spring MVC의 요청 처리 흐름에 맞춰 사용
- 컨트롤러 실행 전후 추가작업이 필요할 때 사용
Question
Filter와 Interceptor의 차이점
filter와 interceptor는 요청과 응답을 처리할 때 공통적인 작업을 수행하는 구성 요소입니다. filter는 요청이 dispatcher servlet에 도달하기 전과 응답이 클라이언트에 반환되기 전에 처리되며 전체적인 요청과 응답에 전역적으로 사용됩니다. Interceptor는 요청이 Dispathcer servlet에 도달한 후 컨트롤러 실행 전후에 실행되어 Spring MVC의 요청 처리 흐름에 맞춰 사용됩니다. filter는 주로 보안이나 로깅, 요청 필터링을 위해 사용되며 interceptor는 권한 체크나 컨트롤러 전후작업에 사용됩니다.
5. 생성자 주입
의존성과 설정값을 생성자 인자로 주입해야 하는 이유에 대해 설명해주세요
불변성 보장
- 생성자 주입을 사용하면 클래스 필드를 불변 상태로 유지 가능
- final 키워드를 사용하여 초기화 시에만 값을 설정하고 이후에 값을 변경할 수 없도록 함
- 코드의 예측 가능성과 안정성 높임
의존성 주입의 명시화
- 클래스가 어떤 의존성에 의존하는지 명확히 보여줌
- 가독성을 높이고 코드를 이해하기 쉽게 만듬
테스트 용이성
- 테스트 시 의존성 주입을 쉽게 할 수 있음
- 테스트가 용이해짐
결합도 감소, 순환 참조 방지 등등
Question
Spring에서 생성자 주입을 사용해야 하는 이유?
생성자 주입은 의존성을 명확히 드러내며 객체가 불변성을 유지하도록 보장합니다. 또한 순환 참조 문제를 방지할 수 있고, 단위 테스트시 모의 객체를 쉽게 주입할 수 있어 테스트 용이성이 뛰어납니다.
6. Spring Web MVC의 Controller 관리
Controller
- Http 요청을 받아 처리하고, 모델 데이터를 생성하여 뷰를 반환하는 역할
- @Controller, @RestController를 사용하여 Spring Bean으로 정의
- 요청을 처리하는 메서드는 @RequestMapping, @GetMapping, @PostMapping등의 어노테이션을 사용해 매핑
Question
Spring Web MVC에서 Controller의 역할은 무엇인가요?
사용자가 웹 애플리케이션에서 요청을 보낼 때 이를 받아서 처리하는 역할을 합니다. 요청을 적절한 서비스 레이어로 전달하고, 결과를 모델에 담아 뷰를 반환합니다.
Question
Spring MVC에서 Controller 처리 방식
Dispatcher Servlet이 요청을 받아 처리할 적합한 Controller로 전달합니다. 이후 Controller는 요청에 맞는 비즈니스 로직을 수행하고 결과를 모델에 담아 View로 전달합니다. View는 데이터를 렌더링하여 클라이언트에게 응답을 반환합니다.
Question
@Controlle와 @RestController차이
@Controller는 뷰를 반환하는 컨트롤러 클래스를 정의할 때 사용됩니다. 보통 JSP나 Thymeleaf를 통해 HTML 응답을 반환합니다. @RestController는 @Controller와 @ResponseBody가 결합된 형태로 뷰를 반환하는 대신 데이터를 바로 클라이언트에 반환합니다. 주로 JSON이나 XML 형태의 데이터를 반환합니다.
Question
@RequestMapping, @GetMapping, @PostMapping의 차이점은 무엇인가요?
@RequestMapping : 메서드와 요청 URL을 매핑하는데 사용 @GetMapping : Http GET 요청을 처리하는 메서드에 사용, 주로 조회에 사용됨 @PostMapping : Http POST 요청을 처리하는 메서드에 사용, 새로운 데이터를 생성하거나 데이터를 제출할 때 사용
Controller Singleton Scope
- Controller객체는 싱글톤으로 관리
- 애플리케이션 컨텍스트가 초기화될 때 Controller 객체를 한번만 생성하고, 이후 모든 Http 요청은 동일한 Controller 인스턴스를 사용
- 각 요청마다 별도의 스레드 사용
- Controller는 요청마다 공유되지만 각각의 요청은 독립적인 스레드에서 처리되어 상태가 공유되지 않음
Question
Spring Web MVC에서 요청 마다 Thread가 생성되어 Controller를 통해 요청을 수행할텐데, 어떻게 1개의 Controller만 생성될 수 있을까요?
Controller는 싱글톤으로 관리되어서 각 요청은 동일한 Controller 객체를 사용하지만 요청마다 독립적인 스레드에서 처리되어 상태가 공유되지 않습니다.
7. AOP
Aspect-Oriented Programming
-
관점 지향 프로그래밍
-
공통적인 관심사(로깅, 트랜잭션 관리, 보안, 성능 모니터링)를 핵심 비즈니스 로직과 분리하여 관리
-
로직을 핵심 기능과 부가 기능의 관점으로 나누어서 보고 각각을 모듈화 하는것
-
쇼핑몰로 예를 들면 상품을 검색하고, 장바구니에 담고, 결제하는 부분은 핵심적인 비즈니스 로직이라고 볼 수 있고, 유저별로 홈페이지에 체류하는 시간을 측정하는 부분은 부가 기능에 해당
-
Join point : Aspect가 적용될 수 있는 시점
- @Around : 핵심기능 수행 전과 후에 어드바이스 기능 수행
- @Before : 핵심기능 호출 전에 수행
- @After : 핵심기능 수행 성공/실패 여부와 상관없이 언제나 동작
- @AfterReturning : 핵심기능 호출 성공 시 수행
- @AfterThrowing : 핵심기능 호출 실패 시 수행
-
Advice : Aspect의 기능을 정의한 것
-
Point cut : Advice를 적용할 메소드 범위 지정
Spring에서의 AOP
- 프록시 기반 AOP
- 메서드 실행 전후 작업을 수행하는데 주로 사용
- @Aspect 어노테이션 사용
장단점
- 비즈니스 로직과 공통 관심사 분리 가능
- 유지보수 용이
- 복잡도 증가
- 코드의 흐름을 추적하기 어려워 디버깅이 어려움
Question
AOP란 무엇인가요?
AOP란 관점 지향 프로그래밍으로, 로직을 핵심 기능과 부가 기능의 관점으로 나누어 모듈화하는것입니다. 예를 들어 상품을 검색하고, 장바구니에 담고, 결제하는 부분은 핵심적인 비즈니스 로직이라고 볼 수 있고, 유저별로 홈페이지에 체류하는 시간을 측정하는 부분은 부가기능에 해당합니다.
Question
Spring AOP의 핵심 개념
공통 관심사를 모듈화한 Aspect, AOP가 사용될 지점을 정의하는 Join Point, 실제 동작을 정의하는 Advice, Advice가 적용될 조건을 정의하는 Point Cut 입니다.
Question
Aspect와 Advice의 차이점
Aspect는 공통 관심사 기능을 모듈화한 클래스로 재사용 가능한 코드를 제공합니다. Advice는 실제로 수행할 행동을 정의한 부분으로 메서드 실행 전후 로깅, 트랜잭션 관리 등을 수행할 수 있습니다.
Question
AOP에서의 Join Point와 Pointcut의 차이를 설명해주세요.
Join Point는 AOP가 적용될 수 있는 지점을 의미합니다. 예를 들어, 메서드 실행, 예외 처리 등입니다. Pointcut은 Join Point에서 Advice가 적용될 조건을 정의하는 표현식입니다. 예를 들어, 특정 메서드나 클래스에 대해 Advice를 적용할 수 있습니다.