본문 바로가기
프로그램/스프링

전자정부 프레임워크 Swagger UI 적용

by cbwstar 2022. 1. 13.
728x90
반응형

1. pom.xml  파일에 seagger 관련 라이브러리 추가

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

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

2. egov-com-servlet.xml 파일에 객체생성및 파일위치 추가

<!--
<bean id="swaggerConfig" class="springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration"/>
-->
<bean id="swaggerConfig" class="egovframework.com.cmm.config.SwaggerConfig"/>

<mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/>
<mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/>

<!-- annotation-driven 설정. -->
<mvc:annotation-driven />

<!-- efault servlet 은 .html .css .js -->
<mvc:default-servlet-handler />

전자정부에서는 자바 config파일에서 그냥 bean 객체를 생성하면 오류가 발생하여서 xml파일에서 객체를 생성하여 준다.

3. SwaggerConfig.java 파일 생성

package egovframework.com.cmm.config;

import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseMessageBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;


@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig {

    @Bean
    public Docket customImplementation() {
        return new Docket(DocumentationType.SWAGGER_2)
                .host("192.168.2.13:9000")          //서비스하는 url주소가 다른경우 주소 설정
                .groupName("그룹명")
                .useDefaultResponseMessages(false)  // 기존적인 응답메시지 미사용
                .globalResponseMessage(RequestMethod.POST, getArrayList()) // 정의한 응답메시지 사용
                .apiInfo(getApiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("egovframework.frmprd.ifh.api"))
                .paths(PathSelectors.any())
                .build();
    }

    // 선택항목(Swagger UI에서 보여지는 정보)
    public ApiInfo getApiInfo() {
        return new ApiInfo("Rest Api 연계서비스",
                "REST Api Service ",
                "1.0",
                "https://www.test.go.kr",
                new Contact("테스트시스템","https://www.test.go.kr","test@test.email"),
                "Apache License Version 2.0",
                "https://www.test.go.kr",
                new ArrayList<VendorExtension>());
    }


    private ArrayList<ResponseMessage> getArrayList() {
        ArrayList<ResponseMessage> lists = new ArrayList<ResponseMessage>();
        lists.add(new ResponseMessageBuilder().code(500).message("500 ERROR").build());
        lists.add(new ResponseMessageBuilder().code(403).message("403 ERROR").build());
        lists.add(new ResponseMessageBuilder().code(401).message("401 ERROR").build());
        return lists;
    }
}

4. 시큐리티 사용시 예외 처리

<security:http pattern="/v2/api-docs" security="none"/>
<security:http pattern="/swagger-resources/**" security="none"/>
<security:http pattern="/webjars/**" security="none"/>
<security:http pattern="/swagger-ui.html" security="none"/>

5. RestController.java

package egovframework.frmprd.ifh.api.web;

import egovframework.rte.psl.dataaccess.util.EgovMap;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;

/**
 * <pre>
 * @title
 * @desc    RestApi 
 * -  DistbHistDclrApiController
 * @egovframework.frmprd.ifh.api.web
 * <pre>
 * @author  CBW
 * @since   2022.01.12.
 * @version 1.0
 * @see
 * =================== 변경 내역 ==================
 * 날짜        변경자       내용
 * ------------------------------------------------
 * 2022.01.12. CBW 최초작성
 *
 */

@Api(value = "test")
@Slf4j
@RestController
@RequestMapping("/restApi/v1")
public class DistbHistDclrApiController {

    @ApiModelProperty(value = "유저 이름",  dataType = "string")
    private String name;


    @ApiOperation(value = "카드목록 조회",tags = "테스트", httpMethod = "GET", notes = "전체 카드목록을 조회한다.")
    @ApiImplicitParams( value = {
            @ApiImplicitParam(name = "age", value = "유저 나이", required = true, dataType = "integer", paramType = "form"),
            @ApiImplicitParam(name = "name", value = "유저 이름", required = true, dataType = "string", paramType = "form"),
            @ApiImplicitParam(name = "userNo", value = "유저 번호", required = true, dataType = "long", paramType = "form")})
    @GetMapping("/test/{cardNo}")
    public ModelAndView getTest(@PathVariable("cardNo") String cardNo, HttpServletRequest request) throws Exception {

        log.debug("get방식 호출");

        Enumeration<String> eHeader = request.getHeaderNames();
        HashMap<String, Object> headerMap = new HashMap<String, Object>();

        while(eHeader.hasMoreElements()) {
            String headerName = eHeader.nextElement();
            headerMap.put(headerName, request.getHeader(headerName));
        }

        log.debug("cardNo" + cardNo);
        HashMap<String, Object> tempMap = new HashMap<String, Object>();

        log.debug("headerMap.get(\"content-type\")" + headerMap.get("content-type"));

        if("application/json".equals(headerMap.get("content-type"))){
            //JSONObject jsonObject = JsonUtil.getStringToJsonObecjt(request);
        }

        StringBuffer requestURL = request.getRequestURL();
        String servletPath = request.getServletPath();

        ModelAndView mav = new ModelAndView("jsonView");
        EgovMap resultMap = new EgovMap();

        try {
              // 목록 조회
              // mav.addObject("dataList" , defaultService.select(tempMap));
              // DB SQL 실행 테스트
               resultMap.put("result" , "SUCCESS");
               resultMap.put("message" , "정상적으로 조회되었습니다.");
           } catch(Exception ex) {
               resultMap.put("result" , "ERROR");
               resultMap.put("message" , "조회중 오류가 발생하였습니다");
               ex.printStackTrace();
           } finally {
               mav.addObject("result" , resultMap);
           }

           return mav;

    }

    @PostMapping("/test/{cardNo}")
    public ModelAndView postTest(@PathVariable("cardNo") String cardNo, HttpServletRequest request) throws Exception {
        log.debug("post방식 호출" + cardNo);
        ModelAndView mav = new ModelAndView("jsonView");
        EgovMap resultMap = new EgovMap();
        resultMap.put("result" , "SUCCESS");
        resultMap.put("message" , "정상적으로 조회되었습니다.");
        mav.addObject("result" , resultMap);
        return mav;
    }

    @PutMapping("/test/{cardNo}")
    public ModelAndView putTest(@PathVariable("cardNo") String cardNo, HttpServletRequest request) throws Exception {
        log.debug("put방식 호출" + cardNo);
        ModelAndView mav = new ModelAndView("jsonView");
        EgovMap resultMap = new EgovMap();
        resultMap.put("result" , "SUCCESS");
        resultMap.put("message" , "정상적으로 조회되었습니다.");
        mav.addObject("result" , resultMap);
        return mav;
    }

    @DeleteMapping("/test/{cardNo}")
    public ModelAndView deleteTest(@PathVariable("cardNo") String cardNo, HttpServletRequest request) throws Exception {
        log.debug("delete방식 호출" + cardNo);
        ModelAndView mav = new ModelAndView("jsonView");
        EgovMap resultMap = new EgovMap();
        resultMap.put("result" , "SUCCESS");
        resultMap.put("message" , "정상적으로 조회되었습니다.");
        mav.addObject("result" , resultMap);
        return mav;
    }
}
728x90
반응형

댓글



"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

loading