일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 파일삭제
- .out
- 부스트코스
- springsecurity
- CS50
- springmvc
- DispatcherServlet
- MVC모듈
- assume True
- assuming That
- securityconfig
- c언어
- 원격저장소
- MVC
- 컴퓨터과학
- Junit5
- 스프링프레임워크
- gitbash
- GitHub
- Git
- assume That
- container
- Swagger
- springframeworkruntime
- assume
- springboot
- swaggerUrl
- 팀과제
- Spring
- .idea
- Today
- Total
도담이 먹여 살려야하는 집사
JavaConfig2[SwaggerConfig/WebMvcContextConfiguration] 본문
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 설정하기 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
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/**");
}
[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;
}
[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 |