취미로 음악을 하는 개발자

[Spring Boot] 외부 jar 사용하기 (FileUpload, Json) 본문

공대인/Spring[Boot]

[Spring Boot] 외부 jar 사용하기 (FileUpload, Json)

영월특별시 2019. 8. 29. 15:43
728x90

만약 Webjar에서 제공되지 않는 외부 jar파일을 사용하기 위해서는 어떻게 해야할까?


: 답은 단순하게 직접 추가해서 사용하는 수밖에 없다. 


Gradle에서는 build.gradle 파일에 외부 중앙 저장소와 라이브러리를 명시하기 때문에 홈페이지에서 .jar 파일을 사용자가 직접 다운로드할 필요가 없어 매우 편리하다.


하지만 때로는 중앙 저장소에 존재하지 않는 라이브러리 의존성을 추가해야하는 상황이 발생하기도 한다.

이럴 때에는 프로젝트에 /libs 디렉토리를 생성하고 추가할 라이브러리의 jar 파일을 복사한다.


/libs 디렉토리에 위치한 모든 라이브러리를 의존성 추가를 하고싶으면 아래와 같이 명시하며, 이것을 로컬 프로젝트 의존성 추가라고 한다.

1
compile fileTree(dir: 'libs', include: ['*.jar'])
cs



프로젝트 생성



json-simple-1.1.1.jar 다운로드

cos.jar 다운로드, 맨 아래에 download 부분에 파일을 클릭하면 된다.




코드 구현


// build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
plugins {
    id 'org.springframework.boot' version '2.1.7.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'war'
}
 
group = 'com.study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
 
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
 
repositories {
    mavenCentral()
}
ext['tomcat.version'] = '8.5.38'
 
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'javax.servlet:jstl'
    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
cs



// application.properties, * 각각의 Multipart를 구분짓기 위해 색으로 구분했습니다.

1
2
3
4
5
6
server.port = 8081
# JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
 
spring.servlet.multipart.enabled=false
cs


[6번 줄]                    

파일 업로드와 관련해서 스프링부트에 포함된 Multipart 필터가 Multipart 메시지가 처리하도록 미리 설정되어 있다.

com.oreilly.servletMultipartRequest 객체를 사용하여 Multipart 메시지를 처리하려고 했지만

이미 스프링의 Multipart 필터에 의해 처리되었기 때문에 이를 처리할 request가 사라져서 에러가 발생한다.

그것을 방지하기 위한 설정 코드이다.


// fileForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html; charset=UTF-8">
<title>example</title>
</head>
<body>
    <form action="uploadOk" method="post" enctype="multipart/form-data">
        파일 : <input type="file" name="filename"> <br />
        <input type="submit" value="File Upload">
    </form>
</body>
</html>
cs


uploadOk 메소드를 처리하는 form만들어 파일을 업로드하는데 타입은 multipart/form-data로 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.study.springboot;
 
import java.util.Enumeration;
 
import javax.servlet.http.HttpServletRequest;
 
import org.json.simple.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
 
@Controller
public class MyController {
 
    @RequestMapping("/")
    public @ResponseBody String root() throws Exception {
        return "FileUpload";
    }
    
    @RequestMapping("/uploadForm")
    public String uploadForm() {
        return "FileUpload/fileForm";
    }
    
    @RequestMapping("/uploadOk")
    public @ResponseBody String uploadOk(HttpServletRequest request) {
        int size = 1024 * 1024 * 10// 10M
        String file = "";
        String oriFile = "";
        
        JSONObject obj = new JSONObject();
        
        try {
            String path = ResourceUtils.getFile("classpath:static/upload/").toPath().toString();
//            System.out.println(path);
 
            MultipartRequest multi = new MultipartRequest(request, path, size,
                                    "UTF-8"new DefaultFileRenamePolicy());
            System.out.println("111111");
            Enumeration files = multi.getFileNames();
            String str = (String)files.nextElement();
            
            file = multi.getFilesystemName(str);
            oriFile = multi.getOriginalFileName(str);
            
            obj.put("success"new Integer(1));
            obj.put("desc""업로드 성공");
        } catch (Exception e) {
            e.printStackTrace();
            obj.put("success"new Integer(0));
            obj.put("desc""업로드 실패");
        }
        
        return obj.toJSONString();
    }
}
cs


[38번 줄]

'static/upload' 폴더를 저장용으로 지정.


[41~48번 줄]

Multipart에서 읽어낸 파일 이름과 그 파일을 저장


[35, 58번 줄]

Json 파일로 읽어낼 것이므로 Json타입으로 객체를 만들었다.


* 원래 서비스 단에서 해야하지만 간단한 예제라서 프론트 단에서 함.



결과 화면



/uploadForm에 들어가면 파일을 선택하고 업로드하는 창이 나오게 된다.

아무 파일이나 선택하고 업로드를 하면 아래와 같은 결과가 나온다.



보면 Json 형식에 맞춰서 출력이 뜬다.



그리고 프로젝트/bin/main/static/upload 폴더에 가면 업로드한 파일이 있는 것을 확인할 수 있다.



Comments