Spring 파일, 프로필

김정훈·2024년 7월 15일

Spring

목록 보기
14/24

스프링 파일 업로드(MultipartFile)

1. multipart란?

<form> 속성 : enctype="multipart/form-data"

multipart

  • 일반 양식 데이터의 파트
  • 파일 데이터(바이너리 데이터) 파드

기본 양식 content-type
application/x-www-form-urlencoded

2. web.xml 설정

  • 한 파일당 파일의 최대 크기(용량) 제한 설정
  • 최대 업로드 파일의 최대 크기(용량) 제한 설정
  • 메모리(LAM)적재 파일의 최대 크기(용량) 제한 설정 : 크기 제한 이상은 임시폴더에 저장후 업로드 되어진다.
<multipart-config>
	<max-file-size>20971520</max-file-size> <!-- 한 파일당 최대 20mb-->
    <max-request-size>41943040</max-request-size> <!-- 최대 업로드 파일 용량 -->
	<max-file-size>20971520</max-file-size>  <!-- 20MB 이하까지 메모리(lam)에 적재, 이상은 임시폴더에 파일저장하고 업로드 --> 
</multipart-config>

3. JSP

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form method="post" autocomplete="off" enctype="multipart/form-data">
    제목 : <input type="text" name="subject"><br>
    파일 : <input type="file" name="file"><br>
    <button type="submit">전송하기</button>
</form:form>

4. MultipartFile 인터페이스

@RequestPart
동일 이름의 여러 파일을 전송하는 경우 : MultipartFile[]와 같은 배열로 주입

@Controller
@RequestMapping("/file")
public class FilController {

    @GetMapping("/upload")
    public String upload(){
        return "file/upload";
    }

    @ResponseBody
    @PostMapping("/upload")
    public void uploadPs(@RequestPart("file") MultipartFile file){
		String name = file.getOriginalFilename();
        log.info(name);
    }

}
@ResponseBody
@PostMapping("/upload")
public void uploadPs(@RequestPart("file") MultipartFile file){
    String name = file.getOriginalFilename();
    log.info(name);

    File uploadPath = new File("/Users/oreo/Desktop/uploads/"+name);
    try {
        file.transferTo(uploadPath);
    }catch(IOException e){
    }
}

5. addResourceHandlers 설정

  • 파일 업로드 경로 -> 서버 접근 URL로 연결
@Configuration
public class FileConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //파일 업로드 정적 경로 설정
        registry.addResourceHandler("/uploads/**")
                .addResourceLocations("file:/Users/oreo/Desktop/uploads/");
    }
}

프로필

개발환경과 배포환경이 다르기 때문에, 설정을 달리해야한다.
프로필을 사용하여 환경마다 설정을 달리할 수 있도록 구현.

1. @Profile

2. spring.profiles.active

지정된 환경 변수 값 👉 @Profile에 설정시 @Bean을 프로필에 따라서 달리 생성하는 기능

1) web.xml

매번 xml파일을 수정해야한다는 번거로움이 있어서 잘 사용하지않음.

<init-param>
  	<param-name>Spring.profiles.active</param-name>
  	<param-value>dev</param-value>
</init-param>

2) 배포 파일 실행시

java -jar -Dspring.profiles.active=프로필이름

3) 환경 변수를 조회해서 DB 계정 비밀번호 설정

System.getEnv("환경 변수명")

DBconfig

@Configuration
@EnableTransactionManagement
@MapperScan("org.choongang")
@EnableJdbcRepositories("org.choongang")
public class DBConfig extends AbstractJdbcConfiguration {

    @Bean(destroyMethod = "close")
    public DataSource dataSource(){
        DataSource ds = new DataSource();

//        연결 설정 S
        ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
        ds.setUsername(System.getenv("db.username")); //환경변수
        ds.setPassword(System.getenv("db.password")); //환경변수
//        연결 설정 E

//        커넥션 풀 설정 S
        ds.setInitialSize(2);
        ds.setMaxActive(10);
        ds.setTestWhileIdle(true);
        ds.setMinEvictableIdleTimeMillis(1000 * 60);
        ds.setTimeBetweenEvictionRunsMillis(1000 * 5);
//        커넥션 풀 설정 E
        return ds;
    }
    ...
}

환경 변수를 조회해서 개발환경설정 변경

@Configuration
@EnableWebMvc
@ComponentScan("org.choongang")
@Import({DBConfig.class, MessageConfig.class, InterceptorConfig.class, FileConfig.class})
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {

	...
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
        String fileName = "application";
        String profile = System.getenv("spring.profiles.active");
        fileName += StringUtils.hasText(profile) ? "-" + profile : "";
        /**
         * spring.profiles.active = dev
         * -> application-dev
         * Spring.profiles.active = prod
         * -> application-prod
         */

        PropertySourcesPlaceholderConfigurer conf = new PropertySourcesPlaceholderConfigurer();
        conf.setLocations(new ClassPathResource(fileName));

        return conf;
    }
}

application-prod.properties

file.upload.path=/Users/oreo/uploads2/

프로퍼티 파일을 이용한 프로퍼티 설정

MvcConfig

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
    PropertySourcesPlaceholderConfigurer conf = new PropertySourcesPlaceholderConfigurer();
    conf.setLocations(new ClassPathResource("application.properties"));
    
    return conf;
}

application.properties

file.upload.path=/Users/oreo/Desktop/uploads/

1. @Configuration

public static PropertySourcesPlaceholderConfigurer properties() {
		PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
		configurer.setLocations(
				new ClassPathResource("db.properties"),
				new ClassPathResource("info.properties"));
		return configurer;
}

2. @Value("${프로퍼티 키값}")

주입되는 값은 전부 문자열

FileConfig

@Configuration
public class FileConfig implements WebMvcConfigurer {
    
    @Value("${file.upload.path}")
    private String uploadPath; 
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //파일 업로드 정적 경로 설정
        registry.addResourceHandler("/uploads/**")
                .addResourceLocations("file:" + uploadPath);
    }
}

FileController

@Slf4j
@Controller
@RequestMapping("/file")
public class FilController {

    @Value("${file.upload.path")
    private String uploadDir;

    @GetMapping("/upload")
    public String upload(){

        return "file/upload";
    }

    @ResponseBody
    @PostMapping("/upload")
    public void uploadPs(@RequestPart("file") MultipartFile file){
        String name = file.getOriginalFilename();
        log.info(name);

        File uploadPath = new File(uploadDir+name);
        try {
            file.transferTo(uploadPath);
        }catch(IOException e){
        }
    }

}
profile
안녕하세요!

0개의 댓글