์ ์๋ ๊ฒฝ๋ก๋ฅผ ๋ถ์ํ๊ณ ๊ทธ ๊ฒฝ๋ก์์ REST API ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค(๋ณด๊ธฐ ๊ณ์ธต ๊ตฌ์ฑ์ด ํฌํจ๋ ์ ์์ - ํ์ฉ๋๋ ํ์)
์๊ฐ์ ์ป์ผ๋ ค๋ฉด http://getfrapi.com/ screencast๋ฅผ ํ์ธํ์ญ์์ค.
๋๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ๋ณด์๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๋ค์ ์คํ์์ ๋ง์ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ์ฐ์ , ๊ทธ๋ค์ REST๋ RESTful์ด ์๋๋๋ค :-D
"์๊ฐ"์ด๊ณ ๋๋ ๊ทธ๋ค์ ํด์์ด ์๋๋ผ ๊ทธ๋ค์ ๋ฌธ์(๋ฐ ํ ์คํธ) ์ธ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค. :)
๊ฐ์ธ์ ์ผ๋ก ๋ง์์ ๋ค์ง ์์ง๋ง WADL ํ์์ ๋ฌธ์ ์์ฑ์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๊น?
๋ฌธ์ ์ปจํธ๋กค๋ฌ/๋ทฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋ ๋ทฐ ๋์ฐ๋ฏธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ธ๋๋ณด๋ค ๋ ๋์ ๋ฐฉํฅ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ํ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ฆ, API ๋ฌธ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด FRAPI์ ์ฌ์ฉ ์ฌ๋ก(์ฑ์ ๋๋กญ)์ ์ ํฉํ์ง๋ง ์ด ๊ธฐ๋ฅ์ด "์๋ ๊ทธ๋๋ก" ํ์ํ์ง ๋๋ ์๋ฏธ๊ฐ ์๋์ง์ ๋ํ ์ง๋ฌธ์ ๋๋ค.
๊ณ ๊ฐ์ ์ํ ๋ฌธ์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น?
์ด๊ฒ์ด REST๊ฐ ํผํ๋ ค๊ณ ํ๋ ๊ฒ์์ ๋ช ์ฌํ์ญ์์ค. :)
์ค๋๋ ธ: ๋ฌผ๋ก ์ด์ฃ . ๊ทธ๋ฌ๋ HATEAOS๋ฅผ ๋ฐ๋ฅด๋๋ผ๋ ํค๋๋ฅผ ๊ฒ์ฌํด์ผ ํ๋ค๋ ์ฌ์ค๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค. ๋ํ ๋ค๋ฅธ ์ํ ์ฝ๋๊ฐ ์์๋๋ ๊ฒ์ ์์์ผ ํ์ง๋ง ์ด๋ค ์ํ ์ฝ๋๊ฐ "๋ ๊ฐ๋ฅ์ฑ์ด ๋์"์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. API์ ์บ์ฃผ์ผํ ๊ฒํ ์ ์ข์ต๋๋ค.
๋ํ ๋ฌด์ํด์ผ ํ๋ ๋ ๋ค๋ฅธ ์ฃผ์ : ์ผ๋ถ ํด๋ผ์ด์ธํธ๋ ๋๋ฌด๋ฅผ ์ฃฝ์ด๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฉฐ ์ด ํ์ด์ง๋ฅผ ์ฑ์ฐ๋ ๋ฐ ๋ง์ ์๊ฐ์ ๋ญ๋นํ ํ์๊ฐ ์์ต๋๋ค. :)
๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํผํด์ผ ํ ์ ์ผํ ๊ฒ์ ์์ฑ๋ ๋ฌธ์์ ํฌ๊ฒ ์์กดํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด WSDL์ ๋ณต์ ํฉ๋๋ค.
๋๋ฌด๋ฅผ ์ฃฝ์ด๋ ์ฌ๋๋ค์ ์ํด ์์ง ์๊ฐ๋ฝ์ ์๋๋ก ๋ด๋ฆฌ์ญ์์ค :)
๋ด๊ฐ ์๋ ํ, ์ง์ ํ REST API ๋ฌธ์๋ URL์ด ์๋๋ผ ๋ฏธ๋์ด ์ ํ๊ณผ ๊ทธ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ์: http://kenai.com/projects/suncloudapis/pages/Home , http://amundsen.com/media-types/collection/
๊ทธ๋ฌ๋ ์น ํ๋ก์ ํธ์ 80%์ ํด๋นํ๋ ๊ฐ๋จํ HTTP API์ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ด ์ฌ์ ํ ์ ์ฉํ ๊ฒ์ ๋๋ค.
๋ค vladar, URI ํ ํ๋ฆฟ์ ๋ถ๋ช ํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ REST ๋ฒ๋ค์ ๊ฐ๋ฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ์์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
URI ํ ํ๋ฆฟ์ ApiBundle์ ์ ํฉํฉ๋๋ค.
http://swagger.wordnik.com/ ์์ ๊ฐ๋ ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
:+1: ์ค์จ๊ฑฐ๋ก. ์ด๊ฒ์ ๋ฉ์ง ๊ฒ ๊ฐ์ต๋๋ค!
์ ์ฌํ ๊ฒฝํ์ ๋ง๋ค๊ธฐ ์ํด ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
@apidoc
๋๋ ๊ธฐํ๋ก ํ์๋ ๊ตฌ๋ฌธ ๋ถ์ ๋ฐฉ๋ฒ@apidoc
ํ์๋ ๋ฉ์๋์ docblock์์ ๋ฉ์๋ ๋ฐ ๋งค๊ฐ๋ณ์์ ๋ํ ์ค๋ช
๊ฐ์ ธ์ค๊ธฐ๋์ฒด๋ก Swagger์ ๊ฐ์ ํ๋ฉด์ ๊ตฌํํ๋ ๊ฒ์ ๊ฝค ํ ์ ์๊ณ ์ด ๋ฒ๋ค์ ๋ํด ๋ง์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ต์ ์ ๋จ์ํ Swagger๊ฐ ์๋นํ์ง๋ง ์ฝ๊ฐ์ ๊ฐ์ค์น(Java)์ ํจ๊ป ์ ๊ณต๋๋ JSON์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ฐจ๋ผ๋ฆฌ "like" ๊ตฌํ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
ํธํ ๊ฐ๋ฅํ JSON์ ์์ฑํ๋ ๊ฒ์ด ์ฒซ ๋ฒ์งธ ์๊ฐ์ด์์ต๋๋ค. ๋๋ ์ฃผ๋ง์ ์กฐ๊ธ ๋ ๊น์ด ํ๊ณ ๋ค ๊ฒ์ ๋๋ค. ์๋ง๋ ๋น ๋ฅธ 'n ๋๋ฌ์ด ํ๋กํ ํ์ดํ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
@pminnieur ๋ ํตํฉ๋ณด๋ค๋ ๋์ผํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ ๊ณตํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ต์ํ https://github.com/FriendsOfSymfony/FOSJsRoutingBundle ์ฒ๋ผ ์๋ํ ์ ์์ต๋๋ค. ๋ฉ์ง HTML/CSS๋ฅผ ์ถ๊ฐํ๊ณ ์ผ์ข ์ API ๋ฌธ์๋ก RESTful ๊ฒฝ๋ก๋ฅผ ๋ ธ์ถํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ผ๋ถ ์ฃผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ผ๋ก ์์ํ๊ณ ์ถ์ง๋ง ์ฝ๋๋ฅผ ์ ์ฉ ๋ฒ๋ค(์: FOSRestAPIExplorerBundle)์ ๋ฃ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ ๋ Swagger API๋ง ์ง์ํด์ผ ํฉ๋๊น(๋ฐ๋ผ์ Swagger๋ JSON์ผ๋ก ์์ง ๋ฐ ๋ ธ์ถ๋๋ ์ ๋ณด๋ฅผ ์๊ฐํํ๋ ๋ฐ ์ฌ์ฉ๋จ) ์๋๋ฉด ์์ฒด ์น ์ธํฐํ์ด์ค๋ ์ ๊ณตํด์ผ ํฉ๋๊น?
๋ณ๋์ ๋ฒ๋ค์ ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ swagger๋ฅผ ์ง์ํ๋ค๋ฉด ๋ฒ๋ค ์ด๋ฆ์์ ๊ทธ๋ ๊ฒ ๋งํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒ์ ์ง์ํ๊ณ ์ถ์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ ๋๊ธฐ์ ์ค์จ๊ฑฐ์ ์ง์ ๋ฌ๋ ค ์์ต๋๋ค. swagger์ ๋ํ ํ ๊ฐ์ง ์ง๋ฌธ: ์ธ๋ถ ์๋น์ค์ ๋ ธ์ถํ๊ณ ์ถ์ง ์์ ๋ด๋ถ API์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
๊ณต๊ฐํ์ง ์์ผ๋ ค๋ฉด Swagger JSON์ ๋ฐํํ๋ URL์ ๊ณต๊ฐํ์ง ์์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค ... :D ์ง์ฌ์ผ๋ก, ์ฃผ์์ ์ฌ์ฉํ๊ณ ๊ฒฝ๋ก๋ฅผ ์ํ์ง ์๋ ๊ฒฝ์ฐ public์ ๊ฒฝ์ฐ @Expose()
์ฃผ์์ ์ถ๊ฐํ๊ฑฐ๋ @Expose(false)
๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค. -- ์ด์ ๊ฐ์ ๊ฒ์
๋๋ค. FOSJsRoutingBundle๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ ๋
ธ์ถํ๊ฑฐ๋ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ๋
ธ์ถ). "์ฌ๊ธฐ์ ๊ณต๊ฐ API์ ๋ํ ๋งํฌ๊ฐ ์์ผ๋ฉฐ ์ด ๋งํฌ๋ ๊ทํ๋ง์ ์ํ ๊ฒ์
๋๋ค"๋ผ๋ ์๋ฏธ์ธ ๊ฒฝ์ฐ ๋ณด์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํ์ฌ @Api("public")
๋ฐ @Api("private")
$์ ๊ฐ์ ์ฃผ์์ ์ถ๊ฐํ์ฌ ๋ค๋ฅธ API๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋ฌธ์๋ฅผ ์ ๊ณตํ๊ณ ๊ทธ๋ค์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ์ดํฉ๋๋ค.
์ด๋ฆ์ ๊ฒฝ์ฐ: ์ผ๋ฐ ์ด๋ฆ์ ๊ฐ๊ณ ์ถ์ต๋๋ค. Swagger๋ ์ง์๋๋ ์ฒซ ๋ฒ์งธ API ๋ฌธ์ ์๋น์ค๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ๊ทธ๋ฅ ํ ์ ์์ต๋๋ค(์ฒ์๋ถํฐ ์์ํด์๋ ์ ๋จ). ์๋ฅผ ๋ค์ด @odino ๋ WADL ์ง์์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ต์ํ ์น ์ธํฐํ์ด์ค๋ ์ ๊ณตํ๊ณ ์ถ์ต๋๋ค.
์์ํ๊ธฐ ์ ์ ์์ด๋์ด์ ๋ฌธ์ ๋ฅผ ์์งํ๊ธฐ ์ํด ์ง๊ธ๊น์ง GitHub ์ ์ฅ์๋ฅผ ๋ง๋ค์์ต๋๋ค. ํ ๋ก ํ ์ง๋ฌธ์ด๋ ์ฃผ์ ์ ๋ํ ๋ฌธ์ ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ญ์์ค(์ด๋ฆ ์ง์ ๋ ๋ ผ์ํ ์ ์์) ;-)
๊ทธ๋ ์ข์. ์ผ๋จ ์ํฉ์ด ํ์ฑ๋๋ฉด .. FOS๋ก ์ด๋ํ ์ ์์ต๋๋ค.
https://github.com/wordnik/swagger-ui ๋ฅผ "๋์คํ๋ ์ด"๋ก ํ์ฉํ ๊ณํ์ ๋๊น?
์ฐ์ , ๊ทธ๋ ์ต๋๋ค. swagger-ui์์ ์ฌ์ฉํ swagger-spec ์ค์ json๋ง ์์ฑํฉ๋๋ค.
https://github.com/nelmio/NelmioApiDocBundle ์ ์ฐฌ์ฑํ์ฌ ๋ง๊ฐ
๋๋ ์ด๊ฒ์ด ๋งค์ฐ ์ค๋๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ ์ดํ๋ก ๋ช ๊ฐ์ง ์ฌํญ์ด ๋ณ๊ฒฝ๋์์ผ๋ฉฐ Swagger / Openapi์ฉ ํจํค์ง/๋ฒ๋ค์ ์ฐพ๋ ๋์ ๋น๊ต์ ๋นจ๋ฆฌ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๊ฒ์ ์ฌ๊ณ ํ ๊ธฐํ๊ฐ ์์ต๋๊น? NelmioApiDocBundle์ด ๋ฒ๋ ค์ง๊ณ Symfony for Swagger/OpenApi(๋๋ ๋ค๋ฅธ ๋ชจ๋ RAML, ...?)์ ํตํฉ๋๋ ์ค์ ๋์์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์ด ๋งค์ฐ ์ค๋๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๊ทธ ์ดํ๋ก ๋ช ๊ฐ์ง ์ฌํญ์ด ๋ณ๊ฒฝ๋์์ผ๋ฉฐ Swagger / Openapi์ฉ ํจํค์ง/๋ฒ๋ค์ ์ฐพ๋ ๋์ ๋น๊ต์ ๋นจ๋ฆฌ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๊ฒ์ ์ฌ๊ณ ํ ๊ธฐํ๊ฐ ์์ต๋๊น? NelmioApiDocBundle์ด ๋ฒ๋ ค์ง๊ณ Symfony for Swagger/OpenApi(๋๋ ๋ค๋ฅธ ๋ชจ๋ RAML, ...?)์ ํตํฉ๋๋ ์ค์ ๋์์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.