스프링 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 차이 및 선택 기준을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현> (0) | 2025.03.30 |
---|---|
Spring 기초 <12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)> (0) | 2025.03.29 |
Spring 기초 <11. Spring Data JPA vs MyBatis 차이 및 선택 기준> (1) | 2025.03.28 |
Spring 기초 <9. Spring에서 DTO, Entity, VO의 차이 및 실무 적용법> (0) | 2025.03.26 |
Spring 기초 <8. Spring에서 RequestParam vs PathVariable 차이점> (0) | 2025.03.25 |
Spring 기초 <7. Spring Boot에서 REST API 개발 (GET, POST, PUT, DELETE)> (0) | 2025.03.24 |
Spring 기초 <6. Spring MVC 기본 개념과 동작 원리 (DispatcherServlet 구조)> (0) | 2025.03.23 |
Spring 기초 <5. Spring에서 @Component, @Service, @Repository, @Controller 차이> (0) | 2025.03.22 |