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

    ๋ฐ˜์‘ํ˜•

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

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

    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
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€