WebJars 사용하기 (BootStrap, jQuery)
WebJars는 클라이언트에서 사용하는 웹 라이브러리인 JQuery와 Bootstrap 등을 jar파일 안에 패키징한 것
즉, 프론트 라이브러리를 JAR 파일로 패키징하여 MAVEN 또는 GRADLE을 통해 관리할 수 있도록 해줌 => 기존의 cdn으로 파일들의 버전을 관리 하던것에 비해 버전 관리가 쉬워짐
사용방법
WebJars - Web Libraries in Jars
www.webjars.org
위 사이트에서 [classic선택] - [bootsrap 검색] & [jquery검색]
runtimeOnly("org.webjars:bootstrap:5.3.3")
runtimeOnly("org.webjars:jquery:3.7.1")
위 코드를 build.gradle의 dependencies에 추가하면됨
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="jakarta.tags.core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/webjars/bootstrap/5.2.3/css/bootstrap.min.css">
</head>
<body>
<p>
<button type="button" class="btn btn-lg btn-default">Default</button>
<button type="button" class="btn btn-lg btn-primary">Primary</button>
<button type="button" class="btn btn-lg btn-success">Success</button>
<button type="button" class="btn btn-lg btn-info">Info</button>
<button type="button" class="btn btn-lg btn-warning">Warning</button>
<button type="button" class="btn btn-lg btn-danger">Danger</button>
<button type="button" class="btn btn-lg btn-link">Link</button>
</p>
<script src="/webjars/jquery/3.6.4/jquery.min.js"></script>
<script src="/webjars/bootstrap/5.2.3/js/bootstrap.min.js"></script>
</body>
</html>
- bootstrap.css 추가
- script 태그로 jqeury.min.js와 bootstrap.mim.js 추가
외부 jar 사용하기
중앙 저장소의 라이브러리 의존성 추가
- Gradle에서 Java프로젝트 빌드시 포함할 외부 라이브러리는 아래와 같이 /build.gradle파일에 외부 중앙 저장소와 라이브러리를 명시함
- 홈페이지에서 .JAR파일을 사용자가 직접 다운로드할 필요가 없어 매우 편리함
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
로컬 프로젝트의 라이브러리 의존성 추가
- 중앙 저장소에 존재하지 않는 라이브러리의 의존성을 추가해야하는 상황일 때는 프로젝트에 /libs 등 사용자가 원하는 이름의 폴더를 생성하고 추가할 라이브러리의 .JAR파일을 복사
- /libs 디렉토리에 위치한 모든 라이브러리를 의존성 추가하고자 한다면 아래와 같이 명시
https://code.google.com/archive/p/json-simple/downloads
Google Code Archive - Long-term storage for Google Code Project Hosting.
code.google.com
위 링크 같은 곳에서 외부 라이브러리 파일(ex json 결과 쉽게 만들어줌) 다운받아서 /libs밑에 저장한 후
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
build.gradle에 위 코드 추가
JAR파일과 WAR파일의 차이점
- JAR파일은 파일 자체가 실행 가능한 애플리케이션이고 파일 안에 내장 톰캣 서버가 포함되어 있어 별도의 외부 웹 서버 설정 없이 바로 실행할 수 있음
- WAR파일은 패킹징된 Spring Boot 애플리케이션을 외부 웹서버( ex Tomcat, Jetty)에 배포해야함
Fileupload
spring boot 기본 기능을 이용한 파일 업로드 방법을 알아보자
우선 전체적인 구조는 아래와 같음

application.properties
#spring.servlet.multipart.enabled=true
# default : 1M
spring.servlet.multipart.max-file-size=2MB
# default : 10M
spring.servlet.multipart.max-request-size=20MB
fileform.jsp
<%@ 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>FileUpload</title>
</head>
<body>
<form action="uploadOk" method="post" enctype="multipart/form-data">
파일 : <input type="file" name="files" multiple="true"><br />
<input type="submit" value="File Upload">
</form>
</body>
</html>
- action: uploadOk = url 매핑
- method: 파일을 업로드해야하기 때문에 post
- Type: 일반 내용과 바이너리 파일이 동시에 같아 올라올 수 있게 multipart/form-data
- 업로드 되는 파일은 정적파일이기 때문에 static > upload에 저장
MyController.java
package com.study.springboot;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
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 jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.Part;
@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)
{
JSONObject obj = new JSONObject();
try {
String filePath = ResourceUtils
.getFile("classpath:static/upload/").toPath().toString();
System.out.println(filePath);
// Retrieves <input type="file" name="files" multiple="true">
List<Part> fileParts = request.getParts().stream()
.filter(part -> "files".equals(part.getName()) && part.getSize() > 0)
.collect(Collectors.toList());
for (Part filePart : fileParts) {
String fileName = Paths.get(filePart.getSubmittedFileName())
.getFileName().toString();
String dst = filePath + "\\" + fileName;
try (BufferedInputStream fin =
new BufferedInputStream(filePart.getInputStream());
BufferedOutputStream fout =
new BufferedOutputStream(new FileOutputStream(dst)))
{
int data;
while (true)
{
data = fin.read();
if(data == -1)
break;
fout.write(data);
}
}
catch(IOException e)
{
e.printStackTrace();
}
System.out.println("Uploaded Filename: " + dst + "<br>");
}
obj.put("success", "1");
obj.put("desc", "업로드 성공");
} catch (Exception e) {
e.printStackTrace();
obj.put("success", "0");
obj.put("desc", "업로드 실패");
}
return obj.toJSONString();
}
}