지난 번에 구현했던 rest api 프로젝트에 Swagger를 통해서 문서화 하고 rest api를 테스트 해 볼 수 있는 web ui를 만드는 방법을 소개합니다.
스웨거는 rest api를 문서화 하고 기술하는 스펙임. swagger.json 혹은 swagger.yaml이 곧 rest api의 명세를 작성하는 방법이 되는 것. 서브 프로젝트로
swagger-editor : 스웨거 명세를 작성하게 도와주는 텍스트 에디터. 온라인 데모
swagger-ui: swagger api를 문서화 해서 보여주고 직접 rest api call도 해볼 수 있음 온라인 데모
swagger-codegen : swagger 명세를 기반으로 각 언어로 소스 뼈대를 만들어줌. Java, Scala, node 등을 지원해 줌. 등이 있고, 잘 사용하면 유용하게 사용할 수 있다.
swagger integration 먼저 pom.xml 에 swagger dependency를 추가하고
1 2 3 4 5 <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-jersey2-jaxrs</artifactId> <version>1.5.0</version> </dependency>
web.xml. Jersey2Config는 swagger.json을 위한 것이고 기타 api.version과 basepath등을 여기서 설정해 준다.
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 <servlet> <servlet-name>jersey</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value> io.swagger.jaxrs.listing, com.nberserk.rest </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>Jersey2Config</servlet-name> <servlet-class>io.swagger.jersey.config.JerseyJaxrsConfig</servlet-class> <init-param> <param-name>api.version</param-name> <param-value>1.0.0</param-value> </init-param> <init-param> <param-name>swagger.api.basepath</param-name> <param-value>http://localhost:8080/rest</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet>
Swagger로 annotation추가 하기 이제 문서화를 할 차례다. Hello class에는 @Api, @ApiOperation
annotation으로 Model class에는 @ApiModel, @ApiModelProperty
로 annotation을 달아주면 나중에 swagger-ui로 보면 어노테이션한 설명들이 표시가 된다.
annotation된 Hello class
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 31 32 33 34 @Api (value="/hello" , description="hello APIs" )@Path ("hello" )public class Hello { static Model model; static { model = new Model("Darren" ); model.setDesc("description" ); } @ApiOperation (value = "" , notes = "Gets model (text)" , response = Model.class) @Path ("/text" ) @GET @Produces (MediaType.TEXT_PLAIN) public String getText () { return model.toString(); } @ApiOperation (value = "" , notes = "Gets model (json)" , response = Model.class) @Path ("/json" ) @GET @Produces (MediaType.APPLICATION_JSON) public Response getJson () { return Response.ok().entity(model).build(); } @ApiOperation (value = "" , notes = "Gets model (xml)" , response = Model.class) @Path ("/xml" ) @GET @Produces (MediaType.APPLICATION_XML) public Response getXml () { return Response.ok().entity(model).build(); } }
annotation된 Model class
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 31 32 33 ApiModel(description="Model" ) @XmlRootElement public class Model { String id; String desc; public Model (String id) { this .id = id; } @ApiModelProperty (required = true , value = "id" ) public String getId () { return id; } public void setId (String id) { this .id = id; } public void setDesc (String desc) { this .desc = desc; } @ApiModelProperty (value = "description" ) public String getDesc () { return desc; } @Override public String toString () { return "id: " + id + ", desc: " + desc; } }
Swagger가 잘 설정되었는지를 보려면 브라우저로 rest/swagger.json 여기 들어가서 json 파일이 보면 설정이 잘 된 것이다.
swagger-ui 자 이제 모든 준비는 끝났다. swagger-ui 에 가서 http://localhost:8080/rest/swagger.json
을 입력하면 annotation에서 기술했던 정보들이 문서화 되어서 나오고, 여기서 바로 rest api를 불러 볼 수 도 있다. 모든 개발자는 문서화를 싫어하고, 소스와 싱크를 맞추는 일 또한 노력과 정성이 들어가기 때문에 소스에 annotation만 잘 해주면 싱크도 맞춰지니까 유용한 툴이 될 것이다. 아래 스크린샷 참고.
Reference 실제로 동작하는 프로젝트는 github에 공유되어 있으니 참고하시면 되겠다.
revision history
2015/7/14 initial draft
2015/7/17 rest/swagger 분리