Sad Puppy 3 Spring mvc 4 (MVC Configuration, View Controller, Interceptor, Argument Resolver) :: 개발자 아지트

[MVC(Model-View-Controller)]

:모델(데이터)-뷰(사용자가 보는 화면)-컨트롤러(사용자의 명령을 처리하는 역할)

 

*동작 과정

1. 클라이언트의 요청

2. 컨트롤러가 요청 처리: 컨트롤러가 사용자의 요청을 받는다. 

3. 모델에서 데이터 가져오기: 컨트롤러는 모델에서 데이터를 가져온다.

4. 뷰에 데이터 전달: 컨트롤러는 가져온 데이터를 뷰에 전달한다. 

5. 사용자에게 응답: 뷰는 모델의 데이터를 사용자에게 보여준다. 

 

결과적으로, 모델-뷰-컨트롤러(MVC)는 애플리케이션의 구조를 세 부분으로 나눠서 관리하는 방법이다. 이렇게 할 경우, 코드가 깔끔하게 유지되고 유지보수가 쉬워진다. 


 

1. Spring MVC Configuration

: 스프링은 WebMvcConfigurer라는 인터페이스를 제공해, 애플리케이션 개발자가 쉽게 MVC 설정을 커스터마이징할 수 있도록 한다. WebMvcConfigurer의 메서드를 확인해보면 어떤 항목을 설정할 수 있는지 확인할 수 있다. 

 

2. View Controller

: WebMvcConfigurer가 제공하는 addViewControllers 메서드를 통해 특정 요청에 대해 뷰를 응답하도록 설정할 수 있다. 

addViewControllers 메서드를 사용하면 컨트롤러를 작성하지 않고도 뷰(html 등)를 응답할 수 있다. 해당 메서드는 특정 URL을 특정 뷰에 매핑할 때 사용된다. 주로 정적 페이지(로그인 페이지나 에러 페이지 등)을 처리할 때 유용하다.

 

* 뷰 파일

: 뷰 파일은 일반적으로 src/main/resources/templates 디렉토리에 위치한다.

 

 

* 직접 Controller을 작성하는 방식보다 WebMvcConfigurer을 사용하는 방식이 더 효율적이라서 더 좋은 방식이라고 생각한다. 단순 정적 페이지를 제공해야 할 경우에 적합하다. 그러나 복잡한 비즈니스 로직이나 동적 데이터 처리가 필요한 경우 적합하지 않아 구현 기능이 제한될 수 있다. 또한 다양한 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)을 처리하기에 부적합하다. 

 

3. Interceptor

:Spring Framework에서 Interceptor는 주로 HTTP 요청의 사전 처리와 사후 처리를 관리하는 데 사용되는 컴포넌트다. 

Interceptor을 사용해 컨트롤러로 요청을 전달하기 전이나 후에 특정 로직을 실행할 수 있다. (인터셉터는 컨트롤러로 들어오는 요청을 가로채고 처리할 수 있는 메커니즘을 제공한다)

 

WebMvcConfigurer가 제공하는 addInterceptor 메서드를 통해 특정 패턴에 대해 인터셉터가 동작하도록 설정할 수있다. 

*addInterceptor메서드는 Spring MVC에서 인터셉터를 추가하고 설정하는데 사용된다. 

 

여기서 CheckLoginInterceptor, MemberController 에 breakpoint 를 설정하여 디버깅을 진행하며 작동 순서를 확인해 보기 위해서 해보니까 너무 깊이 들어감; 원래 이런건지? 


스프링이라는 프레임워크가 HandlerInterceptor 라는 인터페이스를 제공하고, 이런 행위를 지원하는 이유는 무엇일까요? 

=> 사용자를 권한별로 다른 페이지를 보여주고싶은 경우.

 

=> 특정 조건별로 다른 페이지를 보여주고 싶은 경우

 

=>

  • preHandle: 요청 전 인증 및 권한 검사, 입력 유효성 검사
  • postHandle: 응답 생성 후 데이터 가공, 로깅
  • afterCompletion: 리소스 정리, 예외 처리 후 추가 작업

=> 코드 가독성 및 유지보수성 향상 

인터셉터를 사용하면 공통 기능을 분리하여 코드의 가독성과 유지보수성을 향상시킬 수 있다. 컨트롤러는 자신의 비즈니스 로직에 집중할 수 있으며, 인증이나 로깅과 같은 공통 기능은 인터셉터에서 처리한다.

 

=> 모듈화 및 재사용성

인터셉터는 모듈화된 방식으로 특정 URL 패턴에 적용할 수 있기 때문에 필요한 곳에만 적용할 수 있다. 이는 코드의 재사용성을 높이고, 특정 기능을 다양한 컨트롤러에 쉽게 적용할 수 있도록 한다.

 

=> 선언적 접근 제어

인터셉터를 사용하면 URL 패턴을 기반으로 접근 제어를 선언적으로 설정할 수 있다. 이는 보안 설정을 일관되게 유지하는 데 도움이 된다.


 

 

어떤 상황에서 Interceptor 를 사용할 수 있을까요?정하여 디버깅을 진행하며 작동 순서를 확인해 보세요.

Interceptor 사용 목적:

=>공통 로직의 중앙 집중화:

여러 컨트롤러에서 공통으로 수행해야 하는 작업을 중앙에서 처리할 수 있습니다. 예를 들어, 인증, 권한 검사, 로깅, 요청의 데이터 변환 등을 Interceptor에서 처리할 수 있습니다.

 

=> 요청 전후 처리:

요청이 컨트롤러에 도달하기 전에 (preHandle), 컨트롤러에서 처리된 후 뷰가 렌더링되기 전에 (postHandle), 그리고 뷰 렌더링 후 (afterCompletion) 각각 특정 작업을 수행할 수 있습니다.

 

=>비즈니스 로직과 인프라스트럭처 로직의 분리:

컨트롤러의 비즈니스 로직과 인증, 권한 검사 등의 인프라스트럭처 로직을 분리할 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상시킵니다.

 

 

Interceptor를 사용할 수 있는 상황

=>인증 및 권한 검사:

사용자가 로그인되어 있는지 확인하거나, 특정 리소스에 접근할 권한이 있는지 확인합니다.

 

=> 로깅 및 감사:

요청 및 응답에 대한 로깅을 수행하여, 애플리케이션의 사용 현황을 추적합니다.

 

=> 성능 모니터링:

요청 처리 시간을 측정하여 성능을 모니터링하고, 병목 현상을 파악합니다.

 

=> 글로벌 설정 적용:

요청에 대해 공통적인 설정을 적용합니다. 예를 들어, 응답 헤더를 추가하거나 요청 데이터를 변환합니다.

 

=> 예외 처리:

예외가 발생하기 전에 요청을 중단시키고, 적절한 응답을 반환할 수 있습니다.

 

 

4. Argument Resolver

: Spring Framework에서 HandlerMethodArgumentResolver는 요청 데이터를 메서드의 매개변수로 변환할 때 사용하는 전략 인터페이스이다. 컨트롤러의 메서드가 호출될 때 매개변수에 전달할 객체를 생성하거나 조작하는 로직을 구현할 수 있다. 

 

예를들어, HTTP 요청의 특정 헤더를 객체로 변환하거나, 세션에서 사용자 정보를 가져와 매개변수에 주입하는 등의 작업을 수행할 수 있다. 

 

WebMvcConfigurer가 제공하는 addArgumentResolvers 메서드를 통해 커스텀 ArgumentResolver를 추가할 수 있다. 

 


 

스프링이라는 프레임워크가 HandlerMethodArgumentResolver 라는 인터페이스를 제공하고, 이런 행위를 지원하는 이유는 무엇이고, 어떤 상황에서 ArgumentResolver 를 사용할 수 있을까?

 

지원 이유

  • 유연한 매개변수 처리 방법 제공을 위함
  • 중복 코드 제거와 재사용성 증대를 위함
  • 코드의 가독성과 유지보수성 향상을 위함

사용 가능한 상황

  • 인증 정보, 세션 데이터, 요청 헤더, 커스텀 어노테이션 등을 매개변수로 받을 때 사용 가능한 상황임

 

 

 

'프레임워크 > Spring' 카테고리의 다른 글

Spring Core 1  (0) 2024.08.14
Spring JDBC(Java Database Connectivity) 1  (0) 2024.08.12
Spring mvc 3 (예외처리)  (0) 2024.08.05
Spring mvc 2 (CRUD API)  (0) 2024.08.05
Spring mvc 1 (static/template resource)  (0) 2024.08.03

+ Recent posts