[spring] settings 폴더
warning: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add ‘@EqualsAndHashCode(callSuper=false)’ to your type.
해결법 2가지 ->
해결방법(1)
- 프로젝트 루트 경로에서 .idea/workspace.xml에서 파일을 열어 <component name = “PropertiesComponent”> 섹션 안에 <property name=”dynamic.classpath” value=”true” /> 태그 추가.
해결방법(2)
-
Run -> -> Edit Configratuins -> shorten command line 항목 -> JAR manifest 로 변경
-
SpringBootservletInitializer -> web.xml 이 없는 SpringBoot 웹 애플리케이션을 외부 Tomcat에서 동작하도록 하기위해 필요
ServletInitalizer.java
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
/*
configure() override
-> war 프로젝트로 생성할 경우 was에 배포(deploy)될 때 spring boot 어플리케이션을 servlet으로 등록하여 서비스 될수 있도록 제공함
war(Web application ARchive) : 웹 프로젝트를 담아놓은 파일을 WAR
이걸 왜 쓰냐면 웹 프로젝트를 만들고 배포 시에 프로젝트 폴더째로 전해줄 수가 없으니 웹 프로젝트를 WAR 형태로 Export 시키고 WAR 파일을 넘겨주면 웹 프로젝트 파일을 받는 쪽에서는 받은 WAR 파일로 Import를 하면 웹 프로젝트를 간단히 내 쪽으로 옮겨올 수 있게 된다. (압축파일과 비슷한듯)
*/
return application.sources(InPhRstudyApplication.class);
}
Settings/SwaggerHandler.java
package kr.co.test.study.settings;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
public class SwaggerHandler extends WebMvcConfigurerAdapter {
/*
* WebMvcConfigurerAdapter 를 상속해서 url을 정적 맵핑할수 있음
*
* */
/*
* addResourceHandlers()
* 리소스 등록 및 핸들러를 관리하는 객체인 ResourceHandlerRegistry를 통해 리소스 위치와 이 리소스와 매칭될 url을 등록가능
* */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/**")
.addResourceLocations("classpath:/META-INF/resources/");
/*localhost:8080/api/~~~ url에 classpath/META-IF/resource/ 를 맵핑시킨다.*/
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
/*localhost:8080/webjars/~~~ url에 classpath/META-IF/resource/webjars 를 맵핑시킨다.*/
/*
* http://localhost:8080/webjars/~~~ 요청이 오면 /META-IF/resource/webjars/~~.html 을 찾아서 보내줌*/
}
/*
* 컨트롤러 클래스 없이 특정 view에대한 컨트롤러를 추가*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/api/v2/api-docs", "/v2/api-docs").setKeepQueryParams(true);
// /api/v2/api-doces 요청이 오면 /v2/api-docs 으로 url을 리다이렉트 시켜준다.
/*setKeepQueryParms()
* 대상 리디렉션 URL을 통해 현재 요청의 쿼리 매개변수를 전파할지 여부 설정.
* <p>기본값은 {@code false}입니다.
*/
registry.addRedirectViewController("/api/swagger-resources/configuration/ui", "/swagger-resources/configuration/ui");
registry.addRedirectViewController("/api/swagger-resources/configuration/security", "/swagger-resources/configuration/security");
registry.addRedirectViewController("/api/swagger-resources", "/swagger-resources");
}
}
정적 리소스 지원
1) 기본 리소스 위치
- 기본 리소스 위치는 다음과 같다.
classpath:/static
classpath:/public
classpath:/resources/
classpath:/META-INF/resources
예를 들어, resources/static/hello.html 을 만들면 http://localhost:8080/hello.html 로 접근할 수 있다.
2) 접근 url path 설정
기본 리소스 위치에 대한 접근 url 설정은 application.properties 에서 spring.mvc.static-path-pattern 을 통해서 바꾸면 된다.
예를 들어, spring.mvc.static-path-pattern = /static/** 으로 설정하면, http://localhost:8080/static/hello.html 으로 접근해야 한다.
3) 리소스 핸들러 커스터마이징
기존 스프링 부트의 리소스 핸들러에, 추가적인 커스터마이징을 할 수 있다.
config/WebConfig.java 를 만들고 다음 내용을 입력하자.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/m/**")
.addResourceLocations("classpath:/m/")
.setCachePeriod(20);
}
}
위 코드는 /m/ 으로 시작하는 리소스 요청이 오면, classpath:/m/ 위치에서 해당 리소스를 찾겠다는 의미이다.
예를 들어, http://localhost:8080/m/hello.html 요청이 오면 resources/m/hello.html 을 찾아서 보내준다.
Settings/SwaggerConfig.java
package kr.co.test.study.settings;
import com.google.common.base.Predicates;
import kr.co.test.study.api.properties.EnvPropertise;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import javax.annotation.PostConstruct;
@Configuration
@EnableSwagger2
@DependsOn("EnvPropertise")
public class SwaggerConfig {
private static String url;
/**
* @PostConstruct는 의존성 주입이 이루어진 후 초기화를 수행하는 메서드이다. (즉 제일 처음부분에 실행되어지는 메소드)
* @PostConstruct가 붙은 메서드는 클래스가 service(로직을 탈 때? 로 생각 됨)를 수행하기 전에 발생한다.
* 이 메서드는 다른 리소스에서 호출되지 않는다해도 수행된다.
*
*/
@PostConstruct
public void init(){
url = EnvPropertise.get("api.url");
}
// api/properties/EnvPropertiese.java -> get(string key) { return properties.getProperty(key); }
// ' api.url ' 이라는 property 를 가져오는 메소드
/**
* API Documents는 API 사용 방법을 사용자(end user)에게 알려주는 문서다.
* Sprinboot에서 Swagger를 사용하면, 컨트롤러에 명시된 어노테이션을 해석하여 API 문서를 자동으로 만들어준다.
*/
@Bean
public Docket backApi() {
return new Docket(DocumentationType.SWAGGER_2)
.host(url)
.groupName("2. back")
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.ant("/api/back/**"))
.build()
.apiInfo(apiInfo());
}
/*
* Docket - Swagger 설정의 핵심이 되는 Bean. API 자체에 대한 스펙은 컨트롤러에서 작성한다.
설정 정보
useDefaultResponseMessages() - false로 설정하면, swagger에서 제공해주는 응답코드 ( 200,401,403,404 )에 대한 기본 메시지를 제거한다. 불필요한 응답코드와 메시지를 제거하기 위함이며,
컨트롤러에서 명시해줄 것이다.
groupName() - Docket Bean이 한 개일 경우 기본 값은 default이므로, 생략가능, 여러 Docket Bean을 생성했을 경우 groupName이 충돌하지 않아야 하므로, 각 Docket Bean의 버전을 명시해줘야 한다.
select() - ApiSelectorBuilder를 생성한다.
apis() - api 스펙이 작성되어 있는 패키지를 지정한다. 즉, 컨트롤러가 존재하는 패키지를 basepackage로 지정하여, RequestMapping( GetMapping, PostMapping ... )이 선언된 API를 문서화한다.
paths() - apis()로 선택되어진 API중 특정 path 조건에 맞는 API들을 다시 필터링하여 문서화한다.
apiInfo() - 제목, 설명 등 문서에 대한 정보들을 보여주기 위해 호출한다. 파라미터 정보는 다음과 같다.
public ApiInfo( title, description, version, termsOfServiceUrl, contact, license, licenseUrl, vendorExtensions )
*
* */
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.host(url)
.groupName("1. front")
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.ant("/api/**"))
.paths(Predicates.not(PathSelectors.ant("/api/back/**")))
.paths(Predicates.not(PathSelectors.ant("/api/home/**")))
.paths(Predicates.not(PathSelectors.ant("/api/failMessage/**")))
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("inPHR study API")
.description("신입 직원 스터디를 위한 스터디 API 서버")
.version("1.0.0")
.build();
}
// 스웨거 스니펫 참고사이트
// https://www.codota.com/code/java/classes/io.swagger.annotations.ApiImplicitParam
}
Settings/SwaggerHandler.java
- 각 필요 String 들 정의한 클래스