[Spring boot] Spring Data Rest๋ฅผ ์ด์šฉํ•œ REST API ๊ฐœ๋ฐœ 2

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ Spring Data Rest๋ฅผ ์ด์šฉํ•ด Domain๊ณผ Repository Interface๋งŒ์„ ๊ตฌํ˜„ํ•˜์—ฌ HATEOAS์— ์ค€์ˆ˜ํ•œ REST API ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ REST API๋ฅผ ์„ค๊ณ„ํ•˜๋‹ค๋ณด๋ฉด, HATEOAS์˜ ๊ตฌ์กฐ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ ํด๋ž˜์Šค์˜ ์ •๋ณด๊ฐ€ ๋‚˜์˜จ๋‹ค๊ฑฐ๋‚˜, ์ด ์™ธ์˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๊ฑฐ๋‚˜, ๋งŒ์•ฝ User ์ •๋ณด๋ฅผ ๊ฐ€์ ธ๋‹ค ์ค€๋‹ค๋ฉด, ํŒจ์Šค์›Œ๋“œ ์ •๋ณด์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ˆจ๊ฒจ์•ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Spring Data Rest์— Controller + Service ์กฐํ•ฉ์„ ๋„ฃ์–ด์„œ ๋‚˜๋งŒ์˜ REST API๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

RepositroyRestController

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ด์–ด์„œ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๊ธฐ์— controller ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, ItemController ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Repository์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ @RepositroyRestResource๋ฅผ ์ง€์šฐ๊ณ , Controller์—์„œ @RepositoryRestController๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, HATEOAS ํ˜•ํƒœ๊ฐ€ ๊ฐ–์ถฐ์ง„ ์‘๋‹ต ํ˜•ํƒœ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ–์ถฐ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์—์„œ๋Š” @RestController ์ฒ˜๋Ÿผ @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์ด ์‚ฝ์ž…๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ž˜์Šค ์œ„์ชฝ์ด๋‚˜ ๋ฉ”์†Œ๋“œ ์œ„์ชฝ์— @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋”, ์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด, @RepositoryRestController๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋งคํ•‘ํ•˜๋Š” URI ํ˜•์‹์ด Spring boot data rest์—์„œ ์ •์˜ํ•˜๋Š” REST API ํ˜•์‹์— ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ๊ธ€์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2020/05/19 - [Programming/Spring] - [Spring boot] REST API์˜ ๊ธฐ์ดˆ์™€ ์„ค๊ณ„

 

[Spring boot] REST API์˜ ๊ธฐ์ดˆ์™€ ์„ค๊ณ„

Spring boot๊ฐ€ ๊ธฐ์กด์˜ Spring์— ๋น„ํ•ด ๋‹ค์–‘ํ•œ ์„ค์ •๋“ค์„ ์ž๋™ํ™” ์‹œ์ผœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ์ค„์ด๊ณ , ์ž„๋ฒ ๋””๋“œ ํ†ฐ์บฃ์„ ํƒ‘์žฌํ•˜์—ฌ ๋” ์‰ฌ์šด ๊ฐœ๋ฐœ๋“ค์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—๏ฟฝ

blog.neonkid.xyz

๊ธฐ์กด์— @RepositoryRestResource๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ œ๊ณตํ–ˆ๋˜ URI ํ˜•์‹๊ณผ ๊ฐ™๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•ด๋‹น Controller์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ธฐ์กด์˜ ๊ธฐ๋ณธ API๋ฅผ Overriding ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ์ผ๋ถ€ ๋ฉ”์†Œ๋“œ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Controller์—์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

PageMetadata ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜์™€ ํ˜„์žฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ, ์ด ์ƒํ’ˆ ์ˆ˜ ๋“œ์˜ ํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ , PagedModel์„ ์ด์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜ ํŽ˜์ด์ง€์˜ ๋ฆฌ์†Œ์Šค ์ •๋ณด๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„์š”ํ•œ ๋งํฌ๋ฅผ linkTo ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์ฒญํ•œ ๊ฐ๊ฐ์˜ ์ƒํ’ˆ์˜ ๋งํฌ๋งŒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋„๋ก selfRel ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ, self URL์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ URL์€ ํ‘œ์‹œ๊ฐ€ ์•ˆ๋˜์„œ ์ข€ ๋” ๊น”๋”ํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ . ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์›ํ•˜๋Š” Result ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ์‘๋‹ต๊ฐ’์„ ์ •ํ•  ๋•Œ๋Š” Controller๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ, REST API URI ํ˜•์‹์— ๋งž์ถ”๋ฉด ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” Data Rest์—์„œ Overriding ๋˜์–ด, ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

JsonIgnore

์ƒํ’ˆ ๋ชจ๋ธ๋ง๊ณ , ๋‹ค๋ฅธ ๋ชจ๋ธ์— ๋Œ€ํ•ด์„œ๋„ ํ•œ ๋ฒˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ƒํ’ˆ ๋ชจ๋ธ์„ ๋งŒ๋“ค์—ˆ๊ณ , ์ƒํ’ˆ์„ ๊ตฌ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋ชจ๋ธ์„ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

User Entity๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. User๋งˆ๋‹ค PK๋ฅผ ์ฃผ๊ณ , Unique ์†์„ฑ์„ ๋„ฃ์–ด, ID์˜ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•, ํ˜น์€ User ID๋ฅผ PK๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ด ์žˆ๋Š”๋ฐ์š”. ์—ฌ๊ธฐ์„œ๋Š” User๋งˆ๋‹ค PK๋ฅผ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ Entity๋ฅผ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Controller์™€ Repository๋Š” Item ํด๋ž˜์Šค์™€ ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ curl -X POST -H "Content-Type: application/json" --data '{ "userid": "neonkid", "password": "1234" }' http://localhost:8080/api/users | json_pp

POST ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ํ•œ ๊ฐœ๋ฅผ ๋“ฑ๋กํ•˜๊ฒŒ ๋˜๋ฉด, Item API์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ’์ด ๋ชจ๋ธ ํ˜•ํƒœ์˜ JSON์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ, GET ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ, ํŒจ์Šค์›Œ๋“œ๋„ ๊ฐ™์ด ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž์˜ ์‹๋ณ„์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๊ณ , ๊ทธ ์ด์™ธ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  DB์—์„œ ์ง์ ‘ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, REST API์˜ ๊ฒฝ์šฐ, ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ ์ง€์ ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ •๋ณด๋Š” ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ฃ ?

JsonIgnore์˜ ์‚ฌ์šฉ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์•„๊นŒ ๋งŒ๋“  User ๋„๋ฉ”์ธ ํด๋ ˆ์Šค์—์„œ Password ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— JsonIgnore๋งŒ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ Password ๋ถ€๋ถ„์€ ์ œ์™ธํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋˜์ ธ์ฃผ๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Event Binding

์‚ฌ์šฉ์ž์˜ ์ถ”๊ฐ€/์ˆ˜์ •์€ ํ•œ ์„œ๋น„์Šค์— ์žˆ์–ด, ์ค‘์š”ํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ณ ๊ฐ์ด ๋“ค์–ด์™”๋‹ค๋Š” ๊ฒƒ์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๊ณ ๊ฐ์˜ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋Š” ์ ์˜ ๊ธฐ๋ก์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹๊ฒ ์ฃ .

๊ทธ๋Ÿฌ๋‚˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์ด ๋งž์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์œผ๋กœ ์‹œ๊ฐ„์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ž‘์—…์„ ์„œ๋ฒ„์—์„œ ํ•ด์ค€๋‹ค๋ฉด, ์ข€ ๋” ์ •ํ™•ํ•˜๊ณ , ํ™•์‹คํ•˜๊ฒŒ ์ •๋ณด ๊ธฐ๋ก์œผ๋กœ ๋‚จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Spring boot data rest์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์„ ํ›„ํ‚นํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ, ์ด๋ฅผ ํ–‰์œ„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • BeforeCreateEvent
  • AfterCreateEvent
  • BeforeSaveEvent
  • AfterSaveEvent
  • BeforeDeleteEvent
  • AfterDeleteEvent
  • BeforeLinkSaveEvent
  • AfterLinkSaveEvent
  • BeforeLinkDeleteEvent
  • AfterLinkDeleteEvent

๊ฐ„๋‹จํžˆ ์„ค๋ช…์„ ๋“œ๋ฆฌ๋ฉด, Create๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ, Before์™€ After๋Š” ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „๊ณผ ํ›„๋กœ ๋ฐ”์ธ๋”ฉ ๋ฉ๋‹ˆ๋‹ค. Save๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ, Link์˜ ๊ฒฝ์šฐ ๊ด€๊ณ„(1:1, N:N)๋ฅผ ๊ฐ€์ง„ ๋งํฌ๋ฅผ ์ˆ˜์ •/์‚ญ์ œํ–ˆ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ํด๋ž˜์Šค๋ฅผ ํ•œ ๊ฐœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. ์ด ๋•Œ, ํด๋ž˜์Šค๋ฅผ ์ด๋ฆ„์€ ์–ด๋–ค Entity์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉํ• ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ๋ชจ๋ธ + EventHandler๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค. ์–ด์ฐจํ”ผ ๋ฉ”์†Œ๋“œ์— ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ตฌ๋ถ„์ง“๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅด๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์ „์— ์ด ์ฝ”๋“œ๋Š” ๋ฌด์—‡์„ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค. ๋ผ๊ณ  ํ‘œํ˜„ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

@RepositoryEventHandler๋Š” ๊ทธ์ € ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง๋งŒ ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋ฏ€๋กœ ํ•ด๋‹น Event Handler๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด Spring IoC์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์ค˜์•ผ๋งŒ ๋™์ž‘ํ•˜๋ฏ€๋กœ @Component, @Bean ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•ด์ฃผ๋„๋ก ํ•ฉ์‹œ๋‹ค.

์ด๋ ‡๊ฒŒ POST ๋ฉ”์†Œ๋“œ๋กœ ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ์‹œ๋„ํ•˜๋ฉด, ์œ„์™€ ๊ฐ™์ด EventHandler ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•œ๋Œ€๋กœ, Log๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋งˆ์น˜๋ฉฐ...

Spring Data Rest๋ฅผ ์ด์šฉํ•œ REST API๋Š” ๊ฐ€๋Šฅํ•œ REST API์˜ ํ‘œ์ค€ ์ค‘ URI ๋ถ€๋ถ„์„ ์ง€์ผœ์ฃผ๋ฉด์„œ, ์ด์— ๋Œ€ํ•œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ๊ฐ•์ œ์„ฑ์ด ๋ถ€์—ฌ๋˜์–ด ์žˆ์–ด, ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋ถˆํŽธํ•จ์„ ๋Š๋‚„ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด, ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ํฐ ๊ทœ๋ชจ์˜ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœ/์šด์˜ํ•  ๋•Œ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ข‹๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ๊ทธ๋ฆฌ ๋‚˜์˜์ง€ ์•Š์€ ์„ ํƒ์ผ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments