<1> 해당 게시물에 대한 Benefit, 느낀점, 목표.

Benefit (이점):

  1. 구조화된 웹 애플리케이션 설정:
    이 코드를 통해 Spring MVC 애플리케이션의 핵심적인 설정(뷰 리졸버, CORS, 정적 자원 처리 등)을 체계적으로 관리할 수 있다. 프로젝트 구조가 깔끔해지고, 유지보수가 용이해진다.

  2. 생산성 향상:
    스프링 프레임워크의 설정을 명시적으로 관리함으로써, 개발자가 일일이 처리해야 할 복잡한 작업을 간소화하고, 빠르고 효율적인 개발이 가능하다. 예를 들어, 뷰 리졸버를 통해 JSP 파일 경로 및 처리 방식을 자동으로 관리할 수 있어, 생산성을 크게 향상시킨다.

  3. 보안 및 접근 제어 강화:
    CORS 설정을 통해 외부 도메인으로부터 애플리케이션을 보호하거나, 특정 도메인만 허용하여 보안 수준을 강화할 수 있다. 이를 통해 애플리케이션이 외부 클라이언트와 안전하게 상호작용할 수 있다.

  4. 정적 자원 관리 용이성:
    정적 자원 핸들러를 통해 이미지, CSS, JS 파일 등 정적 리소스를 손쉽게 제공할 수 있다. 이를 통해 사용자의 페이지 로딩 시간을 단축시키고, 캐시 설정을 통해 서버 부하를 줄일 수 있다.

느낀점:

  • 직관적인 구성의 중요성:
    스프링의 설정 파일을 작성하면서 느낀 점은, 애플리케이션의 구조를 직관적이고 유지보수하기 쉽게 구성하는 것이 얼마나 중요한지입니다. 모든 설정이 명확하게 정의되어 있으면, 여러 개발자가 참여하는 대규모 프로젝트에서도 개발의 일관성을 유지할 수 있습니다.

  • 편리한 선언적 설정:
    스프링 프레임워크의 선언적 방식(어노테이션 기반 설정) 덕분에, 복잡한 기능도 단순하게 관리할 수 있다는 점이 인상적입니다. 특히, 복잡한 코드 작성 없이 뷰 리졸버, CORS 설정을 한 줄로 설정할 수 있는 점이 매우 유용하다고 느꼈습니다.

  • 확장성과 유연성:
    정적 리소스 핸들러 설정이나 CORS 설정에서 느낀 점은, 특정 요구 사항에 맞게 기능을 확장하고 조정할 수 있다는 점입니다. 작은 프로젝트에서 대규모 프로젝트로 확장할 때 이러한 유연성이 매우 중요한 역할을 합니다.

목표:

  1. Spring MVC 설정 심화 학습:
    앞으로 Spring MVC의 설정과 동작 원리에 대해 더 깊이 학습하고자 합니다. 이를 통해 복잡한 웹 애플리케이션에서도 최적의 구조를 설계하고, 효율적인 성능을 낼 수 있도록 설정을 최적화하는 것이 목표입니다.

  2. CORS 및 보안 설정 최적화:
    CORS와 같은 보안 관련 설정을 더 이해하고, 실제 프로젝트에서 이를 어떻게 최적화할 수 있을지 고민할 것입니다. 특히 다양한 외부 클라이언트(모바일, 웹 등)와의 상호작용에서 보안을 강화하는 방법을 연구하고 싶습니다.

  3. 애플리케이션 성능 최적화:
    정적 자원 관리와 같은 설정을 통해 애플리케이션의 성능을 어떻게 더 최적화할 수 있을지에 대해 목표를 세웠습니다. 특히 캐싱 메커니즘리소스 제공 전략을 통해 사용자 경험을 개선하고, 서버 부하를 줄이는 방법을 모색할 것입니다.

  4. 스프링 MVC 및 REST API 통합:
    이 코드를 기반으로, 스프링 MVCREST 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 설정, 정적 자원 핸들러 등을 구성한다.
각 줄의 자바 문법 및 스프링 개념을 설명하겠다.

1. 패키지 선언

package org.project.backend.config;
  • 기능:
    해당 클래스가 org.project.backend.config 패키지에 속해 있음을 선언한다.
  • 논리 구조:
    자바 클래스들을 논리적으로 그룹화하여 코드의 가독성과 유지보수성을 높인다.
  • 상호작용:
    같은 패키지나 외부 패키지의 클래스들과 협력하여 애플리케이션 기능을 구성한다.

2. 클래스 임포트

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와 관련된 클래스들이 포함되어 있다.
  • 논리 구조:
    외부 라이브러리의 클래스를 가져와서 필요한 기능을 확장하거나 커스터마이징할 수 있다.
  • 상호작용:
    스프링 MVC의 다양한 기능(뷰 리졸버, CORS 처리, 리소스 핸들링 등)과 상호작용한다.

3. 클래스 선언 및 어노테이션

@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 파일을 로드하여 외부 설정을 사용할 수 있게 한다.
  • 논리 구조:
    이 클래스는 MVC 설정 파일로 작동하며, 주요 설정을 구성한다.
  • 상호작용:
    애플리케이션 전반의 설정과 상호작용하며, Spring MVC의 핵심 설정 파일로 기능합니다.

4. 뷰 리졸버 설정

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    resolver.setOrder(1);
    return resolver;
}
  • 기능:
    JSP 파일을 처리하기 위한 뷰 리졸버를 설정한다. 요청이 들어오면 해당 JSP 파일로 연결한다.
    • setPrefix("/WEB-INF/views/"): JSP 파일이 위치한 경로를 설정한다.
    • setSuffix(".jsp"): JSP 파일 확장자를 설정한다.
    • setOrder(1): 리졸버의 우선순위를 설정한다.
  • 논리 구조:
    클라이언트 요청이 들어오면, 뷰 리졸버가 해당 JSP 파일로 요청을 전달하여 HTML 응답을 생성한다.
  • 상호작용:
    JSP 파일과 상호작용하여 사용자의 요청을 처리하고 HTML 페이지를 반환한다.

5. CORS 설정

@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;
}
  • 기능:
    CORS(Cross-Origin Resource Sharing) 설정을 구성한다. 외부 도메인의 리소스에 접근할 때 허용 여부를 설정하는 기능이다.
    • addAllowedOriginPattern("*"): 모든 출처를 허용한다.
    • addAllowedMethod("*"): 모든 HTTP 메서드(GET, POST, PUT 등)를 허용한다.
    • addAllowedHeader("*"): 모든 요청 헤더를 허용한다.
    • setAllowCredentials(true): 인증 정보를 허용한다(쿠키, 토큰 등).
  • 논리 구조:
    CORS 설정을 통해 외부 클라이언트에서 서버에 접근할 수 있는 권한을 제어한다.
  • 상호작용:
    외부 클라이언트(예: React, 모바일 앱)와 상호작용하여 특정 도메인에서만 접근할 수 있도록 한다.

6. 핸들러 매핑 검사기

@Bean
public HandlerMappingIntrospector mvcHandlerMappingIntrospector() {
    return new HandlerMappingIntrospector();
}
  • 기능: 핸들러 매핑 설정을 검사하는 객체를 생성한다. 요청이 들어왔을 때, 이를 처리할 적절한 핸들러를 찾아주는 역할을 한다.
  • 논리 구조: 요청에 대한 처리를 담당할 핸들러를 동적으로 선택할 수 있다.
  • 상호작용: 스프링 MVC의 요청 처리 흐름에서, 요청을 처리할 핸들러를 찾아주는 역할을 한다.

7. 정적 자원 핸들러 등록

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/resources/")
            .setCachePeriod(3600);

    registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/");
}
  • 기능: 정적 리소스(이미지, CSS, JS 파일 등)를 제공하는 핸들러를 등록한다.
    • addResourceHandler("/resources/**"): /resources/ 경로에 대한 요청을 처리한다.
    • addResourceLocations("/resources/"): 해당 경로에 있는 정적 자원을 제공하도록 설정한다.
    • setCachePeriod(3600): 1시간 동안 캐시를 유지하도록 설정한다.
    • addResourceHandler("/static/**"): /static/ 경로에 있는 정적 자원을 처리한다.
    • addResourceLocations("classpath:/static/"): 클래스패스 내 /static/ 디렉토리에 있는 자원을 제공한다.
  • 논리 구조: 정적 자원을 제공하는 핸들러를 설정하여 이미지, CSS, JS 파일 등 클라이언트가 요청하는 정적 파일을 제공할 수 있다.
  • 상호작용: HTML 페이지와 연관된 정적 자원(JS, CSS, 이미지 파일)들과 상호작용하여 클라이언트에게 필요한 리소스를 제공합니다.

결론:

이 코드는 Spring MVC 애플리케이션에서 뷰 리졸버, CORS, 정적 리소스 핸들링 등을 설정하는 주요 설정 파일이다. @Configuration, @EnableWebMvc 등의 어노테이션을 통해 Spring MVC 기능을 활성화하고, 뷰 리졸버를 통해 JSP 파일을 처리하며, CORS 설정을 통해 외부 도메인에서 서버에 접근할 수 있는 권한을 제어한다. 정적 자원 핸들러는 이미지, CSS, JS 파일과 같은 정적 리소스를 효과적으로 관리할 수 있게 한다.

0개의 댓글