들어가기 전에
전 시간에는 Spring MVC와 Swagger를 사용하도록 프로젝트를 생성했습니다.
이번 시간엔 생성된 프로젝트에 Web API를 추가하고 Swagger를 이용해 테스트하겠습니다.
학습 목표
- Spring MVC프로젝트에 Web API를 추가하고, Swagger를 이용하여 명세를 확인하고 테스트 할 수 있습니다.
핵심 개념
- Swagger를 이용한 Web API 자동 명세화 및 테스트
학습하기
들어가기 전에
전 시간에는 Spring MVC와 Swagger를 사용하도록 프로젝트를 생성했습니다.
이번 시간엔 생성된 프로젝트에 Web API를 추가하고 Swagger를 이용해 테스트하겠습니다.
학습 목표
핵심 개념
학습하기
이번 시간엔 지난 시간에 생성한 웹 프로젝트에 덧셈, 뺄셈을 하는 기능을 가진 Web API를 추가하고
스웨거를 이용해 자동으로 생성된 명세를 확인하고 테스트하겠습니다.
1. CalculatorService 클래스 작성하기
덧셈, 뺄셈 기능을 가진 CalculatorService클래스를 작성합니다.
package org.edwith.webbe.calculator.service;
import org.springframework.stereotype.Service;
@Service
public class CalculatorService {
public int plus(int value1, int value2){
return value1 + value2;
}
public int minus(int value1, int value2){
return value1 - value2;
}
}
CalculatorService클래스는 컴포넌트 스캔을 통해 자동으로 Bean으로 등록됩니다.
2. Web API 클래스 작성하기
다음과 같은 기능을 가진 Web API를 작성해보도록 하겠습니다.
결과값을 표현하는 CalculatorResult클래스를 다음과 같이 작성합니다.
package org.edwith.webbe.calculator.dto;
public class CalculatorResult {
// 아래의 상수값은 enum으로 변경 가능하다.
public static final String PLUS_OPERATION = "+";
public static final String MINUS_OPERATION = "-";
private int value1;
private int value2;
private String operation;
private int result;
public int getValue1() {
return value1;
}
public void setValue1(int value1) {
this.value1 = value1;
}
public int getValue2() {
return value2;
}
public void setValue2(int value2) {
this.value2 = value2;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
}
컨트롤러 클래스를 작성합니다.
package org.edwith.webbe.calculator.controller.api;
import io.swagger.annotations.*;
import org.edwith.webbe.calculator.dto.CalculatorResult;
import org.edwith.webbe.calculator.service.CalculatorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping(path = "/api/calculator")
public class CalculatorApiController {
@Autowired
private CalculatorService calculatorService;
@ApiOperation(value = "덧셈 구하기")
@ApiResponses({ // Response Message에 대한 Swagger 설명
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 500, message = "Exception")
})
@GetMapping("/plus")
public CalculatorResult plus(@RequestParam("value1")int value1, @RequestParam("value2") int value2){
CalculatorResult calculatorResult = new CalculatorResult();
calculatorResult.setValue1(value1);
calculatorResult.setValue2(value2);
calculatorResult.setOperation(CalculatorResult.PLUS_OPERATION);
calculatorResult.setResult(calculatorService.plus(value1, value2));
return calculatorResult;
}
@ApiOperation(value = "덧셈 구하기")
@ApiResponses({ // Response Message에 대한 Swagger 설명
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 500, message = "Exception")
})
@GetMapping("/minus")
public CalculatorResult minus(@RequestParam("value1")int value1, @RequestParam("value2") int value2){
CalculatorResult calculatorResult = new CalculatorResult();
calculatorResult.setValue1(value1);
calculatorResult.setValue2(value2);
calculatorResult.setOperation(CalculatorResult.MINUS_OPERATION);
calculatorResult.setResult(calculatorService.minus(value1, value2));
return calculatorResult;
}
}
응답 결과를 JSON으로 하기 위해서 @RestController 어노테이션을 클래스 위에 붙여줍니다.
PATH가 공통적으로 "/api/calculator"로 하기 위해서 클래스 위에 @RequestMapping(path = "/api/calculator") 를
붙여주었습니다.
@ApiOperation과 @ApiResponse는 스웨거가 제공하는 어노테이션입니다.
@ApiOperation은 Web API의 간단한 설명을 적어줄 때 사용합니다.
아래는 ‘덧셈 구하기’라는 설명을 표현하고 있습니다.
@ApiOperation(value = "덧셈 구하기")
@ApiResponse는 응답 메시지에 대한 명세를 위해 사용합니다.
HTTP 응답 코드에 따라서 어떤 결과를 나타내는지 설명하고 있습니다.
200 응답 코드일 경우에는 ‘OK’를, 500 응답 코드일 경우에는 ‘Exception’인 것을 표현합니다.
@ApiResponses({ // Response Message에 대한 Swagger 설명
@ApiResponse(code = 200, message = "OK"),
@ApiResponse(code = 500, message = "Exception")
})
3. Web API 실행하기
Context Root경로를 /calculator로 지정하고 웹 어플리케이션을 실행합니다.
웹 어플리케이션을 실행한 후 브라우저에서 다음과 같은 URL을 입력합니다.
http://localhost:8080/calculator/api/calculator/plus?value1=5&value2=10
생각해보기
이번 시간엔 스웨거를 이용해 자동으로 생성된 Web API 명세를 확인하고, 테스트를 수행해 보았습니다.
@ApiOperation, @ApiResponse등의 어노테이션을 이용해 추가적인 설명을 붙였었는데요.
Web API를 자동으로 생성하지 않는다면 어떤 문제가 있을지 생각해보시기바랍니다.
참고 자료
https://github.com
comment
설정파일부터 모두 복붙해서 프로젝트 생성하고 url을 입력해봤는데 404 에러가 뜨네요. WAS 실행 후 index.jsp는 정상적으로 읽어들이는데, RestController에 설정한 메소드가 하나도 매핑이 안되는 것 같습니다.. 계속 헤매고 있는데 도움 주실 분 있으신가요. 이런 부분은 해당 강의에서 많이 아쉽네요.
-- 포기하고 다음 강의로 넘어갔다가 계속 컨트롤러 메소드와 매핑이 안되서 또 헤맸습니다.
삽질 하다가 해결했습니다. 다른 분들도 저와 같은 경우가 있을까봐 글 남겨요.
1. web.xml에 버전 값이 2.3으로 기본 설정이 되어 있기 때문에 이 값을 바꿔주든지 자바 파일로 설정할 경우에는 그냥 삭제
2. [navigator]- [.settings]에서 facet.core.xml 파일에서 facet="jst.web" version="3.1" 변경하고 난 뒤 적용이 프로젝트 업데이트 후에도 제대로 적용이 안되어서 계속 프로젝트에 오류가 나있어서 업데이트할 때 강제로 업데이트하기 설정을 선택.
1번 내용은 강의 중에도 나온 내용이었는데 제가 놓쳤었네요..
main/webapp/WEB-INF/web.xml 이 존재한다면, Servlet 설정시 web.xml의 설정 파일을 먼저 읽어들이게 되고 WebAppInitializer 설정 파일은 읽지 않게 된다. 즉, 나는 WebAppInitializer Config가 하나도 설정되지 않아서 Swagger-ui.html 페이지가 보이지 않았다.
즉, 나와 같은 이슈를 겪는 사람들은 web.xml 파일을 삭제해보고 위의 영상을 그대로 따라해보면 정상 동작할 것 같다.
왜 Calculator Api Controller가 안뜨는지 모르겠네요 ㅠㅠ
감사합니다!!