IT Developer/Spring

Spring 기초 <10. Spring에서 CORS 설정 및 글로벌 예외 처리 (Exception Handling)>

TEMA_ 2025. 3. 27. 13:51
반응형

스프링 Spring

10. Spring에서 CORS 설정 및 글로벌 예외 처리 (Exception Handling)

 

안녕하세요! 태마입니다.

Spring 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

스프링 Spring

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. CORS (Cross-Origin Resource Sharing)란?

CORS는 웹 브라우저에서 보안상의 이유로 서로 다른 도메인 간 요청을 제한하는 정책
기본적으로 클라이언트(브라우저)와 서버가 동일한 출처(Same-Origin)일 때만 요청이 허용됨

📌 CORS가 필요한 이유
브라우저의 보안 정책(Same-Origin Policy)으로 인해 교차 출처 요청이 차단됨
예: https://example.com에서 https://api.example.com으로 요청하면 차단됨
이를 해결하려면 서버에서 CORS 정책을 허용해야 함

📌 CORS 정책이 없을 때 발생하는 문제
✔ Access to fetch at 'https://api.example.com' from origin 'https://example.com' has been blocked by CORS policy
✔ 브라우저가 보안 정책에 의해 요청을 차단함

📌 CORS는 "웹 보안 정책으로 인해 교차 출처 요청을 차단하는 문제를 해결하는 방법"


2. Spring Boot에서 CORS 설정 방법

📌 1️⃣ 컨트롤러 단위에서 @CrossOrigin 사용

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "https://example.com") // 특정 도메인만 허용
public class ExampleController {

    @GetMapping("/data")
    public String getData() {
        return "CORS 설정된 데이터";
    }
}

✔ 특정 도메인(https://example.com)에서만 요청을 허용

📌 2️⃣ 글로벌 CORS 설정 (WebMvcConfigurer 사용)

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("https://example.com") // 허용할 도메인 지정
                .allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메서드
                .allowCredentials(true); // 쿠키 및 인증 정보 포함 가능
    }
}

✔ 모든 /api/** 경로에 대해 CORS 허용 설정

📌 3️⃣ Spring Security와 함께 CORS 설정 (보안 적용 시 필수)

@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .cors(withDefaults()) // CORS 설정 적용
            .csrf().disable() // CSRF 보호 비활성화 (필요 시 설정)
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            );
        return http.build();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.addAllowedOrigin("https://example.com");
        configuration.addAllowedMethod("*");
        configuration.addAllowedHeader("*");
        configuration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

✔ Spring Security 적용 시, CorsConfigurationSource를 통해 CORS 설정을 적용해야 함

📌 Spring Boot에서 CORS 설정을 적용하면 "교차 출처 요청이 허용되며, 브라우저의 보안 정책 문제를 해결 가능"


✅ 여기까지 CORS의 개념과 Spring Boot에서 CORS 설정 방법을 배웠습니다!
👉 "그렇다면, Spring에서 글로벌 예외 처리는 어떻게 할까?"
✅ 2부에서 Spring Boot의 글로벌 예외 처리 방법을 배워봅시다!

반응형

 


 

2. 상세 주제 정리

 

1. 글로벌 예외 처리란?

애플리케이션 실행 중 발생하는 예외를 일관된 방식으로 처리하는 방법
컨트롤러마다 개별적으로 예외 처리를 하지 않고, 전역에서 일괄적으로 처리 가능

📌 예외 처리 계층 구조

처리 방식설명
try-catch 특정 메서드 내에서 직접 예외를 처리
@ExceptionHandler 컨트롤러에서 특정 예외를 처리
@ControllerAdvice 전역(Global) 예외 처리
Filter / Interceptor 요청 전/후에 예외를 처리

📌 글로벌 예외 처리를 사용하면 "애플리케이션 전반에 걸쳐 예외를 일관된 방식으로 처리 가능"


2. @ExceptionHandler를 활용한 컨트롤러 예외 처리

📌 컨트롤러에서 특정 예외 처리

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        if (id <= 0) {
            throw new IllegalArgumentException("잘못된 ID 값입니다.");
        }
        return ResponseEntity.ok(new User(id, "John Doe", "john@example.com"));
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {
        return ResponseEntity.badRequest().body(e.getMessage());
    }
}

✔ IllegalArgumentException 발생 시, "잘못된 ID 값입니다." 메시지를 반환

📌 @ExceptionHandler는 "특정 컨트롤러 내에서 발생하는 예외를 처리하는 용도"


3. @ControllerAdvice를 활용한 글로벌 예외 처리

📌 모든 컨트롤러에서 발생하는 예외를 처리하는 방법

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {
        return ResponseEntity.badRequest().body("오류 발생: " + e.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGeneralException(Exception e) {
        return ResponseEntity.internalServerError().body("서버 오류 발생: " + e.getMessage());
    }
}

✔ 모든 컨트롤러에서 발생하는 IllegalArgumentException과 Exception을 글로벌하게 처리

📌 @ControllerAdvice를 사용하면 "애플리케이션 전역에서 일관된 예외 처리가 가능"


4. @ResponseStatus로 예외 처리 코드 설정

예외 발생 시 HTTP 상태 코드를 지정하여 클라이언트에 의미 있는 응답 제공

📌 사용자 정의 예외 클래스 생성

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

✔ UserNotFoundException 발생 시 404 상태 코드 반환

📌 글로벌 예외 처리와 함께 사용 가능

@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());
}

✔ UserNotFoundException 예외가 발생하면 404 Not Found 응답 반환

📌 @ResponseStatus를 사용하면 "특정 예외에 대한 HTTP 응답 코드를 직접 설정 가능"


✅ 여기까지 CORS 설정 및 글로벌 예외 처리 방법을 배웠습니다!
👉 "그렇다면, Spring Data JPA vs MyBatis의 차이점은?"
✅ 다음 회차에서 Spring Data JPA vs MyBatis 차이 및 선택 기준을 배워봅시다!



 

반응형