
구조화된 웹 애플리케이션 설정:
이 코드를 통해 Spring MVC 애플리케이션의 핵심적인 설정(뷰 리졸버, CORS, 정적 자원 처리 등)을 체계적으로 관리할 수 있다. 프로젝트 구조가 깔끔해지고, 유지보수가 용이해진다.
생산성 향상:
스프링 프레임워크의 설정을 명시적으로 관리함으로써, 개발자가 일일이 처리해야 할 복잡한 작업을 간소화하고, 빠르고 효율적인 개발이 가능하다. 예를 들어, 뷰 리졸버를 통해 JSP 파일 경로 및 처리 방식을 자동으로 관리할 수 있어, 생산성을 크게 향상시킨다.
보안 및 접근 제어 강화:
CORS 설정을 통해 외부 도메인으로부터 애플리케이션을 보호하거나, 특정 도메인만 허용하여 보안 수준을 강화할 수 있다. 이를 통해 애플리케이션이 외부 클라이언트와 안전하게 상호작용할 수 있다.
정적 자원 관리 용이성:
정적 자원 핸들러를 통해 이미지, CSS, JS 파일 등 정적 리소스를 손쉽게 제공할 수 있다. 이를 통해 사용자의 페이지 로딩 시간을 단축시키고, 캐시 설정을 통해 서버 부하를 줄일 수 있다.
직관적인 구성의 중요성:
스프링의 설정 파일을 작성하면서 느낀 점은, 애플리케이션의 구조를 직관적이고 유지보수하기 쉽게 구성하는 것이 얼마나 중요한지입니다. 모든 설정이 명확하게 정의되어 있으면, 여러 개발자가 참여하는 대규모 프로젝트에서도 개발의 일관성을 유지할 수 있습니다.
편리한 선언적 설정:
스프링 프레임워크의 선언적 방식(어노테이션 기반 설정) 덕분에, 복잡한 기능도 단순하게 관리할 수 있다는 점이 인상적입니다. 특히, 복잡한 코드 작성 없이 뷰 리졸버, CORS 설정을 한 줄로 설정할 수 있는 점이 매우 유용하다고 느꼈습니다.
확장성과 유연성:
정적 리소스 핸들러 설정이나 CORS 설정에서 느낀 점은, 특정 요구 사항에 맞게 기능을 확장하고 조정할 수 있다는 점입니다. 작은 프로젝트에서 대규모 프로젝트로 확장할 때 이러한 유연성이 매우 중요한 역할을 합니다.
Spring MVC 설정 심화 학습:
앞으로 Spring MVC의 설정과 동작 원리에 대해 더 깊이 학습하고자 합니다. 이를 통해 복잡한 웹 애플리케이션에서도 최적의 구조를 설계하고, 효율적인 성능을 낼 수 있도록 설정을 최적화하는 것이 목표입니다.
CORS 및 보안 설정 최적화:
CORS와 같은 보안 관련 설정을 더 이해하고, 실제 프로젝트에서 이를 어떻게 최적화할 수 있을지 고민할 것입니다. 특히 다양한 외부 클라이언트(모바일, 웹 등)와의 상호작용에서 보안을 강화하는 방법을 연구하고 싶습니다.
애플리케이션 성능 최적화:
정적 자원 관리와 같은 설정을 통해 애플리케이션의 성능을 어떻게 더 최적화할 수 있을지에 대해 목표를 세웠습니다. 특히 캐싱 메커니즘과 리소스 제공 전략을 통해 사용자 경험을 개선하고, 서버 부하를 줄이는 방법을 모색할 것입니다.
스프링 MVC 및 REST API 통합:
이 코드를 기반으로, 스프링 MVC와 REST API를 결합하여 보다 유연한 웹 애플리케이션을 개발하고자 합니다. CORS 설정 등을 바탕으로 클라이언트와 서버 간의 상호작용을 효율적으로 관리하는 방법에 대한 목표도 세웠습니다.
이를 통해 앞으로 스프링 기반 웹 애플리케이션에서의 생산성 향상과 더 나은 구조 설계를 이끌어낼 수 있도록 학습할 계획입니다.
package org.project.backend.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
/**
* Spring MVC 설정 클래스.
* View Resolver, CORS 설정, 정적 자원 핸들링 등을 관리.
*/
@Configuration
@EnableWebMvc // Spring MVC 설정을 활성화
@ComponentScan(basePackages = "org.project.backend")
@PropertySource("classpath:application.properties")
public class WebMvcConfig implements WebMvcConfigurer {
/**
* JSP 파일을 위한 뷰 리졸버 설정.
* JSP 파일 경로와 확장자를 설정하며, 우선순위를 명시.
*
* @return InternalResourceViewResolver JSP 뷰 리졸버
*/
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // JSP 파일 경로 설정
resolver.setSuffix(".jsp"); // JSP 파일 확장자 설정
resolver.setOrder(1); // 우선순위 설정
return resolver;
}
/**
* CORS(Cross-Origin Resource Sharing) 설정을 정의.
* 초기 설정 : 특정 도메인 및 메소드, 헤더에 대해 CORS를 허용하며, 자격 증명도 허용.
*
* @return CorsConfigurationSource CORS 설정 객체
*/
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
// // 도메인 설정 (React Native의 경우 localhost 혹은 10.0.2.2 사용)
// configuration.addAllowedOrigin("http://localhost:3000"); // React Native의 경우 'localhost' 사용
// configuration.addAllowedOrigin("http://10.0.2.2:3000"); // Android Emulator의 경우 10.0.2.2 사용
//
// configuration.addAllowedMethod("GET");
// configuration.addAllowedMethod("POST");
// configuration.addAllowedMethod("PUT");
// configuration.addAllowedMethod("DELETE");
// configuration.addAllowedMethod("OPTIONS"); // Preflight 요청을 위해 OPTIONS 허용
//
// configuration.addAllowedHeader("*");
configuration.addAllowedOriginPattern("*"); // 모든 출처 허용 (필요시 나중에 특정 도메인만 허용)
configuration.addAllowedMethod("*"); // 모든 HTTP 메소드 허용
configuration.addAllowedHeader("*"); // 모든 헤더 허용
configuration.setAllowCredentials(true); // 자격 증명 허용 (토큰, 쿠키 등)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration); // 모든 경로에 대해 CORS 설정 적용
return source;
}
/**
* MVC 핸들러 매핑을 검사하기 위한 Introspector를 제공.
*
* @return HandlerMappingIntrospector 핸들러 매핑 검사기
*/
@Bean
public HandlerMappingIntrospector mvcHandlerMappingIntrospector() {
return new HandlerMappingIntrospector();
}
/**
* 정적 자원에 대한 핸들러를 등록.
* /resources/** 경로와 /static/** 경로에 있는 정적 자원을 제공하며, 캐시 기간을 설정.
*
* @param registry ResourceHandlerRegistry 리소스 핸들러 레지스트리
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// /resources/** 경로에 대한 정적 자원 핸들링
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCachePeriod(3600); // 1시간 마다 캐시
// /static/** 경로에 대한 정적 자원 핸들링
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
}
이 코드는 Spring MVC 설정 파일로, 뷰 리졸버(View Resolver), CORS 설정, 정적 자원 핸들러 등을 구성한다.
각 줄의 자바 문법 및 스프링 개념을 설명하겠다.
package org.project.backend.config;
org.project.backend.config 패키지에 속해 있음을 선언한다.import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.project.backend")
@PropertySource("classpath:application.properties")
public class WebMvcConfig implements WebMvcConfigurer {
@Configuration: 이 클래스가 스프링의 구성 클래스임을 명시하여, 애플리케이션 설정을 정의한다.@EnableWebMvc: Spring MVC를 활성화하여 애플리케이션에서 MVC 기능을 사용할 수 있게 한다.@ComponentScan: org.project.backend 패키지를 스캔하여 컴포넌트(빈)를 자동으로 등록한다.@PropertySource: application.properties 파일을 로드하여 외부 설정을 사용할 수 있게 한다.@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setOrder(1);
return resolver;
}
setPrefix("/WEB-INF/views/"): JSP 파일이 위치한 경로를 설정한다.setSuffix(".jsp"): JSP 파일 확장자를 설정한다.setOrder(1): 리졸버의 우선순위를 설정한다.@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOriginPattern("*");
configuration.addAllowedMethod("*");
configuration.addAllowedHeader("*");
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
addAllowedOriginPattern("*"): 모든 출처를 허용한다.addAllowedMethod("*"): 모든 HTTP 메서드(GET, POST, PUT 등)를 허용한다.addAllowedHeader("*"): 모든 요청 헤더를 허용한다.setAllowCredentials(true): 인증 정보를 허용한다(쿠키, 토큰 등).@Bean
public HandlerMappingIntrospector mvcHandlerMappingIntrospector() {
return new HandlerMappingIntrospector();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/")
.setCachePeriod(3600);
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/");
}
addResourceHandler("/resources/**"): /resources/ 경로에 대한 요청을 처리한다.addResourceLocations("/resources/"): 해당 경로에 있는 정적 자원을 제공하도록 설정한다.setCachePeriod(3600): 1시간 동안 캐시를 유지하도록 설정한다.addResourceHandler("/static/**"): /static/ 경로에 있는 정적 자원을 처리한다.addResourceLocations("classpath:/static/"): 클래스패스 내 /static/ 디렉토리에 있는 자원을 제공한다.이 코드는 Spring MVC 애플리케이션에서 뷰 리졸버, CORS, 정적 리소스 핸들링 등을 설정하는 주요 설정 파일이다. @Configuration, @EnableWebMvc 등의 어노테이션을 통해 Spring MVC 기능을 활성화하고, 뷰 리졸버를 통해 JSP 파일을 처리하며, CORS 설정을 통해 외부 도메인에서 서버에 접근할 수 있는 권한을 제어한다. 정적 자원 핸들러는 이미지, CSS, JS 파일과 같은 정적 리소스를 효과적으로 관리할 수 있게 한다.
