Spring/[Spring]Board(기본 게시판)

스프링 게시판 만들기 - 2(파일업로드 기능 추가, WebConfig ,WebMvcConfigurer)

Ms.Pudding 2022. 1. 13. 23:33

Configuration의 뜻 : 구성,세트, 컴퓨터 용어에서는 컴퓨터를 구성하는 세트라고 말함 

 

 

1.application.properties

 

사용자의 이미지 파일을 저장할 로컬 파일 경로를 적어준다.


server.file.upload.url = c:/파일이름/

 

 

2.config.WebConfig

config 디렉토리 만들고 WebConfig 클라스를 만들어줌 

 

1) 먼저 사용자의 요청을 받는 경로를 변수값으로 만들어보자

@Configuration
public class WebConfig implements WebMvcConfigurer{

	@Value("/istatic/file")
    private String istaticPath;
    
    @Value("${server.file.upload.url}")
    private String filePath;


}

WebMvcConfigurer 인터페이스 : Spring MVC패턴을 유용하게 사용할 수 있게하는 인터페이스이다.

Spring MVC 란 · Spring 프레임워크에서 제공하는 웹 모듈이다. · MVC 는 Model-View-Controller 의 약자로, http 요청 응답시 사용되는 패턴이다.

 

WebMvcConfigurer 인터페이스는 이렇게 생겼다.

public interface WebMvcConfigurer {
    default void configurePathMatch(PathMatchConfigurer configurer) {
    }

    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }

    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }

    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }

    default void addFormatters(FormatterRegistry registry) {
    }

    default void addInterceptors(InterceptorRegistry registry) {
    }

    default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }

    default void addCorsMappings(CorsRegistry registry) {
    }

    default void addViewControllers(ViewControllerRegistry registry) {
    }

    default void configureViewResolvers(ViewResolverRegistry registry) {
    }

    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }

    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }

    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }

    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }

    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }

    @Nullable
    default Validator getValidator() {
        return null;
    }

    @Nullable
    default MessageCodesResolver getMessageCodesResolver() {
        return null;
    }
}

위에 인터페이스로 구성되어있는 메소드들을 내가 상속받아 쉽게 오버라이드 하여 사용할 수 있다,

 

@Configuration 스트링부트에 이 클라스는 설정에 관련된 파일이라는 자격을 부여한다.

또한 @Configuration 어노테이션이 들어간 객체는 어노테이션을 토대로 스프링을 구성하겠다는 것이 되며, 

@Bean(의존성 주입 객체)을 하나 이상 포함하고 있는 것이 특징이다.

 

@Value("주소")

private String istaticPath;

주소값을 해당 변수에 값으로 넣겠다는 의미이다. 

 

 

2) 주소 경로를 기억해서 스프링에게 주소를 주기 ! 

 /**
     * 외부 폴더 주소 지정
     * @param registry
     */
@Override
public void addResourceHandlers(ResourceHandelerRegistry registry){
	registry.addResourceHandler(istaticPath + "**")
    .addResourceLocations("file:///"+filePath)
    .setCachePeriod(0)
    .resourceChain(true)
    .addResolver(new PathResourceResolver());

}

 

ResourceHandlers란 이미지,css,html등등 정적인 리소스에 대한 요청을 처리하는 것을 말한다. 즉 얘네들이 경로를 기억하고 있다가 스프링한테 주소를 알려준다.

addResourceHandler()

addResourceHandler에는 사용자의 요청을 Resource로 맵핑할 경로를 적어준다.  istaticPath/** 이하로 오는 모든 요청을  resourceHandler에서 처리하겠다는 의미이다.

addResourceLocations() 정적자원들의 위치를 저장하는 메소드 

setCachePeriod(0) 캐쉬 무한대로 형성 (캐시:데이터를 저장해 놓는 임시 저장소)

resourceChain(true) 캐쉬를 사용하겠다.

.addResolver(new PathResourceResolver()) PathReourceResolver는 위에 주어진 경로를 통해 리소스를 찾겠다는 객체이고 이것을 addResolver를 통해 addResourceHandlers기능에 추가시킨다.

따라서 이게 실행되면 저 경로를 통해 리소르를 등록하는 것이 가능해진다. 

 

3)인코딩설정 

 

/**
     * spring boot encoding 설정
     * @return
     */
    @Bean
    public Filter characterEncodingFilter() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");
        encodingFilter.setForceEncoding(true);
        return encodingFilter;
    }

@Bean 의존성을 주는 어노테이션 중에 하나이다 ! 내 메소드를 스프링 너에게 주겠다. @Configuration이랑 짝꿍 형태로 많이 씀 

CharacterEncodingFIlter() 이 객체는 spring에서 http로 오가는 파일들을 utf-8파일로 만들어주는데 도움을 준다.

주로 한국어 깨지지 말라구 씀

setForceEncoding(true) 강제 변경, 기존에 인코딩한게 있어도 내가 설정한 것으로 바꿔라

 

4)파일 업로드 용량제한 100메가

 @Bean
    public MultipartConfigElement multipartConfigElement() {

        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofMegabytes(100)); //파일 처리시 100메가 제한
        factory.setMaxRequestSize(DataSize.ofMegabytes(100)); //사용자가 100메가 이상던지면 에러
        return factory.createMultipartConfig();
    }

MultipartConfigFactory() 이 객체는 MultipartConfigElement을 받아올 수 있게 하는 객체이다.

MultiPartConfigElement 는 @MultipartConfig 어노테이션의 값을 나타낸다.

@MultipartConfig 어노테이션이란, Servlet클래스와 관련이 있는데,  서블릿의 인스턴스가 여러형태의 데이터 유형에 맞는 요청을 받는 것을 도와준다.

예를 들어 사용자가 이메일을 보낼때 text뿐만 아니라 강아지 이미지도 같이 보내고 싶다면 서로 다른 데이터 유형이 함께 요청되게 된다. 이럴때 다같이 요청되게 할 수 있도록 도와준다.

여기서 servlet 클래스란 http 요청-응답을 통해 받은 데이터들을 더 효율적으로 사용하기 위해 서버의 기능을 확장해주는  클래스이다.

factory로만 return하게 되면 클라스 인스턴스의 메소드를 가지고 있지 않다. 따라서 factory.createMultipartConfig()로 리턴해줘야한다.

 

 

 

 

5)파일전송 어떤걸 쓸지 정하자

 @Bean
    public MultipartResolver multipartResolver(){
        return new StandardServletMultipartResolver();
    }

MultipartResolver는 Multipart 형식으로 데이터가 전송된 이후, 해당 데이터를 스프링 MVC에서 사용할 수 있도록 변환해준다. 이때 표준형을 쓰겠다는 의미이다.

참고 : https://galid1.tistory.com/550 [배움이 즐거운 개발자]

참고 : https://stackoverflow.com/questions/48575191/where-are-the-default-methods-of-webmvcconfigurer 

 

Where are the default methods of WebMvcConfigurer

This is from WebMvcConfigurerAdapter, the official Spring documentation. Deprecated. as of 5.0 WebMvcConfigurer has default methods (made possible by a Java 8 baseline) and can be implemented

stackoverflow.com

java doc 도 참고 많이 함