[spring] settings 폴더

3 분 소요

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 들 정의한 클래스