๐[Spring] Spring Boot๋ฅผ ์ฌ์ฉํ์ฌ HTML, CSS, JS๋ก ๋ง๋ Frontend ํ์ด์ง๋ฅผ ๋ก์ปฌ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์?
- Spring Boot๋ฅผ ์ฌ์ฉํ์ฌ HTML, CSS, JavaScript๋ก ๋ง๋ ํ๋ฐํธ์๋ ํ์ด์ง๋ฅผ ๋ก์ปฌ ์๋ฒ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
- ์ด ๊ณผ์ ์์๋ ์ ์ ๋ฆฌ์์ค๋ฅผ Spring Boot ํ๋ก์ ํธ์ ํฌํจํ๊ณ , ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ์ ์ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
1๏ธโฃ Spring Boot ํ๋ก์ ํธ์ ์ ์ ํ์ผ ์ถ๊ฐ.
- HTML, CSS, JavaScript ํ์ผ์ Spring Boot ํ๋ก์ ํธ์ ์ ์ ๋ฆฌ์์ค ๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํฉ๋๋ค.
๐ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ.
src
โโโ main
โโโ java
โ โโโ com.example.demo (ํจํค์ง ๊ตฌ์กฐ)
โ โโโ DemoApplication.java
โโโ resources
โ โโโ static
โ โ โโโ css
โ โ โ โโโ styles.css
โ โ โโโ js
โ โ โ โโโ scripts.js
โ โ โ โโโ login-scripts.js
โ โ โโโ signup.html
โ โ โโโ login.html
โ โโโ templates (ํ์ํ ๊ฒฝ์ฐ Thymeleaf ํ
ํ๋ฆฟ ํ์ผ)
โโโ application.properties
- static ๋๋ ํ ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ฉฐ, ์ฌ๊ธฐ์ CSS, JavaScript, ์ด๋ฏธ์ง ๋ฐ HTML ํ์ผ์ ๋ก๋ํ ์ ์์ต๋๋ค.
- HTML ํ์ผ(signup.html, login.html)์ ์ง์ static ๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํ์ฌ ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ง์ ๋ก๋๋๋๋ก ํฉ๋๋ค.
2๏ธโฃ Spring Boot ์ปจํธ๋กค๋ฌ ์ค์ .
- Spring Boot ์์
/login
๊ณผ/signup
์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ๊ฐ๋จํ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ญ๋๋ค.
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AuthController {
@GetMapping("/login")
public String loginPage() {
return "login.html"; // static/login.html ํ์ผ์ ๋ฐํ
}
@GetMapping("/signup")
public String signupPage() {
return "signup.html"; // static/signup.html ํ์ผ์ ๋ฐํ
}
}
3๏ธโฃ ์ ์ ํ์ผ ๋ฐ ์์ ์ ๊ทผ
- HTML ํ์ผ์์ CSS ๋ฐ JavaScript ํ์ผ์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์์ ํ์ฌ Spring Boot์์ ์ ๊ณตํ๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๋๋ก ๋ถ๋ฌ์ฌ ์ ์๊ฒํฉ๋๋ค.
๐ login.html(์์)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Page</title>
<link rel="stylesheet" href="/css/styles.css"> <!-- ์ ๋ ๊ฒฝ๋ก๋ก ์์ -->
</head>
<body>
<div class="login-container">
<form id="loginForm" class="login-form">
<h2>Login</h2>
<div class="input-group">
<label for="login-email">Email</label>
<input type="email" id="login-email" name="login-email" required>
</div>
<div class="input-group">
<label for="login-password">Password</label>
<input type="password" id="login-password" name="login-password" required>
</div>
<button type="submit">Login</button>
<p class="signup-link">Don't have an account? <a href="/signup">Sign up here</a></p> <!-- Spring Boot ๊ฒฝ๋ก ์ฌ์ฉ -->
</form>
</div>
<script src="/js/login-scripts.js"></script> <!-- ์ ๋ ๊ฒฝ๋ก๋ก ์์ -->
</body>
</html>
4๏ธโฃ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์คํ
- ์ด์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด ๋ก์ปฌ ์๋ฒ์์
/login
๋ฐ/signup
๊ฒฝ๋ก๋ก ์ ๊ทผํ์ฌ ํ๋ฐํธ์๋ ํ์ด์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๐ ์ ํ๋ฆฌ๊ฒ์ด์ ์คํ ๋ช ๋ น์ด
./gradlwe bootRun #Gradle ์ฌ์ฉ์
mvn spring-boot:run # Maven ์ฌ์ฉ์
5๏ธโฃ ์ถ๊ฐ ์ค์ (ํ์ํ ๊ฒฝ์ฐ)
1๏ธโฃ CORS ์ค์
- ํ๋ฐํธ์๋ ํ์ด์ง์์ ๋ค๋ฅธ ์๋ฒ์ API์ ์ ๊ทผํ๋ ค๋ฉด CORS ์ค์ ์ด ํ์ํ ์ ์์ต๋๋ค.
- WebMvcConfigurer๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ต๋๋ค.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE");
}
};
}
}
๐ CORS(Cross-Origin Resource Sharing)
์น ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ๋๋ฉ์ธ์์ ํธ์คํ ๋๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ ๋ณด์์์ ์ด์ ๋ก, ํ ๋๋ฉ์ธ์์ ๋ก๋๋ ์น ํ์ด์ง๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์ ํํฉ๋๋ค.
์ด๋ฅผ โ๋์ผ ์ถ์ฒ ์ ์ฑ (Same-Origin-Policy)โ๋ผ๊ณ ํฉ๋๋ค.
2๏ธโฃ API์ ์ฐ๊ฒฐ.
- ๋ก๊ทธ์ธ, ํ์๊ฐ์
๋ฑ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ฐฑ์๋ API๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด,
/login
API๋ฅผ ๋ง๋ค์ด JavaScript์์ ํด๋น API๋ก AJAX ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
- ์๋ฅผ ๋ค์ด,
๐ AJAX(Asynchronous JavaScript and XML)
์น ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ ๋งํฉ๋๋ค.
์น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ๋ ๋น ๋ฅด๊ณ ์ง๊ด์ ์ธ ๊ฒฝํ์ ํ ์ ์๋๋ก ๋์์ค๋๋ค.
6๏ธโฃ ์์ฝ.
- Spring Boot ํ๋ก์ ํธ์ static ๋๋ ํ ๋ฆฌ์ HTML, CSS, JavaScript ํ์ผ์ ๋ฃ์ด ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด
/login
๋ฐ/signup
๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ณ HTML ํ์ผ์ ๋ก๋ํฉ๋๋ค. - JavaScript ์ฝ๋๋ ํ๋ฐํธ์๋์์ ํ์ํ ๋์์ ์ฒ๋ฆฌํ๋ฉฐ, ์ถ๊ฐ๋ก API๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.