기존에 Spring Boot 를 잘 사용중이었는데 어느날 신규API를 추가한 뒤로 기존 API에서 404 Not Found가 발생하기 시작했다.

{

"timestamp": "2019-09-02T02:09:12.322+0000",

"status": 404,

"error": "Not Found",

"message": "No message available",

"path": "/api/devicetelemetry/1/TestDevice1"

}

maven 빌드를 다시 해보기도 하고 API depth를 바꿔보기도 했다. 대소문자도 다시 확인하고.. 

대략 30분정도 삽질을 하다가 예전에 프레임워크 작업할 때 생각났던 component scan 옵션을 찾아봤다!

 

아무 패키지도 설정하지 않으면 기본적으로 최상위 패키지부터 순차적으로 찾아가는데 신규 API를 추가하면서 패키지구조가 약간 틀어졌다.

     <기존> org.apache.telemetry

-> <변경> org.apache.service.telemetry

<신규> org.apache.status

 

이렇게 수정이 되니 신규로 추가된 최상위 패키지인 org.apache.status 만 읽게 되고 org.apache.service 하위는 읽지 않는 문제가 발생한 것이다.

org.apache.service.telemetry

org.apache.service.status 

와 같은 형태로 맞추어주니 다시 동작하지만 동일한 상황이 재발하는 것을 방지하기 위해서 명시적으로 다음 선언을 추가하였다.

@ComponentScan(basePackages="org.apache.service")

'Rest API' 카테고리의 다른 글

Spring HttpPutFormContentFilter  (0) 2017.03.16

<현상>

- REST API를 설계하던 중 form data가 POST방식에서는 정상 동작하지만 PUT에서는 동작하지 않는 현상을 발견


<내용>

- POST의 경우 idempotent  하지 않으며, 리소스의 위치를 지정하지 않을 경우 리소스를 새로 생성한다.

- PUT의 경우 idempotent  하며,  리소스의 위치를 명확히 지정하여 생성/수정을 위해서 사용한다.

- PATCH의 경우 idempotent 하며, 리소스의 위치를 명확히 지정하여 일부 속성을 수정하기 위해서 사용한다.   


<확인>

- 현재 Servlet Spec에서 HTTP POST를 위해서는 form data를 사용하지만, HTTP PUT or PATCH에 대해서는 사용이 불가능하다.

 아마도 수정기능을 위해서 support할 필요가 없다고 느껴서 일지도 모르겠지만 개발을 하다보면 불편한 점을 느끼게 된다.


<해결>

- Spring에서 다음과 같은 Class를 제공한다. 

Class HttpPutFormContentFilter


이 필터는 'application/x-www-form-urlencoded' type의 HTTP PUT & PATCH request를 받아서 HTTP POST Request와 같은 형태로 이용할 수 있도록 form data를 만든다.




참고사이트

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6

http://docs.spring.io/spring/docs/current/javadoc-pi/org/springframework/web/filter/HttpPutFormContentFilter.html

https://1ambda.github.io/javascripts/rest-api-put-vs-post/


'Rest API' 카테고리의 다른 글

Spring Boot Application사용중 404 Not Found 발생  (0) 2019.09.02

+ Recent posts