๐Ÿ๏ธ Spring

๐Ÿง Http ์š”์ฒญ ํ—ค๋” ์กฐํšŒ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.CookieValue; import org.springframework.web.bind.annotation.RequestHeader; import org.springframe..
๐Ÿง @RequestMapping ์š”์ฒญ๋œ url์— ๋Œ€ํ•ด์„œ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @RequestMapping("/hello-basic") public String helloBasic() { return "ok"; } @RequestMapping์„ ์ฒ˜๋ฆฌํ•˜๋Š” HandlerMapping๊ณผ HandlerAdapter๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. RequestMappingHandlerMapping RequestMappingHandlerAdapter ๐Ÿง URL ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋งคํ•‘ @RequestMapping("/hello") /hello ๋กœ URL ํ˜ธ์ถœ์ด ์˜ค๋ฉด ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์†์„ฑ์„ ๋ฐฐ์—ด๋กœ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์ค‘ ์„ค์ •๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. {"/hello", "/hi..
๐Ÿง ์„œ๋ก  ์ด์ „ ๊ธ€์—์„œ ์Šคํ”„๋ง MVC์˜ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋•Œ HandlerMapping๊ณผ HandlerAdapter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿง Controller๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด ์ €ํฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” Controller(ํ˜น์€ Handler)๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1. ์š”์ฒญ(Request) URL์ด ๋“ค์–ด์˜ค๋ฉด, ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€์‘๋˜๋Š” Controller(Handler)๋ฅผ HandlerMapping ์†์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2. HandlerMapping์„ ํ†ตํ•ด ์ฐพ์€ Controller(Handler)๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” HandlerAdapter๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ..
์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋กœ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋˜ ์ค‘์—, ์ฝ”๋“œ์— ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. (์ •ํ™•ํžˆ๋Š” ๋ฐœ๊ฒฌํ•ด์ฃผ์‹  ๊ฒƒ) ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์ž. @Service @RequiredArgsConstructor public class LoadUserService { private final RestTemplate restTemplate = new RestTemplate(); private SocialLoadStrategy socialLoadStrategy;//์ถ”์ƒ ํด๋ž˜์Šค, ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๋Š” ์‚ฌ์ดํŠธ๋ ˆ ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง public OAuth2UserDetails getOAuth2UserDetails(AccessTokenSocialTypeToken authentication) { SocialType socialType = aut..
์ฒ˜์Œ ํ•ด๋‹น ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ, ์ •๋ง ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค ๊ด€๋ จ๋œ ์ž๋ฃŒ๊ฐ€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋žœ๋”๋ง์„ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•˜๋Š” ์˜ˆ์‹œ๋ฐ–์— ์—†์—ˆ๊ณ , REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž๋ฃŒ๊ฐ€ ์—†์–ด์„œ ๋˜๊ฒŒ ๊ณ ์ƒ ๋งŽ์ดํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €์™€ ๊ฐ™์€ ์‚ฌ๋žŒ์ด ๋งŽ์„๊นŒ๋ด ์ด๋ ‡๊ฒŒ ์ง€๊ธˆ๊นŒ์ง€ ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์จ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ž‘ ์›๋ฆฌ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  (๋ฆฌ์•กํŠธ๊ฐ€ ์•„๋‹ˆ์–ด๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค), ๋ฐฑ์—”๋“œ๋กœ๋Š” ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ํ•˜๋Š”๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ์— ๋„˜์–ด๊ฐ€๊ณ , ๋ฐฑ์—”๋“œ์˜ ๊ตฌ์„ฑ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ํ”„๋ก ํŠธ์—์„œ ์†Œ์…œ ๋กœ๊ทธ์ธ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AccessToken์„ ๋ฐ›์•„์˜ค๋Š” ์ฝ”๋“œ๊นŒ์ง€๋Š” ์ž‘์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—์„œ๋Š” AccessToken์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์„œ๋ฒ„์— ์ „๋‹ฌํ•ด์ฃผ๊ณ , ์„œ๋ฒ„์—์„œ๋Š” ํ•ด๋‹น..
์˜ˆ์ „๋ถ€ํ„ฐ @Transaction์ด ์ค‘์ฒฉ๋˜์„œ ์‚ฌ์šฉ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ..?? ๋ผ๊ณ  ๋ช‡๋ฒˆ ์ƒ๊ฐํ•ด ๋ณด์•˜๊ณ , ๊ทธ๋•Œ ๋Œ€์ถฉ ์‚ดํŽด๋ณด๊ณ  ๋ง์•˜์—ˆ๋Š”๋ฐ, ์˜ค๋Š˜ ์–ด์ฉŒ๋‹ค๊ฐ€ ์ด๊ฒƒ ๊ด€๋ จํ•ด์„œ ์กฐ๊ธˆ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด ์ƒ๊ฒจ์„œ (์‚ฌ์‹ค์€ ์ข…ํ˜„๋‹˜์ด ์–ธ๊ธ‰ํ•ด์ฃผ์‹  ๊ฑฐ๊ธด ํ•˜์ง€๋งŒ) ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์‚ฌ์‹ค ์ด ๊ธ€์€ ์ดํ›„ ๋‹ค๋ฃฐ (์ค‘์ฒฉ๋œ) ํŠธ๋žœ์žญ์…˜์—์„œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ธ€์„ ์„œ์ˆ ํ•  ๋•Œ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•  ๋‚ด์šฉ์ด๊ธฐ์— ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ๋‹ค๋ฃจ๊ณ  ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” @Transactional์˜ propagation ์†์„ฑ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. Propagation(์ „ํŒŒ) ์†์„ฑ ์Šคํ”„๋ง์˜ Propagation์˜ ์†์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), SUPPORTS(TransactionDefi..
๐Ÿง ์„œ๋ก  ์ด์ „ ๊ธ€์—์„œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ํ•™์Šตํ•˜๋ฉฐ ๊ฐ„๋‹จํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ทธ๋•Œ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋˜ ๊ตฌ์กฐ์™€ ์‹ค์ œ ์Šคํ”„๋ง MVC์˜ ๊ตฌ์กฐ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉฐ, ์Šคํ”„๋ง MVC์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•˜์—ฌ ์ดํ•ดํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿง ์Šคํ”„๋ง MVC์˜ ์ „์ฒด ๊ตฌ์กฐ ์ด์ „์— ์ €ํฌ๊ฐ€ ๋งŒ๋“ค์—ˆ๋˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์‚ฌ์ง„์€ ๊น€์˜ํ•œ ์„ ์ƒ๋‹˜์˜ ์Šคํ”„๋ง MVC 1ํŽธ - ๋ฐฑ์—”๋“œ ์›น ๊ฐœ๋ฐœ ํ•ต์‹ฌ ๊ธฐ์ˆ ์˜ ์ž๋ฃŒ์—์„œ ๋ฐœ์ทŒํ•˜์˜€์Šต๋‹ˆ๋‹ค.) ์Šคํ”„๋ง MVC๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋งค์šฐ ๋น„์Šทํ•œ ๊ตฌ์กฐ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. FrontController -> DispatcherServlet ์ด๋ฆ„๋งŒ ๋‹ฌ๋ผ์กŒ์„ ๋ฟ, DispatcherServlet ์—ญ์‹œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ• ..
๐Ÿง ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ ์•ž์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ(Controller)๋Š” MVC ํŒจํ„ด์—์„œ์˜ Controller๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ Controller์˜ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์„ ๋ฐ›์•„ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (์ด๋•Œ ๋ณดํ†ต Service ๊ณ„์ธต์˜ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.) ๋ทฐ(View)์— ์ „๋‹ฌํ•  ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ชจ๋ธ(Model)์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋ฌธ์ œ์  ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์—, ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์™œ ์จ์•ผ ํ•˜๋Š”์ง€, ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ํšŒ์› ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํšŒ์› ๊ฐ€์ž… ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” Controller..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (13 Page)