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

2023. 2. 26. 20:13ยทIT/RESTful
๋ชฉ์ฐจ
  1. 1. Identify the Resources โ€“ Object Modeling
  2. 2. Create Model URIs
  3. 3. Determine Resource Representations
  4. 3.1. Collection Resource of Devices
  5. 3.2. Single Device Resource
  6. 3.3. Collection Resource of Configurations
  7. 3.4. Single Configuration Resource
  8. 3.5. Collection Resource of Configuration under a Single Device
  9. 3.6. Single Configuration Resource under a Single Device
  10. 4. Assigning HTTP Methods
  11. 4.1. Browse all devices or configurations [Primary Collection]
  12. 4.2. Browse all configurations under a device [Secondary Collection]
  13. 4.3. Browse a single device or configuration
  14. 4.4. Browse a single configuration under a device
  15. 4.5. Create a device or configuration
  16. 4.6. Update a device or configuration
  17. 4.7. Remove a device or configuration
  18. 4.8. Applying or Removing a configuration on/from a device
  19. 5. More Actions

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
  1. 1. Identify the Resources โ€“ Object Modeling
  2. 2. Create Model URIs
  3. 3. Determine Resource Representations
  4. 3.1. Collection Resource of Devices
  5. 3.2. Single Device Resource
  6. 3.3. Collection Resource of Configurations
  7. 3.4. Single Configuration Resource
  8. 3.5. Collection Resource of Configuration under a Single Device
  9. 3.6. Single Configuration Resource under a Single Device
  10. 4. Assigning HTTP Methods
  11. 4.1. Browse all devices or configurations [Primary Collection]
  12. 4.2. Browse all configurations under a device [Secondary Collection]
  13. 4.3. Browse a single device or configuration
  14. 4.4. Browse a single configuration under a device
  15. 4.5. Create a device or configuration
  16. 4.6. Update a device or configuration
  17. 4.7. Remove a device or configuration
  18. 4.8. Applying or Removing a configuration on/from a device
  19. 5. More Actions
'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)

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ
์ƒ๋‹จ์œผ๋กœ

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

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.