[LG U+ 유레카 3기] Spring MVC + CORS 실습

2025. 11. 25. 14:10Java/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 응답이다.

  1. 브라우저에게 “/main.html 로 다시 GET 요청해라” 라고 지시
  2. 브라우저는 GET /main.html 요청 수행
  3. 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 연동할 때 그대로 쓰이기 때문에 꼭 정확히 이해해두면 좋다.