Spring boot React

source code 는 아래 github 에서 받을 수 있습니다.
https://github.com/nanbean/springReact
해당 source code 받지 말고 아래대로 차근 차근 scratch 부터 만들어 보는 것을 추천합니다.

# 해당 source code 를 통해서 동작성을 빠르게 확인하려면,
$ git clone https://github.com/nanbean/springReact.git lcms
$ cd lcms
$ mvn clean install
$ java -jar target/lcms-0.0.1-SNAPSHOT.jar
후
browser 에서 http://localhost:8080/ 접속하면 됩니다.

Bootstrap 제작

spring 에서 제공하는 기본을 이용해서 skeleton code 를 만드는 과정입니다.

1. https://start.spring.io 에서 Gropu 에 com.lge, Artifact 에 lcms 입력, Web Dependencies 추가해서 Generate Project

2. 다운 받은 파일을 특정 폴더(spring-react)에 압축 풀기

tree 구조는 아래와 같습니다.

jeongsim.kim@ubuntu-n:~/work/lcms$ tree
.
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── lge
    │   │           └── lcms
    │   │               └── LcmsApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── lge
                    └── lcms
                        └── LcmsApplicationTests.java

14 directories, 6 files

기본 Controller 추가

Rest API 를 추가하는 작업입니다. (/api/hello)

1. src/main/java/com/lge/lcms/HelloController.java 파일 생성

package com.lge.lcms;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.Date;
 
@RestController
public class HelloController {
    @GetMapping("/api/hello")
    public String hello() {
        return "Hello, the time at the server is now " + new Date() + "\n";
    }
}

2. 실행

$ mvn spring-boot:run

3. 아래 curl 로 정상 동작 여부 확인 (다른 터미널에서)

$ curl http://localhost:8080/api/hello
Hello, the time at the server is now Tue Jan 29 14:41:10 KST 2019

React 추가

Front-end 로 React 를 사용하기 위해서 facebook 에서 만든 create-react-app 을 이용해서 React bootstrap 을 만드는 과정입니다.

1. 최상위 디렉토리에서 아래와 같이 frontend React Application 추가 (mvn spring-boot:run 종료하고)

$ create-react-app frontend

create-react-app 이 설치되어 있지 않다면?

$ npm install -g create-react-app

React 에 API 연결 추가

Front-end 인 React App 에서 spring 으로 Rest API 를 호출하여, 페이지에 그려주는 코드를 작성하는 것입니다.

1. frontend/src/App.js 파일을 아래와 같이 수정

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
 
class App extends Component {
    state = {};
 
    componentDidMount() {
        setInterval(this.hello, 250);
    }
 
    hello = () => {
        fetch('/api/hello')
            .then(response => response.text())
            .then(message => {
                this.setState({message: message});
            });
    }
 
    render() {
        return (
            <div className="App">
                <header className="App-header">
                    <img src={logo} className="App-logo" alt="logo" />
                    <h1 className="App-title">{this.state.message}</h1>
                    <p>
                        Edit <code>src/App.js</code> and save to reload.
                    </p>
                    <a
                        className="App-link"
                        href="https://reactjs.org"
                        target="_blank"
                        rel="noopener noreferrer"
                    >
                        Learn React
                    </a>
                </header>
            </div>
        );
    }
}
 
export default App;

Maven 으로 React Packaging 추가

maven 을 통해서 Front-end 인 React 를 build 하는 것입니다.

1. pom.xml 파일에 아래와 같이 plugin 추가(build/plugins 하위에 추가하면 됩니다.)

		<plugin>
			<groupId>com.github.eirslett</groupId>
			<artifactId>frontend-maven-plugin</artifactId>
			<version>1.6</version>
			<configuration>
				<workingDirectory>frontend</workingDirectory>
				<installDirectory>target</installDirectory>
			</configuration>
			<executions>
				<execution>
					<id>install node and npm</id>
					<goals>
						<goal>install-node-and-npm</goal>
					</goals>
					<configuration>
						<nodeVersion>v8.9.4</nodeVersion>
						<npmVersion>5.6.0</npmVersion>
					</configuration>
				</execution>
				<execution>
					<id>npm install</id>
					<goals>
						<goal>npm</goal>
					</goals>
					<configuration>
						<arguments>install</arguments>
					</configuration>
				</execution>
				<execution>
					<id>npm run build</id>
					<goals>
						<goal>npm</goal>
					</goals>
					<configuration>
						<arguments>run build</arguments>
					</configuration>
				</execution>
			</executions>
		</plugin>

2. mvn clean install 이 정상적으로 되는지 확인 (Error 가 뜨는지 안 뜨는지?)

$ mvn clean install

3. tree 구조 확인

frontend 하위에 build 가 정상적으로 생성되는지?(maven 이 npm 을 호출해서 build 를 잘 했는지 확인)

$ tree frontend/build
frontend/build
├── asset-manifest.json
├── favicon.ico
├── index.html
├── manifest.json
├── precache-manifest.18b2b7a023755c5bb0bcd527b6c170b9.js
├── service-worker.js
└── static
    ├── css
    │   ├── main.24e815be.chunk.css
    │   └── main.24e815be.chunk.css.map
    ├── js
    │   ├── 1.fa92c112.chunk.js
    │   ├── 1.fa92c112.chunk.js.map
    │   ├── main.21cc7467.chunk.js
    │   ├── main.21cc7467.chunk.js.map
    │   ├── runtime~main.229c360f.js
    │   └── runtime~main.229c360f.js.map
    └── media
        └── logo.5d5d9eef.svg

4 directories, 15 files

Spring boot jar 에 React 추가

maven 을 통해서 만들어진 Front-end 리소스들을 jar 에 추가하는 작업입니다.

1. pom.xml 에 plugin 추가

			<plugin>
				<artifactId>maven-antrun-plugin</artifactId>
				<executions>
					<execution>
						<phase>generate-resources</phase>
						<configuration>
							<target>
								<copy todir="${project.build.directory}/classes/public">
									<fileset dir="${project.basedir}/frontend/build"/>
								</copy>
							</target>
						</configuration>
						<goals>
							<goal>run</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

2. mvn clean install 이 정상적으로 되는지 확인 (Error 가 뜨는지 안 뜨는지?)

$ mvn clean install

3. jar 파일에 public resource 가 정상적으로 포함되어 있는지 확인

$ jar tvf target/lcms-0.0.1-SNAPSHOT.jar | grep public
     0 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/
     0 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/
     0 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/media/
     0 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/css/
     0 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/
   306 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/manifest.json
322072 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/1.fa92c112.chunk.js.map
  1041 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/service-worker.js
  7959 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/main.21cc7467.chunk.js.map
  2828 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/css/main.24e815be.chunk.css.map
  1502 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/runtime~main.229c360f.js
  1706 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/main.21cc7467.chunk.js
   606 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/precache-manifest.18b2b7a023755c5bb0bcd527b6c170b9.js
   779 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/asset-manifest.json
  2062 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/index.html
  2671 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/media/logo.5d5d9eef.svg
  3870 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/favicon.ico
   984 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/css/main.24e815be.chunk.css
  7996 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/runtime~main.229c360f.js.map
112436 Tue Jan 29 15:00:30 KST 2019 BOOT-INF/classes/public/static/js/1.fa92c112.chunk.js

실행 확인

Front-end 와 Back-end 가 정상적으로 동작하는지 확인하는 것입니다.

1. java 로 실행 확인

$ java -jar target/lcms-0.0.1-SNAPSHOT.jar 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)
...

2. browser 에서 정상 동작 확인

Zsh, Oh My ZSH 사용하기

zsh 설치

$ sudo apt install zsh

oh my zsh 설치

// curl 을 통해 설치
$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
// wget 을 통해 설치
$ sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
// 둘 중 하나를 고르면 되고, 해당 내용은 https://ohmyz.sh/ 에 가이드가 있음

Oh My ZSH Theme 변경

$ vi ~/.zshrc
// ZSH_THEME 부분을 변경
ZSH_THEME="agnoster"

Garmin Watch Face 수정

Motivation

최근 Garmin Watch Face 로 Crystal을 사용하고 있는데, 한글이 출력되면 더 사용하기 좋을 것 같다는 생각에, 한글을 추가해 보았다.

한글이 지원되지 않는 Crystal Watch Face
한글이 지원되는 Crystal Watch Face

개발 환경 설정

Eclipse 설치 (생략)

Connect IQ SDK 설치

https://developer.garmin.com/connect-iq/sdk/

PATH 설정

export PATH=$PATH:path/to/connectiq-sdk/bin

Eclipse Plug-in 설치

  1. In Eclipse, click the Help menu
  2. Choose Install New Software…
  3. Click the Add… button
  4. Add https://developer.garmin.com/downloads/connect-iq/eclipse/ to the Location field and click Add
  5. Check the box next to Connect IQ in the Available Software window and click Next
  6. Review the license agreement and click Finish
  7. Once the installation completes, restart Eclipse

SDK 설치

  1. In Eclipse, click the Connect IQ menu
  2. Choose Open SDK Manager
  3. Browse to or specify a path to a directory where the SDK will be saved
  4. Click the Download button next to the latest SDK release
  5. Review the license agreement, and click Agree
  6. Once the download completes, click Yes when prompted to use the new SDK version as your active SDK
  7. Close the SDK Manager

Eclipse 에서 디버깅, 실행

Start Simulator

Connect IQ -> Start Simulator

Run

Run -> Run As -> Connect IQ App

개발 참고 사항

Font 관련

Bitmap font 생성

  • http://www.angelcode.com/products/bmfont/ 에서 설치
  • Font Setting 에서 Font 선택, 사이즈 선택
  • Export Options 에서 Texture 를 png 로 변경
  • 화면에서 추출할 모든 글자 선택
  • Visualize 로 확인
  • Save bitmap font as… 후 nanum-gothic-kor-24.fnt 형태로 저장
  • 각각의 사이즈(16, 20, 24, 26, 28, 39) 별로 모두 fnt, png 파일 생성

Bitmap font 복사

각각의 Resource directory 에 복사할 필요가 있음

Font Resource 반영

XML 파일 수정이 필요함 (https://github.com/warmsound/crystal-face/pull/154/files 를 참고할 것)

References

Synergy 의 대안 Barrier

2대의 PC를 사용하고 있고, 1개의 키보드 마우스만 이용해서 2대를 조작하고 싶다면, 대부분 Synergy를 사용하고 있을 것이다. 나도 6년가량 Synergy를 사용하고 있었는데, 최근 개발 환경을 Ubuntu 18.04로 업그레이드하면서 무료로 사용하던 Synergy(이전 버전의 Synergy는 Open Source이다.) 가 제대로 동작하지 않아서 대안을 찾아보게 되었다.

여러 글들과 사용 경험들을 참고해서 골랐는데, 내가 찾은 대안은 Barrier이다. Barrier는 Synergy Fork이고 기능이 대부분 동일하기 때문에 쉽게 갈아탈 수 있는 장점이 있다. 게다가 github 에서 잘 유지보수되고 있다는 점도 엄청난 장점이다. Barrier는 https://github.com/debauchee/barrier 에서 확인할 수 있다.

Building on Linux

sudo apt update && sudo apt upgrade
sudo apt install git cmake make xorg-dev g++ libcurl4-openssl-dev \
                 libavahi-compat-libdnssd-dev libssl-dev libx11-dev \
                 libqt4-dev qtbase5-dev
cd barrier
./clean_build.sh
cd build
sudo make install  # installs to /usr/local/

Window Binary

https://github.com/debauchee/barrier/wiki

Synergy vs Barrier

  • Pros
    • Synergy는 Window 버전에서 한영키 문제가 있어서 새롭게 빌드를 해줘야 하는 불편함도 있었는데(무료 버전에서.. 정식 버전은 사용해보지 않아서..), Barrier 는 해당 버그가 없다.
    • Synergy 에서는 SSL 이 안되었는데(무료 버전에서), Barrier는 SSL 이 된다.
  • Cons
    • 딱히 없는 것 같다.

서버 설정

Ubuntu 18.04 sever version 64bit 설치

Node.js 설치

# Using Ubuntu
curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install build-essential

Nginx php mysql 설치

sudo apt update
sudo apt install nginx
sudo apt install mysql-server
sudo mysql_secure_installation
sudo apt install php-fpm php-mysql
sudo vi /etc/nginx/sites-available/nanbean.net
sudo ln -s /etc/nginx/sites-available/nanbean.net /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo service nginx restart

FTP 설치

sudo apt-get install vsftpd
sudo vi /etc/vsftpd.conf
# enable write permission
write_enable=YES

Node.js app configuration with pm2

npm install pm2 -g
pm2 start myapp -n name
# start pm2 on boot
pm2 startup
# excute the last printed sentence
# save current process list
pm2 save

HTTPS 설정

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
sudo certbot --nginx -d nanbean.net
# check auto renewal
sudo certbot renew --dry-run

crontab 설정

dynamic dns

기타

sudo apt install ffmpeg

oracle cloud

$ sudo fallocate -l 4G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile

$ sudo swapon /swapfile
$ sudo vi /etc/fstab
// add below
/swapfile swap swap defaults 0 0