π[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λ₯Ό νΈμΆν μ μμ΅λλ€.