MicroService Architecture(MSA) ๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ฉฐ ๊ธฐ์กด์ Monolithic Architecture์ ๋ฌธ์ ์ ์ด ๋ถ๊ฐ๋๋ฉฐ ๋ง์ ๊ธฐ์ ๋ค์ด MSA๋ก์ ์ ํ์ ์๋ํจ.์ด ๊ณผ์ ์์ RESTful Web Service๋ฅผ ๋ง์ด ์ด์ฉํ๊ฒ ๋๋๋ฐ ์ด REST
๊ธฐ๊ธฐ์ ๊ธฐ๊ธฐ๊ฐ World Wide Web์ด๋ผ๋ ๊ฒ์ ๊ฑฐ์ณ ํต์ ํ๋ ๊ฒ์ปดํจํฐ ์์์ ๋์ํ๋ ์๋ฒ๊ฐ ๋คํธ์ํฌ์์ ์์ฒญ์ ๋ฐ๊ณ (listening), ์น ๋ฌธ์(HTML, JSON, XML, images, etc...)๋ฅผ ์ ๊ณตํ๊ณ ์น(HTTP, Internet, WWW)์ ํต
์คํ ๋ ์ผ๋ก ์ ํ๋ก๋์ ์์ค์ ์คํ๋ง์ ๊ธฐ๋ฐ์ผ๋ก ํ "๊ทธ๋ฅ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋๋(just run)" ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ค. ์คํ๋ง ํ๋ซํผ์ ๋ํ ์ฝ๊ฐ ๊ณ ์ ์ ์ธ ๊ด์ (๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ๋ํ)์ ๊ฐ์ ธ๊ฐ์ ์ต์ํ์ ์๊ณ ๋ก ์คํ์ํฌ ์ ์๋ค. ๋๋ถ๋ถ์ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ง
User์ Post ๊ฐ์ฒด๊ฐ ์์ผ๋ฉฐ, 1:n ๊ด๊ณ๋ฅผ ๊ฐ๋๋ค./users๋ฅผ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ก Path variable๊ณผ ์๋ก ๋ค๋ฅธ HTTP Method๋ฅผ ์ ์ฉํ์ฌ API์ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๋ค. ์ผ๊ด์ฑ ์๊ฒ ๋ณต์์ ๋ช ์ฌ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์์ ๊ฐ์ด ์์ฑํ๋ค.Group: ํ์ฌ๋ช ์ ๋ ฅArtifact: ํ๋ก์ ํธ๋ช ์ ๋ ฅ๋ณดํต ์ฌ์ฉ์๊ณ์ ๋ฐ .m2\\repository์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์์กด์ฑ๋ค์ด ์ ์ฅ๋๋ค.
์์ ๊ฐ์ด ๊ธฐ๋ณธ ํ์คํฌ๋ค์ด ์กด์ฌํ๋๋ฐ ์ฃผ๋ก ์ด์ฉํ๋ ๊ฒ์ build์ clean ๋ช ๋ น์ด์ผ ๊ฒ์ด๋ค.build: ํ์ฌ๊น์ง ์์ฑํ ์๋ฐ ํ์ผ์ ํด๋์ค ํ์ผ์ ํํ๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ , ๋ ๊ธฐํ ์์ ๋ค์ ํ๋ฉด์ build๋ผ๋ ๋๋ ํ ๋ฆฌ ๋ด๋ถ์ ๋ด ํ๋ก์ ํธ๋ฅผ ์คํ ๊ฐ๋ฅํ ํํ๋ก ๋ง๋ค์ด์ค
๋ณดํต RESTful API์์๋ ์์ ๋ณด์ด๋ GET, POST, PUT, PATCH, DELETE ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
์๋ก์ด ํด๋์ค ๋ฑ์ ์ถ๊ฐํ ๋, ์์ ๊ฐ์ด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ง๋ ๋ค์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ํํ ๋ฐฉ๋ฒ์ด๋ค.์๋ฌ์ ์ปค์๋ฅผ ๋๊ณ Alt + Enter ํค๋ฅผ ์ด์ฉํ์ฌ ์ถ๊ฐํด๋ณด์.์์ ๊ฐ์ ๋ค์ํ ๋ฉ๋ด๋ค์ด ์๋๋ฐ, ์ด๋ค ํํ์ ์๋ฐ ํด๋์ค๋ก ๋ง๋ค์ง์ ๋ํ ๋ณด๊ธฐ์ ํน์ ์์กด์ฑ์์ ์ฐพ
๊ธฐ์กด application.properties์๋ application.yml์์ ๋ก๊น ์ค์ ์ ์ด์ง ๋ณ๊ฒฝํด๋ณด์.์์ ๊ฐ์ด springframework์ ๋ํ ๋ก๊น ์ ์ ๋ถ debug ๋ ๋ฒจ๋ก ๋ณ๊ฒฝํด๋ณด์. ๋ก๊น ์๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฒ ๋ง๋ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ๋ ๋ฒจ์ด ์๋๋ฐALL &l
http://localhost:8080/books/: ์ฑ ์ ์ฒด ๋ชฉ๋ก์ ์์ฒญhttp://localhost:8080/books/1: id:1๋ฒ ์ฑ ์ ์์ฒญhttp://localhost:8080/books/123: id:123๋ฒ ์ฑ ์ ์์ฒญ@PathV
๊ฐ ํ์ฌ๋ ์ ๋ฌด์ ๋ฒ์๊ฐ ์๊ณ , ๊ทธ ๋ฒ์๋ฅผ ๋ณดํต ๋๋ฉ์ธ์ด๋ผ๊ณ ํ๋ค. ๋ณดํต ํน์ ํ ๋ถ์ผ์์ ์ฌ์ฉ๋๋ ์ ๋ฌด ์ง์์ ๋งํ๋ค.๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋น์ค๋ฅผ ํฉ์น UserDaoService๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.์ฐธ๊ณ ๋ก Optional์์ ๋ง์ผ ๊ฐ์ด ์์ ๋, ์ด๋ค ๋ฉ์๋์ ๊ฒฐ๊ณผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ผ
@RequestMapping์ผ๋ก /users๋ฅผ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ก ์ง์ ํด์ฃผ์๋ค.@PathVariable์์ int ์๋ฃํ์ผ๋ก id๋ฅผ ๋ฐ์ ์ ์๋ ๊ฑด ์ปจ๋ฒํฐ ๋๋ฌธ์ด๋ค.์ฐธ๊ณ ๋งํฌ@NumberFormat,NumberFormatAnnotationFormatterFactory ๋ฅผ ์ฐธ
@NoArgsConstructor๋ฅผ ์ถ๊ฐํด์ผ ์๋ฌ๊ฐ ๋์ง ์๋๋ค. ๊ทธ ์ด์ ๋ ๋ค๋ฅธ ํฌ์คํ ์ ์์ธํ ์ ๋ฆฌํ๊ฒ ๋ค.
๋ณดํต REST API๋ฅผ ๊ตฌ์ฑํ ๋, ๋ฒํ๋ ์ค์๊ฐ ์์ฒญ์ด ์ฑ๊ณตํ์ ๋ ๋จ์ HTTP ์๋ต์์ ์ํ ์ฝ๋๋ก 200 OK๋ง ๋ฐํํ๋ ๊ฒ์ด๋ค.200 OK๋ก ๋ฌผ๋ก ํด๋น ์์ฒญ์ด ์ฑ๊ณตํ์์ ์ ์๋ ์์ง๋ง, ์ ํํ ์ด๋ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์๋์ง ์๊ธฐ ์ด๋ ค์ธ ๋๊ฐ ์๋ค.2xx์ฝ๋์ ์ข ๋ฅ๋
์๋ฒ์ ์กด์ฌํ์ง ์๋ ๋ฆฌ์์ค์ ๋ํ ์์ฒญ์ด ์์ ๋๋ ์ฌ๋ฐ๋ฅธ ์ํ ์ฝ๋์ ํจ๊ป ์์ธ์์ ์๋ ค์ฃผ์ด์ผ ํ๋ค.์ด๋ ๋ด๋ ์์ธ ์ฒ๋ฆฌ์ ๋ํ ๋ถ๋ถ์ด ์๋ค. ๋จ์ํ null์ ๋ฐํํ๊ธฐ๋ง ํ๋ค.๊ทธ๋ฅ ์ ์์ ์ผ๋ก 200 OK๋ฅผ ๋ฐํํด๋ฒ๋ฆฐ๋ค. ์๋ฒ์ธก์์๋ ์๋ฌด๋ฐ ์๋ฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.n
์์ ๊ฐ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ ๋, WebRequest ๋ํ ๋ฐ์ ์ ์๋๋ฐ, ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ ๋ณด์ ๋ํ ๋ด์ฉ์ ๋ค์ ํ๋ฒ ์๋ต์ผ๋ก ๋๋ ค์ค ๋ ์ ์ฉํ๋ค.CommonControllerAdvice์ ResponseEntityExceptionHandler๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋น ์ธํฐํ
๊ธฐ์กด์ ์๋ findOne() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๋ง๋ค์ด๋ณด์๋ค.UserNotFoundException์ ์ฌ์ฉ์๋ฅผ ์ฐพ์ ๋๋ง ๋ฐ์ํ๋ Exception์ด๋ค. ์ฌ๋ฌ ํฌ์ธํธ์ ๋ชฐ์๋์ง ๋ง๊ณ ํ ๋ฉ์๋์ ๋ฃ์.๊ฐ์ฅ ๋ํ์ ์ธ ๋ฉ์๋๊ฐ findOne์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๋ฃ๋๊ฒ ์ข๋ค๊ณ