๋ฌธ์ ์ํฉ
SPA
(Single Page Application)๋ ๋ง ๊ทธ๋๋ก ๋จ์ผ ํ์ด์ง์ ๋์ ์ผ๋ก ๋ด์ฉ์ ๋ณ๊ฒฝํ์ฌ ์น ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ค. SPA์ ๋ชจ๋ ๊ฒฝ๋ก๋ ๊ฒฐ๊ตญ ๋จ์ผ ํ์ด์ง(index.html)๋ก ํฅํ๊ฒ ๋์ด์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฒฝ๋ก์์ ์๋ก๊ณ ์นจ์ ํ๋ค๋ฉด ๊ทธ ๊ฒฝ๋ก๋ก GET ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ 404 ํด๋น ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ฆ, vue.js์์ ๋ผ์ฐํ
์ ํตํด ํ์ด์ง ์ด๋์ ํ์ง ์๊ณ ๋ธ๋ผ์ฐ์ ์ฃผ์ ์ฐฝ์ ์ง์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ๊ฑฐ๋ ์๋ก๊ณ ์นจ์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ๋ป์ด๋ค. ์๋ฅผ๋ค์ด http://localhost:8080/host
๊ฒฝ๋ก๋ฅผ ๋ทฐ์ ๋ผ์ฐํ
๊ธฐ๋ฒ์ ์ฐ๋ฉด /host
์ ๋งคํ๋๋ ์ปดํฌ๋ํธ(ํ์ด์ง)๋ฅผ ๊ฐ์ ธ์ ํ๋ฉด์ ๋์ด๋ค. ํ์ง๋ง ์์ ๊ฒฝ๋ก๋ฅผ ์ฃผ์์ฐฝ์ ์ง์ ์
๋ ฅํ๊ฑฐ๋ ์ ๊ฒฝ๋ก์์ ์๋ก๊ณ ์นจ์ ํ๋ฉด GET http://localhost:8080/host ์์ฒญ์ด ์๋ฒ๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
ํด๋น GET ์์ฒญ์ ๋ฐ์ spring์ URI ๋งคํ์ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ด๋ค view๋ฅผ ๋ฐํํด ํ์ด์ง๋ฅผ ๋์ฐ๋ คํ ํ
๋ฐ, SPA ๊ฐ๋ฐ์์๋ index.html
ํ์ด์ง ์ด์ธ์ ํ์ด์ง๋ฅผ ๋์ฐ์ง ์๋๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ
์ด ๋ฌธ์ ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ 404 ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋๋๋ /error
๊ฒฝ๋ก๋ฅผ spirng์์ ๋งคํํ์ฌ index.html
๋จ์ผ ํ์ด์ง๋ก ์ด๋์์ผ์ฃผ๋ฉด ๋๋ค.
1. "/error" ์ index.html ๋งคํํด์ฃผ๊ธฐ
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ErrorPageController implements ErrorController {
@GetMapping("/error")
public String redirectRoot(){
return "index.html";
}
}
์์์ ์ค๋ช
ํ ์ด์ ๋ก ์๋ฌ๊ฐ ๋ฐ์๋์ด /error
๊ฒฝ๋ก๋ก ์ด๋ํ์ ๋ ๋งคํํด์ฃผ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๋ค. @GetMapping
์ ํตํด /error
๊ฒฝ๋ก๋ฅผ ๋งคํํด์ฃผ๊ณ index.html
๋ฅผ ๋ฆฌํดํด ๋จ์ผ ํ์ด์ง๋ก ์ด๋์์ผ์ค๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ์ปจํธ๋กค๋ฌ์์ ๋ฐํํ๋ ๋ทฐ๋ resource/templates
๊ฒฝ๋ก์ ์๋ ํ์ผ์ด๋ค. ์คํ๋ง ๋ถํธ์์ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด์๊ณ ์์ ์ฝ๋์ฒ๋ผ return "index"
๋ฅผ ๋ฐํํ๋ฉด resource/templates
๊ฒฝ๋ก์ ์๋ index ๋ ์ด๋ฆ์ .html ํ์ผ์ ์ฐพ๋๋ก ์ค์ ๋์ด์๋ค.
๋ง์ฝ vue.js์์ ๋น๋ํ ํ์ผ(index.html)์ด spring resource๊ฒฝ๋ก์ templates์ด ์๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์๋ค๋ฉด ์ค์ ์ ๋ฐ๊ฟ์ค์ผ ํ๋ค. ์ฐธ๊ณ ๋ก ๋์ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ์ ํ๊ฒฝ์ด๋ค. spring ํ๋ก์ ํธ ์์ vue ํ๋ก์ ํธ๋ฅผ ๋ฃ์ด ์ฐ๋์์ผฐ๊ณ , vue ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ฉด spring ํ๋ก์ ํธ ์๋ src/main/resources/static
์ ์ ์ฅ๋๋๋ก ์ค์ ํ๋ค. (์คํ๋ง๋ถํธ ๋ด์ฅ ์๋ฒ์์ vue.js ๊ฒฐ๊ณผ๋ฌผ์ด ์คํ๋๋๋ก ํ๊ธฐ ์ํด) ์ฆ, ์๋ฒ ์์์ ์๋ก๊ณ ์นจ์ ํ์ ๋ ํ๋ฉด์ ๋ํ๋์ผํ๋ ํ์ผ์ templates์ด ์๋ static ๊ฒฝ๋ก์ ์๋ค!
2. Spring boot Thymeleaf ๊ฒฝ๋ก ์ค์
์์์ ํ ๊ฒ์ฒ๋ผ ์ปจํธ๋กค๋ฌ๋ก index.html
๋ก ๋งคํํ๋๋ฐ๋ 404์๋ฌ๊ฐ ๋ฌ๋ค๋ฉด index.html
ํ์ผ์ ๋ชป์ฐพ์์ ํ๋ฅ ์ด ํฌ๋ค. ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐํํ๋ ๋ทฐํ์ผ์ /templates
์์ ์ฐพ๋ ์ด์ ๋ spring์์ ๋ง์ด ์ฌ์ฉํ๋ ํ
ํ๋ฆฟ ๋ฌธ๋ฒ์ธ ํ์๋ฆฌํ(Thymeleaf) ์ค์ ์ด ๊ทธ๋ ๊ฒ ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. (ํ์๋ฆฌํ๋ฅผ spring ํ์ ์ค์ ํ ๋ ๋ด๊ฐ ์ ํํ๋..? ๊ธฐ์ต ์ญ์ ์ฐ) ์ฆ /templates
์ด ์๋ /static
์์ index.html
์ ์ฐพ๋๋ก ๋ณ๊ฒฝํด๋ณด์. spring ํ๋ก์ ํธ์์ application.yml
ํ์ผ์์ ์์ ํด์ฃผ๋ฉด ๋๋ค.
spring:
thymeleaf:
prefix: classpath:static/ # ์ํ๋ ๊ฒฝ๋ก๋ก ์ค์ !
cache: false # ์๋ก๊ณ ์นจ ์ ์ ์ฉ
๋ -.-
'๐ BackEnd > ๐ spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[spring] build.gradle ์์กด์ฑ ๊ด๋ฆฌ compile, runtime (0) | 2022.06.17 |
---|---|
[spring MVC] ํธ๋ค๋ฌ ๋งคํ(HandlerMapping)๊ณผ ํธ๋ค๋ฌ ์ด๋ํฐ(HandlerAdapter) (0) | 2022.04.26 |