본문 바로가기

Dot Programming/Spring Clone

[스프링 웹앱 프로젝트 #13] 프론트엔드 라이브러리 설정

14. 프론트엔드 라이브러리 설정

WebJar vs NPM
 > 개인적으로는 WebJar보다는 NPM 선호
 > WebJar는 라이브러리 업데이트가 느리다. 심지어 올라오지 않은 라이브러리도 많다.

스프링 부트와 NPM
 > src/main/resource/static 디렉토리 이하는 정적 리소스로 제공한다. (스프링 부트)
 > package.json에 프론트엔드 라이브러리를 제공한다.
 > 이 둘을 응용하면, 즉 static 디렉토리 아래에 package.json을 사용해서 라이브러리를 받아오면 정적 리소스로 프론트엔드 라이브러리를 사용할 수 있다.

빌드는 어떻게?
 > Gradle의 build.gradle (or 메이븐 pom.xml)을 빌드 할 때 static 디렉토리 아래에 있는  pacakge.json도 빌드하도록 설정해야 한다.
 > 빌드를 안하면 프론트엔드 라이브러리를 받아오지 않아서 뷰에서 필요한 참조가 끊어지고 화면이 제대로 보이지 않는다.

부트스트랩을 스프링부트에 npm으로 설정해보자.

 

 

프론트엔드 라이브러리 설정하기

1. /static 경로로 이동

 

2. npm install 하기

npm ini (= init)

 

 

package.json 생성 확인하기 

 

3. bootstarp 설치

npm install bootstrap

 

4. jquery 설치

 

 

위의 과정이 정상적으로 진행되었으면 package.json은 다음과 같이 구성된다.

 

뷰 화면 적용

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
    <meta charset="UTF-8">
   
   <title>Dot Study</title>
   
   
   <!-- bootstrap 설정 -->
   <link rel="stylesheet" href=/node_modules/bootstrap/dist/css/bootstrap.min.css" />
   
   <style>
        .container{
            max-width: 100%;
        }
    </style>
</head>
<body class="bg-light">
<nav th:fragment="main-nav" class="navbar navbar-expand-sm navbar-dark bg-dark">
  ...

</nav>

<div class="container">
   ...

</div>


   <!-- jquery, bootstrap bundle 설정 -->
<script src="/node_modules/jquery/dist/jquery.min.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>

<script type="application/javascript" th:fragment="form-validation">
    (function () {

    }())
</script>

</body>
</html>

 

 

 

git.ignore 파일에 아래 코드 추가 

### NPM ###
src/main/resources/static/node_modules

 

빌드는 어떻게?

build할 때 static 디렉토리 아래에 있는  pacakge.json도 빌드하도록 설정해야 한다.
 > 빌드를 안하면 프론트엔드 라이브러리를 받아오지 않아서 뷰에서 필요한 참조가 끊어지고 화면이 제대로 보이지 않는다.

 

Gradle의 경우

build.gradle

> gradle의 경우에는 마땅한 자료를 찾기 어려웠다... 이래서 maven을 쓰는건가 싶었다...

plugins {
	//https://github.com/siouan/frontend-gradle-plugin
	id "org.siouan.frontend-jdk11" version "4.0.0"
}


apply plugin: 'org.siouan.frontend-jdk11'

frontend {

	nodeDistributionProvided = false

	nodeInstallDirectory = file("${project.projectDir}/src/main/resources/static/node")

	packageJsonDirectory = file("${project.projectDir}/src/main/resources/static")

	nodeVersion = '15.3.0'

	assembleScript = 'run build'

	cleanScript = 'run clean'

	checkScript = 'run check'
}

 

 

 

> ./gradlew clean을 하면 아래와 같은 에러가 발생하는데 몇시간 죽썼지만 고치질못했다;

   일단은 작동은 되어서 스킵하겠다. (git issue에 등록)

> Task :cleanFrontend FAILED
npm ERR! missing script: clean

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/ijong-won/.npm/_logs/2020-11-30T13_33_47_045Z-debug.log

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':cleanFrontend'.
> Process 'command '/bin/sh'' finished with non-zero exit value 1

 

Maven의 경우

pom.xml

           <plugin>
                <groupId>com.github.eirslett</groupId>
                <artifactId>frontend-maven-plugin</artifactId>
                <version>1.8.0</version>
                <configuration>
                    <nodeVersion>v4.6.0</nodeVersion>
                    <workingDirectory>src/main/resources/static</workingDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>install node and npm</id>
                        <goals>
                            <goal>install-node-and-npm</goal>
                        </goals>
                        <phase>generate-resources</phase>
                    </execution>
                    <execution>
                        <id>npm install</id>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                        <phase>generate-resources</phase>
                        <configuration>
                            <arguments>install</arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

 

 

접근 경로 에러 발생

그런데 실행하면 아래와 같이 에러가 발생한다.

csrf 토큰때처럼 Spring Security 관련 버그이다.

 

 

이미지파일을 첨부할 때 SecurityConfig에 아래와 같이 static파일 접근을 허용한 코드가 있다.

@Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }

 

그런데 atCommonLocations()는 흔히 말하는 위치로 아래에 있는 경로만 해당된다.

 

요청 자체가 /node_modules로 접근하기 때문에 해당 경로를 넣어주면 된다.

@Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
                .mvcMatchers("/node_modules/**")  // /node_modules/** 도 무시
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations());
    }

 

 

설정에 /node_modules를 추가하니 정상적으로 작동하는 것을 확인할 수 있다.

 

 


참고

인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발