이제 REST API의 마지막인 PUT과 DELETE method를 구현해보겠습니다. 이정도만 알게되면 나도 이제 API를 만들어서 배포가 가능하게 됩니다. 물론 POST만 사용해도 모든것을 구현할 수 있고... GET만 사용해도 모든것을 구현할 수 있지 않겠습니까?? 하지만 RESTful 로 하는것이 목적이니 나머지도 찬찬히 알아보겠습니다.
기존 관련 API method는 아래 2가지를 참조하시면 됩니다.
2019/11/24 - [SpringBoot] - [Spring Boot] 11. REST API (1) - 개요 및 GET method
[Spring Boot] 11. REST API (1) - 개요 및 GET method
REST란 무엇이고, 어떻게 사용하는 거에요?? 아무것도 모르겠어요... ㅠㅠ 당연하다... 개발을 접하고 이것을 처음 접하는 사람은 그야말로 혼돈의 카오스에 사로잡힐 것입니다. 그래서 아주 간단하게 이해하기 쉽..
ayoteralab.tistory.com
2019/11/27 - [SpringBoot] - [Spring Boot] 12. REST API (2) - POST method
[Spring Boot] 12. REST API (2) - POST method
지난번에 이어서, 이번에는 POST method에 대해서 알아보겠습니다. 이전 내용은 아래 링크로 확인해주세요. 2019/11/24 - [SpringBoot] - [Spring Boot] 11. REST API (1) - 개요 및 GET method [Spring Boot] 11...
ayoteralab.tistory.com
그럼 시작해 볼까요??
4. PUT - /URI/{id}
PUT은 다시 말씀드리지만, Update를 위한 method입니다. 그렇다면 어떤어떤 인자가 필요할까요??
(1) 바꿀대상 (2) 바꿀정보... 이렇게 2가지 가 필요할 것 입니다. 바꿀대상은 {id}에 path parameter로 넣어주고, 바꿀정보는 POST에 넣는 것 처럼 HTTP body에 넣어서 request해줍니다.
그렇게되면... Controller에는 기존에 GET method에 봤던 것과 동일한 주소로... 기능만 Request.PUT만 달라진 Mapping이 생성되게 됩니다.
[Controller.java]
@ApiOperation(httpMethod = "PUT"
,value = "Station Mise 항목 변경"
,notes = "Update Station Mise"
,response = UserDTO.class
,responseContainer = "Integer")
@RequestMapping(value = "/stationMise/{stationName}", method = RequestMethod.PUT)
public ResponseEntity<?> updateStationMise(
@ApiParam(value = "StationMiseDTO", required = true) @RequestBody StationMiseDTO smDTO,
@ApiParam(value = "stationName", required = true) @PathVariable("stationName") String stationName){
L.info("Update Station Mise");
return ResponseEntity.ok(userService.updateStationMise(smDTO, stationName));
}
위에 언급한대로.... @ResquestBody, @PathVariable 이렇게 2가지 annotation이 추가됩니다. 대신 경로는 기존 GET과 아주 동일하네요~ 나머지 Service와 mapper.java는 동일합니다.
[Service.java]
public Integer updateStationMise(StationMiseDTO smDTO, String stationName) {
return userMapper.updateStationMise(smDTO, stationName);
}
[Mapper.java]
Integer updateStationMise(@Param("mydto") StationMiseDTO smDTO, String stationName);
mapper.xml은 parameterType이 2가지가 오기때문에... 그냥 default인자를 하나 넣어줍니다. 그외에는 동일하네요~
[Mapper.xml]
<update id="updateStationMise" parameterType="java.lang.String">
<![CDATA[
UPDATE STATION_MISE
SET PM10_VALUE = #{mydto.pm10Value}, PM25_VALUE = #{mydto.pm25Value}
WHERE STATION_NAME = #{stationName}
]]>
</update>
그럼 기존에 계속 사용했던 table을 한번 update해보겠습니다.
[결과]
어라 STATION_NAME = han river인 아이의 PM10과 PM25값이 각각 변경이 되었습니다. 그럼 Postman을 통해서 어떻게 값을 넣었길래 이렇게 되었을까요??
맞습니다. method는 PUT으로 지정하고... URL에는 stationMise/han river 로 path variable을 추가했고... body에는 다음과 같이 json 타입으로 변경할 값을 지정했습니다. Return은 1이 왔으니... 1개의 행이 잘 변경됬다는 것이지요...!!! 그렇다면 0이 왔다는건... 안됬다는 거겠죠??ㅎㅎ
5. DELETE - /URI/{id}
마지막으로 해당 항목을 삭제하는 method를 구현해 보겠습니다.
이제 어떻게 되는지 구조가 머리속으로 그려지시나요?? 이 아이도 결국 GET, PUT과 동일한 URI를 가집니다. 하지만 method가 다를 뿐이지요. 그리고 body에는 추가할게 없으므로 annotation도 @PathVariable로 한가지 입니다. 그럼 소스를 한번 살펴보겠습니다.
[Controller.java]
@ApiOperation(httpMethod = "DELETE"
,value = "Station Mise 항목 변경"
,notes = "Update Station Mise"
,response = UserDTO.class
,responseContainer = "Integer")
@RequestMapping(value = "/stationMise/{stationName}", method = RequestMethod.DELETE)
public ResponseEntity<?> deleteStationMise(
@ApiParam(value = "stationName", required = true) @PathVariable("stationName") String stationName){
L.info("Update Station Mise");
return ResponseEntity.ok(userService.deleteStationMise(stationName));
}
[Service.java]
public Integer deleteStationMise(String stationName) {
return userMapper.deleteStationMise(stationName);
}
[Mapper.java]
Integer deleteStationMise(String stationName);
[Mapper.xml]
<delete id="deleteStationMise" parameterType="java.lang.String">
<![CDATA[
DELETE FROM STATION_MISE
WHERE STATION_NAME = #{stationName}
]]>
</delete>
postman으로 요청은 아래과 같이 하며, 결과는 그아래 처럼 han river의 데이터가 delete되었습니다.
(특이사항으로는 body에는 아무런 정보가 없네요~)
결과....
지금까지 장장 세번으로 나눠서 REST API에 대해서 알아보았습니다. 이게 가장 기본이니 나머지는 필요할때 응용해서 구현하면 되는 거지요~ 그럼 오랜기간동안 고생많으셨습니다!!!
-Ayotera Lab-
댓글