๐ง ์ธ์ ํ
์คํธ ์์คํ
์ ์ธ์๋ฅผ ์ํด ๊ธฐ๋ฅ์ /๋น๊ธฐ๋ฅ์ ์๊ตฌ์ฌํญ์ ์ฌ์ฉ์๊ฐ ์ง์ ํ
์คํธํ์ฌ ๊ฐ๋ฐ์ด ์๋ฃ๋์์์ ์ฆ๋ช
ํ๋ ํ
์คํธ ์ธ์ ํ
์คํธ๋ ์์ ๊ฐ์ด ์์คํ
์ ์ธ์๋ฅผ ์ํด ์์ฑํ๋ ํ
์คํธ์
๋๋ค. ์ฆ ์ธ์ํ
์ค์ ๋ชฉ์ ์ ์ฌ์ฉ์๋ค์ด ์ํ๋ ์๋๋ฆฌ์ค๋๋ก ๊ธฐ๋ฅ์ด ์ ๋์ํ๋์ง๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ์ด๋ผ ํ ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ธ์ ํ
์คํธ๋ฅผ ์์ฑํ ๋, ๊ฐ๋
์ฑ์ ๋์ฌ ํ
์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ง RestAssured ์ฝ๋ ์จ๊ธฐ๊ธฐ ์ธ์ํ
์คํธ๋ ๊ทธ ๋ชฉ์ ์ ๋ฐ๋ผ ๊ฐ๋ฐ์๊ฐ ์๋ ์ฌ๋๋ค์ด ๋ณด๋๋ผ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ํ
์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ ๋ ๊ฐ๋ฐ๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ต๋ํ ๊ฐ์ถ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ด์ ์ ๋์ด ํ
์คํธ๋ฅผ ์์ฑํ์์ต๋๋ค. ์์ ์ฝ๋์ ํจ๊ป ์ดํด๋ณด..
๐๏ธ Spring/Web MVC
๐ง ์๋ก ์คํ๋ง์์๋ ์ธํฐ์
ํฐ๋ฅผ ํตํด, ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ)๋ฅผ ํธ์ถํ๊ธฐ ์ ๊ณผ ํ์ ์ถ๊ฐ์ ์ธ ์์
๋ค์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด ์ธ์ฆ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๋ฑ์ ์์
์ด ์์ ์ ์๊ฒ ๋ค์. ์ธํฐ์
ํฐ์ ๋ํด์๋ ๋ค์ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์. ์ด๋ฒ ๊ธ์์๋ ์ธํฐ์
ํฐ๊ฐ ์ค์ ๋ก ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ์ ์ค๋ช
์ ํธ์๋ฅผ ์ํด HandlerExecutionChain๋ถํฐ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ง HandlerExecutionChain HandlerExecutionChain์ ์์ ๊ฐ์ด ํธ๋ค๋ฌ์, ํด๋น ํธ๋ค๋ฌ์ ์ ์ฉ๋ ์ธํฐ์
ํฐ๋ค์ ๊ฐ์ง๊ณ ์๋ ํด๋์ค์
๋๋ค. (@Controller์ @RequestMapping์ผ๋ก ์ ์ํ ๋ฉ์๋๊ฐ ํ๋์ ํธ๋ค๋ฌ๊ฐ ๋ ์ ์์ต๋๋ค.) ์ฆ HandlerExecution..
๐ง ์๋ก ์คํ๋ง์์๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ ์์ธ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก @ExceptionHandler ์ @ControllerAdvice๋ฅผ ์ ๊ณตํด์ค๋๋ค. ์ด ๋์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์๋๋ผ ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง์ ๋ํด์ ๋ด๋ถ ์ฝ๋๋ฅผ ์ดํด๊ฐ๋ฉฐ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ง ์คํ๋ง์ ์ด๊ธฐํ ๊ณผ์ ์ฐ์ ์คํ๋ง์ ์ด๊ธฐํ ๊ณผ์ ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค. SpringAppliction์ run ๋ฉ์๋ ๋ด๋ถ์์, refreshContext()๋ฅผ ํตํด ๋น๋ค์ ์ด๊ธฐํํ๊ณ ์์กด๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ๋ฉ์๋์ ํธ์ถ์ ๋ฐ๋ผ๊ฐ๋ค๋ณด๋ฉด AbstractApplicationContext์ refresh()๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. ์ด๊ณณ์์๋ finishBeanFactoryInitialization() ๋ฉ์๋๋ฅผ ํตํด ์ด์ ๊ณผ์ ๋ค์์ ๋ฑ๋ก๋์ง..
๐ง ์ํฉ ์ธ์ฆ ์ JWT๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์งํํ๋ฉฐ, ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธ์ ์ ์ธํ ๋ชจ๋ URL์ ๋ํด์ ์ธ์ฆ ๊ด๋ จ Interceptor๋ฅผ ๊ตฌํํ์ฌ ๋ฑ๋กํด ๋ ์ํ์์ต๋๋ค. ํด๋น ์ธํฐ์
ํฐ์์๋ AccessToken์ด ์๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ throw ํ๋๋ก ๊ตฌํํ์๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์ต๋๋ค. @Component public class LogInInterceptor implements HandlerInterceptor { // ์๋ต @Override public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) { AccessToken token = extractA..
๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด JSON ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋ฉ๋๋ค. ์์๋ฅผ ์ํด ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. @Controller public class MemberController { @GetMapping("/") public MemberDto getInfo(){ return new MemberDto("์ ๋ํ",12)); } } ํด๋น ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋น์ฐํ๊ฒ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ @Controller๋ฅผ @RestController๋ก ๋ฐ๊พธ์ด์ฃผ๊ฑฐ๋, @ResponseBody๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ ๊ฒ์
๋๋ค. ๋๋ ResponseEntity๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ResponseEntity๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. @Controller public class MemberContr..
@RequestBody๋ฅผ ์ฌ์ฉํ๋ฉด MappingJackson2HttpMessageConverter๊ฐ ObjectMapper๋ฅผ ํตํด ๊ฐ์ ๋ฐ์ธ๋ฉํด์ค๋๋ค. ์ฆ @RequestBody์ ๋ฐ์ธ๋ฉ ์กฐ๊ฑด์ ObjectMapper์ ๋ฐ์ธ๋ฉ ์กฐ๊ฑด๊ณผ ๋์ผํฉ๋๋ค. ํด๋น ๊ณผ์ ์ ๋งจ ๋ง์ง๋ง์ ์์ธํ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ์ ๊ธฐ๋ณธ์ ์ธ ์ํฉ์์ ๋ฐ์ธ๋ฉ์ด ๋๋ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ฐ๋ฅํ ์กฐ๊ฑด (๋ชจ๋ ์ ๊ทผ์ ์ด์) ๊ธฐ๋ณธ์์ฑ์ + (public) Getter ๊ฐ๋ฅ (๋ชจ๋ ์ ๊ทผ์ ์ด์) ๊ธฐ๋ณธ์์ฑ์ + (๋ชจ๋ ์ ๊ทผ์ ์ด์) Setter ๊ฐ๋ฅ ๋ถ๊ฐ๋ฅํ ์กฐ๊ฑด ๊ธฐ๋ณธ์์ฑ์๋ง ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์์ฑ์๊ฐ ์๋ ๊ฒฝ์ฐ (๋ชจ๋ ์ ๊ทผ์ ์ด์) ๊ธฐ๋ณธ์์ฑ์ + (public์ด ์๋ ๋ค๋ฅธ ์ ๊ทผ์ ์ด์) Getter ObjectMapper ์กฐ๊ฑด ๋ณ๊ฒฝํ๊ธฐ object..
์ํฉ 1 - String ํ์
์ List์ธ ๊ฒฝ์ฐ "๋ฆฌ์คํธ๋ช
" : [ "์์1", "์์2", "์์3", "์์4" ] ์์์ " "๋ ์๋ต๊ฐ๋ฅ ์์ public class Blog { private String address; private List visitor = new ArrayList(); public List getVisitor() { return visitor; } public String getAddress() { return address; } public Blog() { } } ํ
์คํธ์ฝ๋ @SpringBootTest class ObjectMapperTest { private ObjectMapper objectMapper = new ObjectMapper(); private static ..
์ด์ ๊น์ง์ ์์ธ ์ฒ๋ฆฌ ํฌ์คํ
์์๋ API ๋ฐฉ์์ด ์๋ ๊ธฐ๋ณธ์ ์ธ ํ๋ฉด์ ๋ฐํํ๋ ๋ฐฉ์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฃจ์๋ค. ๊ทธ๋ฌ๋ API ํต์ ์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ํ๋ฉด์ ๋ฐํํ๋ ๊ฒ์ ์๋ฌด๋ฐ ์ธ๋ชจ๊ฐ ์๋ค. ๋ฐ๋ผ์ API ํต์ ์์ ์์ธ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ์๋ ์ด๋ค ์์ผ๋ก ์์ธ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ ๊ฒ์ธ์ง๋ฅผ ์ ํ๊ณ , ๊ทธ์ ๋ง๊ฒ json์ผ๋ก ์์ธ ๋ฉ์ธ์ง๋ฅผ ๋ฐํํด ์ฃผ์ด์ผ ํ๋ค. ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์์ธ ์ฒ๋ฆฌ ์คํ๋ง ๋ถํธ๋ BasicErrorController๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค๊ณ ํ์๋ค. API ์์ธ ๋ํ ์ด๊ณณ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ฃผ๋๋ฐ, ๋ฐํํด์ฃผ๋ json์ ๋ค์๊ณผ ๊ฐ์ ํ์์ด๋ค. Accept ํค๋๊ฐ application/json์ธ ๊ฒฝ์ฐ { "timestamp": "2022-01-07T13:17:21..