도담이 먹여 살려야하는 집사

JavaConfig2[SwaggerConfig/WebMvcContextConfiguration] 본문

Spring

JavaConfig2[SwaggerConfig/WebMvcContextConfiguration]

천재도담 2020. 12. 21. 10:11

Api Docs(Swagger)를 설정하기 위한 페이지 (API 스펙을 문서로 관리하지 않고 swagger을 통해 자동화시키는 것) 

우선 pom.xml에 swagger 의존성을 추가해 준다.

<!-- swagger2 -->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.6.1</version>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.6.1</version>
    </dependency>

springfox-swagger-ui는 문서를 예쁘게 보여주고, 테스트 기능을 위해서 추가 해줌 (보통 테스트는 postman을 많이 사용함)


@Configuration
@EnableSwagger2
public class SwaggerConfig {

@Configuration 은 설정파일에 붙여주는 Annotation

@EnableSwagger2 은 swagger2를 활성화 해주기 위한 어노테이션이다.

@Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo())
                .useDefaultResponseMessages(false);
    }

swagger2를 사용하기 위해서는 Docket Bean을 품고있는 설정클래스가 필요하다.

  • Spring boot 에서는 기본적이 설정파일 1개로 swagger와 swagger UI 를 함께 사용가능함.
  • Spring MVC 경우 swagger UI 를 위한 별도의 설정이 필요하다.
    • 그래서 swagger UI 를 ResourceHandler에 수동으로 등록해야하는 작업을 수행해야한다.

.useDefaultResponseMessages(false)

  • false : swagger에서 제공해주는 응답코드에 대한 기본메세지를 제거함
    • 불필요한 응답코드와 메세지를 제거하기 위함 >> 컨트롤러에서 명해줌!

.select()

  • ApiSelectorBuilder 를 생성 한다.
    • swagger에 의해 노출되는 끝단을 제어하는 하나의 방법을 제공해 준다.

.apis(RequestHandlerSelectors.any())

  • any() 를 사용할 경우 >> 모든 api 스펙을 받게 됨.
  • 컨트롤러가 존재하는 패키지를 basepackage로 지정할 경우 >> RequestMapping이 선언된 api를 문서화 함.

.paths(PathSelectors.any())

  • .apis로 선택되어진 API중 특정 path조건에 맞는 API들을 다시 필터링 하여 문서화 함.
  • .paths(PathSelectors.ant("/api/**")) >> 그중 /api/** 인 URL들만 필터링

private ApiInfo getApiInfo() { return new ApiInfoBuilder().title("부스트코스 백엔드 Web REST API").description("부스트코스 백엔트 Web REST API 입니다.").version("1.0.0").build(); }

.apiInfo(getApiInfo())

  • 제목, 설명 등 문서에 대한 정보들을 보여주기 위해 호출

    • 파라미터 정보 : public ApiInfo( title, description, version, termsOfServiceUrl, contact, license, licenseUrl, vendorExtensions )

    Spring REST API에 Swagger 2 설정하기

 

Spring REST API에 Swagger 2 설정하기

Spring REST API에 Swagger 2 설정하기 Setting Up Swagger 2 with a Spring REST API (원문소스: http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) 1. 개요 Overview REST API를 만들 때..

springboot.tistory.com


WebMvcContextConfiguration

DispatcherServlet이 실행될 때 읽어들이는 설정파일

HandlerMapping, HandlerAdaper, 컨트롤러, ViewResolver 빈이 등록되어 있어야함 .

우선 WebMvc를 사용하기 위해서 pom.xml 에 의존성을 추가해준다.

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
@Configuration
@EnableWebMvc
@PropertySource(value = {"classpath:application.properties"})
@Import({SwaggerConfig.class})
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter implements WebMvcConfigurer {

WebMvcConfigurerAdapter 를 사용할 경우 (MVC 5.x.x 이상일 경우) 'org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter' is deprecated

라는 경고 메세지가 뜬다. 이 이유는 Spring 5 부터 WebMvcConfigurer 인터페이스를 구현하면 된다,

implements WebMvcConfigurer >> Java 8 이 WebMvcConfigurerAdapter 클래스의 기능을 다루는 인터페이스에 기본 메소드를 도입했기 때문이다.

 

                 👇WebMvcConfigurerAdapter Deprecated.

WebMvcConfigurerAdapter (Spring Framework 5.3.1 API)

 

WebMvcConfigurerAdapter (Spring Framework 5.3.2 API)

 

docs.spring.io

                👇Interface WebMvcConfigurer

docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurer.html

 

WebMvcConfigurer (Spring Framework 5.3.2 API)

 

docs.spring.io

Spring에서는 모든 요청이 DispatcherServlet을 통해 처리가 되는데 DistpatcherServlet(Front controller)을 통해 정적 파일 요청을 피하기위해 MVC 정적 컨텐츠를 구성함.

 

@EnavleWebMvc

  • 어노테이션 기반의 Spring MVC 를 구성할때 필요한 Bean을 자동으로 설정해주는 어노테이션
  • DispatcherServlet의 ``RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, MessageConverter 등 Web에 필요한 빈들을 대부분 자동으로 등록
@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**").excludePathPatterns("/img/**");
    }

cnpnote.tistory.com/entry/SPRING-WebMvcConfigurerAdapter-%EC%9C%A0%ED%98%95%EC%9D%80-%EC%82%AC%EC%9A%A9%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4

 

[SPRING] WebMvcConfigurerAdapter 유형은 사용되지 않습니다.

WebMvcConfigurerAdapter 유형은 사용되지 않습니다. 난 그냥 봄 MVC 버전 5.0.1.RELEASE로 마이 그 레이션하지만 갑자기 이클립스에서 STS WebMvcConfigurerAdapter는 사용 중지됨으로 표시됩니다 public class M..

cnpnote.tistory.com

InterceptorRegistry

  • 특정 url 진입 시 로그인된(인가 된)사용자가 접근을 해야함.
  • 특정 url 진입 시 Jwt와 같은 토큰을 검사해야 함.
  • 특정 url의 경우 계정의 권한에 따라 접근을 막아야함.(view에서 처리도 가능)

무언가를 진행할때 특정 작업을 수행 해야하는 것이 인터셉터

(Java 웹 프로그래밍에서는 이런 작업을 하는 기술로 Servlet Filter, Interceptor, Aop 가 있음.)

인터셉터와 서블릿 필터의 차이점

 

Servlet Filter : Dispatcher Servlet의 앞에서 들어오는 요청 정보를 처리

  • J2EE의 표준 스펙에 정의
  • Dispatcher Servlet전에 호출 되므로 Spring 프레임워크와 무관한 것을 처리 할 수 있음.

Interceptor : Dispatcher Servlet의 뒤의 Handler 영역에서 요청 정보를 처리

  • Spring 프레임워크에서 자체적으로 제공하는 기능
  • 회원 인증 검사등의 비즈니스 레벨의 처리 로직을 작성하는데 적합하다.

사용자 요청(Request) -> Servlet Filter -> Dispatcher Servlet -> Interceptor -> Controller

Interceptor 구현하기 위해선 HandlerInterceptor 인터페이스 구현 HandlerInterceptorAdapter 추상 클래스를 상속받아 구현해야한다.

public class HttpInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(handler.toString() + " 를 호출했습니다.");
                return true;
    }
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println(handler.toString() + " 가 종료되었습니다.  " + modelAndView.getViewName() + "을 view로 사용합니다.");
    }

처음에는 위에와 같이 코딩을 했는데 좀 더 찾아보니 system.out을 찍는 것은 상용 시스템에서는 거의 불가능하다고 한다. >> 보안 이슈로 대두

log4j 에서 slf4j 로 또 바뀌었다고 한다. (잘 모르겠음 나중에 시간나면 더 찾아봐야 겠다.)

slf4j : Simple Logging Facade for Java(SLF4J) 는 java 로깅 모듈들의 추상체라고 한다. 이것도 의존성 추가 해주면된다.

<dependency>
      <groupId> org.apache.cassandra</groupId>
      <artifactId>cassandra-all</artifactId>
      <version>0.8.1</version>
    </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
      </dependency>

우리는 실제 코드상에서는 slf4j의 interface코드를 사용하고 실제 로깅을 하는 구현체는 추가로 참조한 라이브러리에서 구현된다.

private final static Logger logger = LoggerFactory.getLogger(HandlerInterceptor.class);

로그를 남기려는 클래스에 로거 객체를 필드로 선언한다. org.slf4j 패키지의 LoggerFactory를 이용하여 Logger 객체를 생성

@Override
    public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println(handler.toString() + " 를 호출했습니다.");
        String date = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
        logger.debug("======================LoggerInterceptor START======================");
        // 요청 URI
        logger.debug("Request URI : " + request.getRequestURI());
        logger.debug("Start time : " + date);

        return preHandle(request, response, handler);
    }
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           ModelAndView modelAndView) throws Exception {
        logger.debug("======================LoggerInterceptor END======================");
    }

Spring, HandlerInterceptor(인터셉터) 구현하기

 

Spring, HandlerInterceptor(인터셉터) 구현하기

개요 Java EE에는 HTTP 요청에 대한 응답을 수행하는 HttpServlet (@WebServlet)이 존재하며 이러한 서블릿 실행 전후 시점에 임의의 처리를 가능하게 해주는 Filter (@WebFilter)가 존재한다. 필터는 체인 형태

jsonobject.tistory.com

Spring Boot에서 Interceptor 사용하기

 

Spring Boot에서 Interceptor 사용하기

인터셉터?Spring 또는 Spring Boot 프레임워크로 웹 어플리케이션을 개발하다 보면 아래와 같은 요구사항이 생기게 됩니다. 특정 url 진입 시 로그인이 된(인가된) 사용자가 접근을 해야 함 특정 url 진

elfinlas.github.io

configureDefaultServletHandling

  • default servlet habdler를 사용하도록 만듬.
  • 매핑 정보가 없는 Url 요청이 들어왔을 경우 >> DefaultServletHttpRequestHandler가 처리하도록 함.
  • 매핑이 없는 URL이 넘어올 경우 WAS의 default servlet이 static한 자원을 읽어서 보여줄 수 있게끔 해주는 설정도 있음.
@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

addResourceHandlers

URL 요청이 /css/~~ 로 들어올 경우 /css/폴더에서 읽어오도록 설정하는 부분

Spring MVC에서는 Static Resources(정적 리소스)를 설정 해줘야함

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
        registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
        registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
    }

.addResourceHandler >> 매핑 URL 설정

.addResourceLocations >> 정적 리소스 위치 설정

                           👉public static final int CHCHE_PERIOD = 31556926; >> 가독성과 유지보수를 위해 상수화

addViewControllers

  • 특정 url에 대해서 컨트롤러 클래스를 추가하지 않고 view를 매핑할 수 있다.
  • /로 접속 시 main이라고 하는 view가 보여진다.
@Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }

InternalResourceViewResolver

  • view name은 view resolver라는 객체를 이용해서 찾는다
  • resolver 생성해서 view 이름에 프리픽스, 서픽스를 지정한다
  • 찾는 뷰의 최종 루트: [/WEB-INF/view/main.jsp]
@Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

stdbc.tistory.com/21

 

[Spring] [Config] WebMvcContextConfiguration

WebMvcContextConfiguration DispatcherServlet이 실행될 때 읽어들이는 설정파일 #DispatcherServlet HandlerMappig, HandlerAdapter, 컨트롤러, ViewResolver 빈이 등록되어 있어야 한다 Maven에 WebMvc 의존..

stdbc.tistory.com

 

'Spring' 카테고리의 다른 글

[Spring Security] Security Config - Swagger Url  (0) 2020.12.28
JAVAConfig[ApplicationConfig/DBConfig]  (0) 2020.12.01
[Spring] Container & Ioc & DI  (0) 2020.10.26
Spring Framework?  (0) 2020.10.26
Comments