2025. 11. 25. 14:10ㆍJava/Spring
이번 실습은 Spring MVC의 핵심 개념인 POST 처리, redirect 흐름, RestController의 JSON 응답 방식, 그리고 CORS 전역 설정까지 묶어서 진행했다.
✔ @SpringBootApplication
1️⃣ @SpringBootConfiguration
- 내부적으로 @Configuration을 상속
- 스프링 컨테이너에 설정 클래스임을 알려줌
2️⃣ @EnableAutoConfiguration
- 스프링이 자동으로 필요한 Bean 들을 설정해주는 기능
- 예:
- Tomcat 자동 설정
- DataSource 자동 설정
- MVC 설정 자동 적용
- 스프링 부트 “자동 설정” 핵심 기능
3️⃣ @ComponentScan
- 현재 패키지를 기준으로 하위 패키지 전체에서 Bean(@Component, @Service, @Repository,
❶ 로그인 POST + Redirect 동작 이해
아래는 실습에서 작성한 @PostMapping("/login") 코드이다.
@PostMapping("/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password) {
System.out.println(username);
System.out.println(password);
// return "main.html"; // ← 오류 남 (POST를 static HTML로 forward 시도)
return "redirect:main.html"; // ← 정상 동작
}
✔ 왜 return "main.html" 은 에러가 발생했는가?
main.html은 static 폴더에 있고, static 리소스 제공자는 GET/HEAD만 처리한다.
POST 요청으로 static HTML을 열려고 시도하면서 다음 오류가 발생한다.
Request method 'POST' is not supported
즉, static 폴더의 HTML은 POST 방식으로 forward 할 수 없다.
✔ redirect를 사용해야 하는 이유
return "redirect:main.html" 은 내부 forward가 아니라 302 Redirect 응답이다.
- 브라우저에게 “/main.html 로 다시 GET 요청해라” 라고 지시
- 브라우저는 GET /main.html 요청 수행
- static 핸들러가 정상적으로 main.html을 제공
이 구조는 웹의 고전적 패턴인 PRG (Post-Redirect-Get) 과 동일하며, 새로고침 시 중복 POST도 방지한다.
❷ @RestController 실습 – JSON/문자 응답 과정
두 번째 실습에서는 Spring MVC에서 뷰를 반환하지 않고 데이터를 직접 반환하는 @RestController 를 사용했다.
@RestController
public class JsonController {
@GetMapping("/string")
public String m1() {
System.out.println("/string");
return "안녕하세요!";
}
}
✔ @RestController 의 의미
@RestController = @Controller + @ResponseBody
즉, 리턴값이 뷰 이름이 아니라 HTTP 응답 바디로 나간다.
그래서 return "안녕하세요!" 는 그대로 브라우저에서 문자열이 출력된다.
프론트(Vue/React)와 통신할 때 사용하는 모든 API는 이런 방식으로 만들어지며, JSON 객체도 자동 변환되어 응답된다.
❸ CORS 전역 설정 실습
오늘의 마지막 개념은 CORS (Cross-Origin Resource Sharing) 이었다.
프론트가 localhost:3000, 백엔드가 localhost:8080이면 두 도메인은 서로 다른 Origin이다.
브라우저는 보안상 이 요청을 기본적으로 차단하므로 서버가 허용해주도록 설정해야 한다.
실습에서 사용한 전역 CORS 설정 예시는 다음과 같다.
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
✔ 이 설정이 의미하는 것
- 우리 서버의 모든 URL("/**") 에 대해
- React 개발 서버(3000)에서 오는 요청을 허용
- GET/POST 등 모든 주요 메서드 허용
- 쿠키/세션/인증 정보도 허용
요약하면, 프론트 → 백엔드 API 호출이 가능하도록 브라우저에서 막는 보안 정책을 서버가 허용해주는 것이다.

❹ 오늘 실습 전체 흐름 정리
오늘 배운 내용을 간단하게 전체 흐름으로 묶으면 아래와 같다.
- 로그인 화면에서 POST /login 요청 전송
@PostMapping에서 파라미터 받음- static HTML을 바로 열 수 없기 때문에 redirect 처리
- API가 필요한 경우 @RestController 로 JSON/문자 반환
- 프론트와 실제로 연동하려면 CORS 설정 필수
즉, “Spring MVC 기본 구조 → 화면 이동 흐름 → API 방식 → CORS 허용” 의 순서로 오늘의 모든 실습은 서로 연결되어 있다.
❺ 개념 정리 (CS + Spring 핵심)
- Forward: 서버 내부에서 다른 페이지로 연결 (URL 안 바뀜)
- Redirect: 브라우저에게 새 GET 요청 보내도록 지시 (URL 바뀜)
- @RestController: 데이터(JSON/문자)를 그대로 응답하는 컨트롤러
- JSON: 프론트–백엔드 통신 표준 포맷
- CORS: 브라우저가 다른 Origin 요청을 차단하는 보안 정책
- static 리소스: GET 방식만 제공하는 정적 HTML/CSS/JS 파일
- PRG 패턴: POST → Redirect → GET 흐름
마무리
이번 24일 실습은 Spring 기본기 중에서 가장 핵심적인 흐름을 전부 손으로 직접 해본 중요한 수업이었다.
특히 redirect 문제와 RestController/CORS 개념은 나중에 React/Spring 연동할 때 그대로 쓰이기 때문에 꼭 정확히 이해해두면 좋다.
'Java > Spring' 카테고리의 다른 글
| [LG U+ 유레카 3기] Spring MVC + JSP + MyBatis 프로젝트 정리 (0) | 2025.11.17 |
|---|---|
| [LG U+ 유레카 3기]Spring Boot + JDBC -> MyBatis 전환 실습 (0) | 2025.11.06 |
| [LG U+ 유레카 3기] Spring Boot MVC 도서 관리 시스템 실습 (0) | 2025.11.05 |
| [LG U+ 유레카3기]Spring MVC | HttpSession 로그인 → 유지 → 로그아웃 실습 정리 (0) | 2025.11.05 |
| [LG U+ 유레카 3기]Spring MVC | 요청 바인딩 + View/Model/Redirect 실습 정리 (0) | 2025.11.05 |