๐Ÿ”ฎSpring

[Spring Boot] ํŒŒ์ผ ์—…๋กœ๋“œ ๋งŒ๋“ค๊ธฐ -1-

harry.93 2022. 3. 20. 21:25
๋ฐ˜์‘ํ˜•

๋Š˜ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด์ง€๋Š” ๋ชปํ–ˆ๋˜ ํŒŒ์ผ ์—…๋กœ๋“œ ๋งŒ๋“ค๊ธฐ๋ฅผ ํ•ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค.

์ž‘์—… ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. Java 11

2. Spring Boot 2.6.4

3. Gradle 7.2 

4. War ๋ฐฐํฌ ์‚ฌ์šฉ

 

FileUpload / Download ์„œ๋น„์Šค๋Š” ๋‹ค์Œ์„ ์ „์ œ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ํ•œ๋‹ค.

 

1. Front์—์„œ MultipartRequest๋กœ ํŒŒ์ผ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค. ํผ ํƒœ๊ทธ ๋‚ด์—์„œ Submitํ•˜๋Š” ๋ฐฉ์‹์„ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

2. Back์—์„œ๋Š” ์ด๋ฅผ ๋ฐ›์•„ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ , ๊ด€๋ จ ์ •๋ณด๋ฅผ DB์— ์ €์žฅํ•œ๋‹ค.

3. ์„œ๋ฒ„ ๊ฒฝ๋กœ์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์—๋Š” ํ™•์žฅ์ž ๋“ฑ์— ๋Œ€ํ•ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ์‹ค์‹œ ํ•œ๋‹ค.

4. ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” ๋‹ค์ค‘ ์—…๋กœ๋“œ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„์š” ์‹œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋กœ๋“œ ํ•œ๋‹ค.

5. ์ถ”ํ›„, 1-4 ๊ตฌํ˜„ ์‹œ Form Submit ์™ธ์— Axios ๋“ฑ์„ ์ด์šฉํ•œ ajax ํ˜ธ์ถœ๋กœ๋„ ๊ตฌํ˜„์„ ์‹ค์‹œํ•œ๋‹ค. 
๊ทธ๋ฆฌํ•˜๋ฉฐ, ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ „๋ถ€ ์ง€์›ํ•˜๋„๋ก ํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ๋Š” ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.

 

์šฐ์„  ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์„ธํŒ… ๋ฐ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๋Š” vs code์—์„œ initailize gradle project๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ–ˆ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ ํ–ˆ๋‹ค.

 

- build.gradle

plugins {
	id 'org.springframework.boot' version '2.6.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
	id 'war'
}

group = 'com.file'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	
	// dev tool ( ์ •์  ๋ฆฌ์†Œ์Šค ์žฌ์‹œ์ž‘์—†์ด ์ ์šฉ )
	implementation group: 'org.springframework.boot', name: 'spring-boot-devtools'

	// jstl 
	implementation group: 'javax.servlet', name: 'jstl', version: '1.2'

	// jasper
	implementation group: 'org.apache.tomcat', name: 'tomcat-jasper', version: '9.0.56'
}

tasks.named('test') {
	useJUnitPlatform()
}

 

- application.yml

spring:
    application:
        name: file-upload-test
    servlet:
        multipart:
            location: /Users/dk/Documents/GitHub/Library/Spring/FileUpload/SpringBoot/example/src/main/resources/upload
    mvc:
        view:
            prefix: /WEB-INF/views/
            suffix: .jsp

 

- indexController.java

package com.file.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

@RestController
public class IndexController {

    /*
     * @GetMapping("/")
     * public ModelAndView index() {
     * return new ModelAndView("/index.html");
     * }
     */

    @GetMapping("/")
    public ModelAndView index2() {
        return new ModelAndView("/index");
    }

}

 

- FileUploadController.java

package com.file.example.controller;

import com.file.example.service.FileUploadService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartRequest;

@RestController
public class FileUploadController {

    @Autowired
    FileUploadService fsvc;

    @PostMapping("/upload.do")
    public void upload(MultipartRequest req) {
        System.out.println("๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ [LOG] : " + req + "๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ");
        fsvc.save(req);
    }
}

 

- FileUploadService.java - FileStorageService ์ƒ์†.

package com.file.example.service;

import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

import com.file.example.ifc.FileStorageService;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;

@Service
public class FileUploadService implements FileStorageService {

    @Value("${spring.servlet.multipart.location}")
    private String uploadPath;

    @Override
    public void init() {

    }

    @Override
    public void save(MultipartRequest req) {
        MultipartFile file = req.getFile("singleFile");
        try {
            if (file.isEmpty()) {
                throw new Exception("ERROR : file is empty");
            }
            Path root = Paths.get(uploadPath);
            System.out.println("๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ [LOG] : " + root + "๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ");
            System.out.println("๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ [LOG] : " + uploadPath + "๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ");
            if (!Files.exists(root)) {
                try {
                    Files.createDirectories(Paths.get(uploadPath));
                } catch (Exception e) {
                    throw new Exception("ERROR : can't makr dir");
                }
            }
            try {
                InputStream is = file.getInputStream();
                Files.copy(is, root.resolve(file.getOriginalFilename()), StandardCopyOption.REPLACE_EXISTING);
            } catch (Exception e) {
                throw new Exception("ERROR : can't makr dir");
            }
        } catch (Exception e) {
            throw new RuntimeException("ERROR : can't save file !");
        }
    }

}

 

- FileStorageService.java

package com.file.example.ifc;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;

public interface FileStorageService {
    void init();

    void save(MultipartRequest req);

}

 

์šฐ์„  ์ด ์ •๋„๊นŒ์ง€๋งŒ ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ•ด๋ณด์•˜์„ ๋•Œ๋Š”, ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค. application.yml ์˜ ๊ฒฝ๋กœ๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ ๊ฒฝ๋กœ๋กœ ์ž„์‹œ๋กœ ์žก์•˜๋‹ค. ๋งŒ์•ฝ ํ•ด๋‹น ํ™˜๊ฒฝ์ด ์šด์˜์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด, ์—…๋กœ๋“œ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณณ์˜ ๊ฒฝ๋กœ๋ฅผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์‚ฝ์ž…ํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค. 

 

๋ฒ ์ด์Šค๋งŒ ์žก์•„๋†“๊ณ , ์ฒœ์ฒœํžˆ ์Šคํ… ๋ฐ”์ด ์Šคํ…์œผ๋กœ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ด๋‹ค.

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•