Community

๐Ÿ•Š๏ธ Spring Boot&React์—์„œ ์ƒˆ๋กœ ๊ณ ์นจ 404 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

React๋กœ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์„ ๊ฐœ๋ฐœํ•˜๊ณ  Spring Boot๋ฅผ ํ†ตํ•ด ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์—์„œ, ์‚ฌ์šฉ์ž๋“ค์ด ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ ํ›„ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด 404 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” React์™€ Spring Boot๊ฐ€ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด์—์„œ ๋น„๋กฏ๋œ ๋ฌธ์ œ๋กœ, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งˆ์ฃผํ•˜๋Š” ํ”ํ•œ ์ด์Šˆ์ž…๋‹ˆ๋‹ค. ย  ๋ฌธ์ œ ์ƒํ™ฉ: ์ƒˆ๋กœ๊ณ ์นจ ์‹œ 404 ์˜ค๋ฅ˜ ๋ฐœ์ƒ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ BrowserRouter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…(Client-Side Routing)์„ ์ฒ˜๋ฆฌํ•  ๋•Œ, ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 404 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GET https://example.com/purchased-product 404 (Not Found) ์ด ์ƒํ™ฉ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ /purchased-product ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋ƒˆ์ง€๋งŒ, Spring Boot ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์ง€ ๋ชปํ•ด 404 Not Found๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ย  React๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ชจ๋“  ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋‚˜, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ URL์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋ณธ ๋™์ž‘์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Spring Boot ์„œ๋ฒ„๊ฐ€ ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ย  ๋ฌธ์ œ ์›์ธ: React์™€ Spring Boot ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ์ฐจ์ด [React์˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…] React์—์„œ BrowserRouter๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ(URL)๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ผ์šฐํŒ…์ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๊ฒฝ๋กœ์— ๋งคํ•‘๋œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. * URL ๋ณ€๊ฒฝ์€ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. * React ๋‚ด๋ถ€์—์„œ ์ง€์ •๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ย  [๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋™์ž‘] ๋ฐ˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฑฐ๋‚˜ URL์„ ์ง์ ‘ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. * ์„œ๋ฒ„๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์ •์˜๋œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, 404 Not Found๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. * ์ด๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ… ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋ฌด์ง€ํ•œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ย  React์™€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋™์ž‘ ์ฐจ์ด๋ฅผ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Spring Boot ์„ค์ • ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ย  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Spring Boot์—์„œ React ๊ฒฝ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ Spring Boot ์„œ๋ฒ„๊ฐ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด React์˜ index.html ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ย  [๊ตฌํ˜„ ๋ฐฉ๋ฒ•] Spring Boot์—์„œ React ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ WebController๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WebController implements ErrorController { @GetMapping({ "/purchased-product" }) public String index() { // Spring Boot๊ฐ€ React์˜ index.html ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ • // index.html์€ /resources/static ๋˜๋Š” /resources/public์— ์œ„์น˜ return "index.html"; } } ย ์œ„ ์ฝ”๋“œ๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•˜๊ณ , ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด index.html์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด React์˜ ๋ผ์šฐํ„ฐ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ย  ๊ฒฐ๋ก  Spring Boot์™€ React๋ฅผ ํ†ตํ•ฉํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ƒˆ๋กœ๊ณ ์นจ 404 ์˜ค๋ฅ˜๋Š” React์™€ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์ฐจ์ด์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ React์˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค