본문 바로가기

카테고리 없음

[Spring Boot] 예제로 배우는 스프링부트 입문 | etc

WebJars 사용하기 (BootStrap, jQuery)

WebJars는 클라이언트에서 사용하는 웹 라이브러리인 JQuery와 Bootstrap 등을 jar파일 안에 패키징한 것

즉, 프론트 라이브러리를 JAR 파일로 패키징하여 MAVEN 또는 GRADLE을 통해 관리할 수 있도록 해줌 => 기존의 cdn으로 파일들의 버전을 관리 하던것에 비해 버전 관리가 쉬워짐

 

사용방법

https://www.webjars.org/

 

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();
	}
}