REST API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•(How to Design a REST API)

2023. 2. 26. 20:13ยทIT/RESTful

REST๋ฅผ ์กฐ๊ฐ์œผ๋กœ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ ํ•œ ๊ฐ€์ง€์ด์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐœ๋…์„ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋˜ ๋‹ค๋ฅธ ๊ณผ์ œ์ž…๋‹ˆ๋‹ค.

์ด ์ž์Šต์„œ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„์œ„ํ•œ REST API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด ์ „์ฒด ์—ฐ์Šต์—์„œ ์–ป์€ ์š”์ ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋””์ž์ธ ํ”„๋กœ์„ธ์Šค์—์„œ REST ์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1. Identify the Resources – Object Modeling

REST API ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋””์ž์ธํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ๋ฆฌ์†Œ์Šค๋กœ ํ‘œ์‹œ๋  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๊ฐœ์ฒด ๋ชจ๋ธ๋ง์ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์žฅ์น˜, ๊ด€๋ฆฌ๋˜๋Š” ์—”ํ„ฐํ‹ฐ, ๋ผ์šฐํ„ฐ, ๋ชจ๋Ž€ ๋“ฑ๊ณผ ๊ฐ™์€ ๋งŽ์€ ํ•ญ๋ชฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฆฌ์†Œ์Šค ๋งŒ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Devices
  • Configurations

์—ฌ๊ธฐ์„œ ๊ตฌ์„ฑ์€ ์žฅ์น˜์˜ ํ•˜์œ„ ์ž์›์ผ ์ˆ˜ ์žˆ๋‹ค. ์žฅ์น˜์—๋Š” ๋งŽ์€ ๊ตฌ์„ฑ ์˜ต์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ๋ชจ๋ธ์˜ ๋‘ ๊ฐœ์ฒด/๋ฆฌ์†Œ์Šค์—๋Š” integer id ์†์„ฑ์ธ ๊ณ ์œ  ์‹๋ณ„์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Create Model URIs

์ด์ œ ๊ฐœ์ฒด ๋ชจ๋ธ์ด ์ค€๋น„๋˜๋ฉด ๋ฆฌ์†Œ์Šค URI๋ฅผ ๊ฒฐ์ •ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ฆฌ์†Œ์Šค URI๋ฅผ ๋””์ž์ธํ•˜๋Š” ๋™์•ˆ ๋ฆฌ์†Œ์Šค์™€ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ๊ด€๊ณ„์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค URI๋Š” API์˜ ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์žฅ์น˜๋Š” ์ตœ์ƒ์œ„ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌ์„ฑ์€ ์žฅ์น˜ ์•„๋ž˜์˜ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. URI๋ฅผ ์ ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

/devices
/devices/{id}

/configurations
/configurations/{id}

/devices/{id}/configurations
/devices/{id}/configurations/{configId}

์ด๋Ÿฌํ•œ URI๋Š” ๋™์‚ฌ๋‚˜ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. URI์— ๋™์‚ฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. URI๋Š” ๋ชจ๋‘ ๋ช…์‚ฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. Determine Resource Representations

์ด์ œ ๋ฆฌ์†Œ์Šค URI๊ฐ€ ๊ฒฐ์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ํ‘œํ˜„์— ๋Œ€ํ•ด ์ž‘์—…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ‘œํ˜„์€ XML ๋˜๋Š” JSON ํ˜•์‹์œผ๋กœ ์ •์˜ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ๋ณด๋‹ค ์ž˜ ํ‘œํ˜„ํ•˜๋Š” XML ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

3.1. Collection Resource of Devices

์ปฌ๋ ‰์…˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‘๋‹ต ํŽ˜์ด๋กœ๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ฒŒ ์œ ์ง€๋˜๋ฏ€๋กœ API์˜ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

<devices size="2">

	<link rel="self" href="/devices"/>

	<device id="12345">
		<link rel="self" href="/devices/12345"/>
		<deviceFamily>apple-es</deviceFamily>
		<OSVersion>10.3R2.11</OSVersion>
		<platform>SRX100B</platform>
		<serialNumber>32423457</serialNumber>
		<connectionStatus>up</connectionStatus>
		<ipAddr>192.168.21.9</ipAddr>
		<name>apple-srx_200</name>
		<status>active</status>
	</device>

	<device id="556677">
		<link rel="self" href="/devices/556677"/>
		<deviceFamily>apple-es</deviceFamily>
		<OSVersion>10.3R2.11</OSVersion>
		<platform>SRX100B</platform>
		<serialNumber>6453534</serialNumber>
		<connectionStatus>up</connectionStatus>
		<ipAddr>192.168.20.23</ipAddr>
		<name>apple-srx_200</name>
		<status>active</status>
	</device>

</devices>

3.2. Single Device Resource

์ปฌ๋ ‰์…˜ URI์™€ ๋ฐ˜๋Œ€๋กœ ๋‹จ์ผ ๋ฆฌ์†Œ์Šค URI์—๋Š” ํŠน์ • ์žฅ์น˜์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ๋ฐ ๊ธฐํƒ€ ์ง€์›๋˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ๋งํฌ ๋ชฉ๋ก๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด REST API HATEAOS๊ฐ€ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.

<device id="12345">
	<link rel="self" href="/devices/12345"/>

	<id>12345</id>
	<deviceFamily>apple-es</deviceFamily>
	<OSVersion>10.0R2.10</OSVersion>
	<platform>SRX100-LM</platform>
	<serialNumber>32423457</serialNumber>
	<name>apple-srx_100_lehar</name>
	<hostName>apple-srx_100_lehar</hostName>
	<ipAddr>192.168.21.9</ipAddr>
	<status>active</status>

	<configurations size="2">
		<link rel="self" href="/configurations" />

		<configuration id="42342">
			<link rel="self" href="/configurations/42342" />
		</configuration>

		<configuration id="675675">
			<link rel="self" href="/configurations/675675" />
		</configuration>
	</configurations>

	<method href="/devices/12345/exec-rpc" rel="rpc"/>
	<method href="/devices/12345/synch-config"rel="synch device configuration"/>
</device>

3.3. Collection Resource of Configurations

์žฅ์น˜ ์ปฌ๋ ‰์…˜ ํ‘œํ˜„๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ์œผ๋กœ ๊ตฌ์„ฑ ์ปฌ๋ ‰์…˜ ํ‘œํ˜„์„ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

<configurations size="20">
	<link rel="self" href="/configurations" />

	<configuration id="42342">
		<link rel="self" href="/configurations/42342" />
	</configuration>

	<configuration id="675675">
		<link rel="self" href="/configurations/675675" />
	</configuration>
	…
	…
</configurations>

์žฅ์น˜ ๋‚ด๋ถ€์˜ ๊ตฌ์„ฑ ์ปฌ๋ ‰์…˜ ํ‘œํ˜„์€ ์ตœ์ƒ์œ„ ๊ตฌ์„ฑ URI์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์žฅ์น˜์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์ด ๋‘ ๊ฐœ๋ฟ์ด๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ ๊ตฌ์„ฑ ํ•ญ๋ชฉ๋งŒ ์žฅ์น˜ ์•„๋ž˜์— ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋กœ ๋‚˜์—ด๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3.4. Single Configuration Resource

์ด์ œ ๋‹จ์ผ ๊ตฌ์„ฑ ์ž์› ํ‘œํ˜„์—๋Š” ๊ด€๋ จ ๋งํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด ์ž์›์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<configuration id="42342">
	<link rel="self" href="/configurations/42342" />
	<content><![CDATA[…]]></content>
	<status>active</status>
	<link rel="very big raw configuration script" href="/configurations/42342/raw" />
</configuration>

3.5. Collection Resource of Configuration under a Single Device

์ด ๊ตฌ์„ฑ ํ•˜์œ„ ์ปฌ๋ ‰์…˜์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์ปฌ๋ ‰์…˜์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด๋ฉฐ ์žฅ์น˜์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด๋ฏ€๋กœ ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜ ๊ณผ ๋‹ค๋ฅธ ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ํ•„๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜๊ณผ ๋™์ผํ•œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<configurations size="2">
	<link rel="self" href="/devices/12345/configurations" />

	<configuration id="53324">
		<link rel="self" href="/devices/12345/configurations/53324" />
		<link rel="detail" href="/configurations/53324" />
	</configuration>

	<configuration id="333443">
		<link rel="self" href="/devices/12345/configurations/333443" />
		<link rel="detail" href="/configurations/333443" />
	</configuration>
</configurations>

์ด ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์ปฌ๋ ‰์…˜์—๋Š” ๋‘ ๊ฐœ์˜ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ•˜์œ„ ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์˜ ์ง์ ‘ ํ‘œํ˜„ (์˜ˆ : / devices/12345 / configurations / 333443์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜์˜ ์œ„์น˜ (์˜ˆ : / configurations / 333443)๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.

๋ณด๋‹ค ๊ณ ์œ ํ•œ ๋ฐฉ์‹์œผ๋กœ ์žฅ์น˜๋ณ„ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณด์กฐ ์ปฌ๋ ‰์…˜์— ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ํ•„๋“œ(๋””์ž์ธ์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ)๋ฅผ ๋งˆ์Šคํ‚นํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‘ ๊ฐœ์˜ ๋งํฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3.6. Single Configuration Resource under a Single Device

์ด ํ‘œํ˜„์€ ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜์˜ Configuration ํ‘œํ˜„๊ณผ ์ •ํ™•ํžˆ ์œ ์‚ฌํ•œ ํ‘œํ˜„์„ ๊ฐ€์ ธ์•ผํ•˜๊ฑฐ๋‚˜ ๋ช‡ ๊ฐœ์˜ ํ•„๋“œ๋ฅผ ๋งˆ์Šคํ‚น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•˜์œ„ ์ž์› ํ‘œํ˜„์—๋Š” ๊ธฐ๋ณธ ํ‘œ์‹œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋งํฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

<configuration id="11223344">
	<link rel="self" href="/devices/12345/configurations/11223344" />
	<link rel="detail" href="/configurations/11223344" />
	<content><![CDATA[…]]></content>
	<status>active</status>
	<link rel="raw configuration content" href="/configurations/11223344/raw" />
</configuration>

์ด์ œ ๋‹ค์Œ ์„น์…˜์œผ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ๋†“์น˜์ง€ ์•Š๋„๋ก ๋ช‡ ๊ฐ€์ง€ ๊ด€์ฐฐ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ์†Œ์Šค URI๋Š” ๋ชจ๋‘ ๋ช…์‚ฌ์ž…๋‹ˆ๋‹ค.
  • URI๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค ๋ชจ์Œ๊ณผ ๋‹จ์ผ ๋ฆฌ์†Œ์Šค์˜ ๋‘ ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์ง‘์€ 1์ฐจ ์ˆ˜์ง‘๊ณผ 2์ฐจ ์ˆ˜์ง‘์˜ ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ณด์กฐ ์ปฌ๋ ‰์…˜์€ ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜์˜ ํ•˜์œ„ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ๋ฆฌ์†Œ์Šค / ์ปฌ๋ ‰์…˜์—๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๋งํฌ, ์ฆ‰ ์ž์ฒด์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปฌ๋ ‰์…˜์—๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ „์ฒด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ํŠน์ • ๋ฆฌ์†Œ์Šค URI์—๋งŒ ์•ก์„ธ์Šคํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํ‘œํ˜„์—๋Š” ์ถ”๊ฐ€ ๋งํฌ (์ฆ‰, ๋‹จ์ผ ์žฅ์น˜์˜ ๋ฉ”์„œ๋“œ)๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฉ”์„œ๋“œ๋Š” POST ๋ฉ”์„œ๋“œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์†์„ฑ์„ ๊ฐ–๊ฑฐ๋‚˜ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ๋งํฌ๋ฅผ ํ˜•์„ฑ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์•„์ง ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

4. Assigning HTTP Methods

๋”ฐ๋ผ์„œ ๋ฆฌ์†Œ์Šค URI์™€ ํ•ด๋‹น ํ‘œํ˜„์ด ์ด์ œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ž‘์—…์„ ๊ฒฐ์ •ํ•˜๊ณ  ํ•ด๋‹น ์ž‘์—…์„ ๋ฆฌ์†Œ์Šค URI์— ๋งคํ•‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ์ž๋Š” ๋„คํŠธ์›Œํฌ์—์„œ ์žฅ์น˜๋ฅผ ์ฐพ์•„๋ณด๊ธฐ, ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‚ญ์ œํ•˜๊ณ  ์žฅ์น˜ ๊ตฌ์„ฑ์„ ์ƒ์„ฑ/๋ฐฐํฌ/์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๊ฐ ๋ฆฌ์†Œ์Šค์— ํ• ๋‹นํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

4.1. Browse all devices or configurations [Primary Collection]

HTTP GET /devices
HTTP GET /configurations

์ปฌ๋ ‰์…˜ ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ ํŽ˜์ด์ง• ๋ฐ ํ•„ํ„ฐ๋ง์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์š”์ฒญ์€ ์ปฌ๋ ‰์…˜์—์„œ ์ฒ˜์Œ 20๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

HTTP GET /devices?startIndex=0&size=20
HTTP GET /configurations?startIndex=0&size=20

4.2. Browse all configurations under a device [Secondary Collection]

HTTP GET /devices/{id}/configurations

๋Œ€๋ถ€๋ถ„ ์ž‘์€ ํฌ๊ธฐ์˜ ์ปฌ๋ ‰์…˜์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ํ•„ํ„ฐ๋ง ๋˜๋Š” ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

4.3. Browse a single device or configuration

์žฅ์น˜ ๋˜๋Š” ๊ตฌ์„ฑ์˜ ์ „์ฒด ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹จ์ผ ๋ฆฌ์†Œ์Šค URI์— ๋Œ€ํ•ด GET ์ž‘์—…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

HTTP GET /devices/{id}
HTTP GET /configurations/{id}

4.4. Browse a single configuration under a device

HTTP GET /devices/{id}/configurations/{configId}

ํ•˜์œ„ ์ž์› ํ‘œํ˜„์€ ๊ธฐ๋ณธ ํ‘œ์‹œ์™€ ๋™์ผํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ํ‘œ์‹œ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

4.5. Create a device or configuration

'CREATE'๋Š” ๋ฉฑ๋“ฑ์› ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๋ฉฐ 'HTTP ํ”„๋กœํ† ์ฝœ'์—์„œ 'POST'๋„ ๋ฉฑ๋“ฑ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 'POST'๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

HTTP POST /devices
HTTP POST /configurations

์š”์ฒญ ํŽ˜์ด๋กœ๋“œ์—๋Š” id ์†์„ฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„œ๋ฒ„๊ฐ€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. CREATE ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

HTTP/1.1 201 Created
Content-Type: application/xml
Location: http://example.com/network-app/configurations/678678

<configuration id="678678">
	<link rel="self" href="/configurations/678678" />
	<content><![CDATA[…]]></content>
	<status>active</status>
	<link rel="raw configuration content" href="/configurations/678678/raw" />
</configuration>

4.6. Update a device or configuration

์—…๋ฐ์ดํŠธ ์ž‘์—…์€ ๋ฉฑ๋“ฑ์› ์ž‘์—…์ด๋ฉฐ HTTP PUT๋„ ๋ฉฑ๋“ฑ์ˆ˜ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—…๋ฐ์ดํŠธ ์ž‘์—…์— PUT ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP PUT /devices/{id}
HTTP PUT /configurations/{id}

PUT ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTTP/1.1 200 OK
Content-Type: application/xml

<configuration id="678678">
	<link rel="self" href="/configurations/678678" />
	<content><![CDATA[. updated content here .]]></content>
	<status>active</status>
	<link rel="raw configuration content" href="/configurations/678678/raw" />
</configuration>

4.7. Remove a device or configuration

์ œ๊ฑฐ๋Š” ํ•ญ์ƒ DELETE ์ž‘์—…์ž…๋‹ˆ๋‹ค.

HTTP DELETE /devices/{id}
HTTP DELETE /configurations/{id}

์„ฑ๊ณต์ ์ธ ์‘๋‹ต์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋ฅผ ์œ„ํ•ด ํ์— ๋Œ€๊ธฐ๋œ ๊ฒฝ์šฐ(๋น„๋™๊ธฐ ์ž‘์—…) 202(์ˆ˜๋ฝ๋จ) ๋˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ(๋™๊ธฐํ™” ์ž‘์—…) 200(OK) / 204(์ฝ˜ํ…์ธ  ์—†์Œ)์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(SHOULD).

๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฝ์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์„ฑ๊ณต/์‹คํŒจ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ID๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‹œ์Šคํ…œ์—์„œ ์‚ญ์ œ๋  ๋•Œ์˜ ๋™์ž‘์„ ๊ฒฐ์ •ํ•  ๋•Œ ์ถฉ๋ถ„ํ•œ ๋ถ„์„์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์š”์ฒญ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ผ์‹œ ์‚ญ์ œํ•˜์—ฌ INACTIVE ์ƒํƒœ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ฅด๋ฉด ๋‹ค๋ฅธ ์œ„์น˜์—์„œ๋„ ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ์ฐพ์•„ ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

4.8. Applying or Removing a configuration on/from a device

์‹ค์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์žฅ์น˜์— ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜์ด ์•„๋‹Œ ์žฅ์น˜์—์„œ ๊ตฌ์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ PUT ๋ฐ DELETE ๋ฉ”์„œ๋“œ๋Š” ๋ฉฑ๋“ฑ์ˆ˜ ํŠน์„ฑ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

//Apply Configuration on a device
HTTP PUT /devices/{id}/configurations

//Remove Configuration on a device
HTTP DELETE /devices/{id}/configurations/{configId}

5. More Actions

์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฐœ์ฒด ๋ชจ๋ธ๊ณผ URI๋งŒ ๋””์ž์ธํ•œ ๋‹ค์Œ HTTP ๋ฉ”์„œ๋“œ ๋˜๋Š” ์ด์— ๋Œ€ํ•œ ์ž‘์—…์„ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์—์„œ๋„ ์ž‘์—…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

1) Logging
2) Security
3) Discovery etc.

์ด ์˜ˆ์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

728x90
'IT/RESTful' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • REST API URI ๋””์ž์ธ์— ๋Œ€ํ•œ 7๊ฐ€์ง€ ๊ทœ์น™
  • REST๋ž€?(What is REST)
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, IT ๋ธ”๋กœ๊ทธ๐Ÿงž
  • ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
    ์š”์ˆ  ๋žจํ”„๐Ÿซ–
    ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (549)
      • Languages (57)
        • JAVA (13)
        • JSP (1)
        • C_C++ (4)
        • Html (3)
        • CSS (1)
        • JavaScript (18)
        • Python (3)
        • Kotlin (13)
        • TypeScript (1)
      • Framework (14)
        • spring (11)
        • jstl (1)
        • angular (2)
      • Tool (28)
        • Eclipse (5)
        • vsCode (3)
        • scrcpy (2)
        • Git (1)
        • IntelliJ (6)
        • Visual-studio (1)
        • UML (1)
        • Gradle (8)
      • DB (6)
        • Oracle (1)
        • MySql (3)
        • Mongo (2)
      • OS (14)
        • Linux (2)
        • Windows (12)
      • Server (8)
        • Tomcat (1)
        • Apache (1)
        • Node.js (6)
      • Programmings (25)
        • Design Pattern (2)
        • Funny (20)
        • Algorithms (3)
      • Cloud (8)
        • Docker (1)
        • Kubernetes (4)
        • Istio (1)
        • ArgoCD (2)
      • IT (5)
        • gRPC (3)
        • RESTful (3)
        • Web UI (5)
        • AI (4)
      • Book (6)
      • TIP (187)
      • Life (53)
      • Game (83)
      • Storage (22)
      • ์‹๋‹น (15)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ์‚ฌ์ดํŠธ๋งต
    • RSS
    • ๊ธฐํƒ€ ์†Œ๋“
  • ๋งํฌ

    • ๊ตฌ๊ธ€
    • ๋„ค์ด๋ฒ„
    • ์ •๋ถ€24
    • Spring Framework ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • Kotlin ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • ์นด์นด์˜ค ์• ๋“œํ•
    • ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋งต
    • ๋ธ”๋กœ๊ทธ RSS
  • ๊ณต์ง€์‚ฌํ•ญ

    • ์•ˆ๋…•ํ•˜์„ธ์š”
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฐ์ผ๋ฆฌ ๋‰ด์Šค
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ๋‚˜์šฐ
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ์™€์ผ์ฆˆ
    ๋ธŒ๋ฆฌํ•‘
    ๋‰ด์Šค
    ํƒœ๊ตญ
    ํ€˜์ŠคํŠธ
    ํ•œ๋ˆˆ์— ๋ณด๋Š” ์˜ค๋Š˜์˜ ๋‰ด์Šค
    ์˜ค๋Š˜์˜๋‰ด์Šค
    ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
REST API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•(How to Design a REST API)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”