db.BATCH_JOB_SEQ is not a SEQUENCE ..이런식으로 에러가 난다
알고보니 스프링 배치는 postgre나 oracle 처럼 시퀀스가 있는 DB에 지원하는거라

MariaDB에 적용하려면 별도 커스텀이 들어가야 한다.

 

아래링크 참고
https://github.com/spring-projects/spring-batch/wiki/Spring-Batch-5.0-Migration-Guide#ms-sqlserver

MariaDB에 쿼리적용

CREATE TABLE BATCH_JOB_INSTANCE  (
	JOB_INSTANCE_ID BIGINT  NOT NULL PRIMARY KEY ,
	VERSION BIGINT ,
	JOB_NAME VARCHAR(100) NOT NULL,
	JOB_KEY VARCHAR(32) NOT NULL,
	constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ENGINE=InnoDB;

CREATE TABLE BATCH_JOB_EXECUTION  (
	JOB_EXECUTION_ID BIGINT  NOT NULL PRIMARY KEY ,
	VERSION BIGINT  ,
	JOB_INSTANCE_ID BIGINT NOT NULL,
	CREATE_TIME DATETIME(6) NOT NULL,
	START_TIME DATETIME(6) DEFAULT NULL ,
	END_TIME DATETIME(6) DEFAULT NULL ,
	STATUS VARCHAR(10) ,
	EXIT_CODE VARCHAR(2500) ,
	EXIT_MESSAGE VARCHAR(2500) ,
	LAST_UPDATED DATETIME(6),
	constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
	references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ENGINE=InnoDB;

CREATE TABLE BATCH_JOB_EXECUTION_PARAMS  (
	JOB_EXECUTION_ID BIGINT NOT NULL ,
	PARAMETER_NAME VARCHAR(100) NOT NULL ,
	PARAMETER_TYPE VARCHAR(100) NOT NULL ,
	PARAMETER_VALUE VARCHAR(2500) ,
	IDENTIFYING CHAR(1) NOT NULL ,
	constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
	references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ENGINE=InnoDB;

CREATE TABLE BATCH_STEP_EXECUTION  (
	STEP_EXECUTION_ID BIGINT  NOT NULL PRIMARY KEY ,
	VERSION BIGINT NOT NULL,
	STEP_NAME VARCHAR(100) NOT NULL,
	JOB_EXECUTION_ID BIGINT NOT NULL,
	CREATE_TIME DATETIME(6) NOT NULL,
	START_TIME DATETIME(6) DEFAULT NULL ,
	END_TIME DATETIME(6) DEFAULT NULL ,
	STATUS VARCHAR(10) ,
	COMMIT_COUNT BIGINT ,
	READ_COUNT BIGINT ,
	FILTER_COUNT BIGINT ,
	WRITE_COUNT BIGINT ,
	READ_SKIP_COUNT BIGINT ,
	WRITE_SKIP_COUNT BIGINT ,
	PROCESS_SKIP_COUNT BIGINT ,
	ROLLBACK_COUNT BIGINT ,
	EXIT_CODE VARCHAR(2500) ,
	EXIT_MESSAGE VARCHAR(2500) ,
	LAST_UPDATED DATETIME(6),
	constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
	references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ENGINE=InnoDB;

CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT  (
	STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
	SHORT_CONTEXT VARCHAR(2500) NOT NULL,
	SERIALIZED_CONTEXT TEXT ,
	constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
	references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) ENGINE=InnoDB;

CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT  (
	JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
	SHORT_CONTEXT VARCHAR(2500) NOT NULL,
	SERIALIZED_CONTEXT TEXT ,
	constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
	references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ENGINE=InnoDB;

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 1 MINVALUE 1 MAXVALUE 9223372036854775806 INCREMENT BY 1 NOCACHE NOCYCLE ENGINE=InnoDB;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 1 MINVALUE 1 MAXVALUE 9223372036854775806 INCREMENT BY 1 NOCACHE NOCYCLE ENGINE=InnoDB;
CREATE SEQUENCE BATCH_JOB_SEQ START WITH 1 MINVALUE 1 MAXVALUE 9223372036854775806 INCREMENT BY 1 NOCACHE NOCYCLE ENGINE=InnoDB;



이제 에러가 사라졌다..!!

일단 나는 프론트는 스벨트킷을 쓰고, 백엔드는 스프링부트를 쓴다.
지금껏 Docker-compose 쓰는 것도, 설치하는 것도 귀찮아서 각각 따로 빌드하고, 푸쉬했는 데,
관리해야할 프로젝트가 많아지니 여간 귀찮은 게 아니다.

한번에 빌드 & 배포하는 것을 살펴보자.

1. 내 노트북의 지정한 경로에 deployment 폴더 생성, 하위폴더에 docker-compose.yml 파일 생성
해당 파일에 아래 스크립트 작성

version: "3.8"

services:
  java_rack:
    platform: "linux/amd64"
    build:
      context: "../spring_program/java_rack2"
      dockerfile: "Dockerfile"
    image: "ID/레포지토리명:latest"
    restart: unless-stopped
    ports:
      - "8081:8081"

  iot_rack:
    platform: "linux/amd64"
    build:
      context: "../svelte_program/iot_rack"
      dockerfile: "Dockerfile"
    image: "ID/레포지토리명:latest"
    restart: unless-stopped
    ports:
      - "3002:3002"

networks:
  default:
    driver: "bridge"

 

상황에 따라 특정 레포지토리가 선행되고 실행하는  depends_on, 프로젝트별 설정파일이 없을 경우 사용하는 env_file 등은 
각각 설정해보기로 한다.

 

사실 저것만 있으면 빌드만 되고, docker hub에 push를 해주진 않는다. 애석하게도 docker-compose에 자체 푸쉬기능은 없다.
그런경우를 대비해서, 별도 명령어 파일을 만들고 실행 시켜준다. 나의 경우 맥북에서 실행하므로, 아래 파일을 생성시켜준다.


2. docker-compose가 있는 경로에 deploy.sh 생성후, 아래 스크립트 기재

#!/usr/bin/env bash
set -euo pipefail

# (1) 빌드
echo "🛠️  Building images..."
docker-compose build

# (2) 푸시
echo "📤  Pushing images..."
# 서비스별로 image 이름을 지정
# docker-compose.yml 에 지정한 image 키와 동일해야 합니다.
docker push 계정명/레포지토리명:latest
docker push 계정명/레포지토리명:latest

echo "✅ Build & Push 완료"


3. docker-compose 실행

docker compose build


4. deploy.sh 실행

./deploy.sh

 

자.. 이제까지는 내 노트북에서 실행하던 환경이다. 이제 서버에서 push 받는 것도 한번에 받고, 한번에 실행하자.

5. 서버접근, docker pull 받기

docker compose pull


6. docker pull 받고, 실행하기

docker compose up -d

 
끝 ~ ! 

Let's encrypt 쓰고 있는데.. 세달마다 인증서 갱신해주려니 여간 귀찮은 일이 아니다. 
자동화를 해보자.

1. 갱신 설정 파일 생성

touch /usr/local/bin/certbot-monthly-renew.sh


2. 스크립트 입력 (나의 경우 Nginx를 사용하고 있는데, 실행중이면 갱신을 시켜주질 못해서 일시 중단 및 재시작처리해야함)

systemctl stop nginx
certbot renew --quiet --standalone
systemctl start nginx


:wq 입력후 종료

3. 갱신 명령 파일 생성

touch /etc/cron.d/certbot-renew


4. 스크립트 입력

// 매일 15시 45분에 실행
0 3 1 * * root /usr/local/bin/certbot-monthly-renew.sh


설정 끝. 아래는 실제 실행했는 지 체크하는 법이다.

5. 실행 로그 보는법

sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log




대략 이런식으로 실행하고.. 나의 경우 아직 종료까지 한달이하로 남지 않아서 renew를 실행하다 실패했다.

opencv 라이브러리를 깔고있는데 에러가 났다.
찾아보니 필수 라이브러리를 사전에 설치해야 에러가 안난다는거다.
그것에 필요한 모듈을 아래와 같이 적어놓는다.

 

 

sudo apt install -y libavformat-dev libavcodec-dev libavdevice-dev \
libavutil-dev libavfilter-dev libswscale-dev libswresample-dev \
pkg-config cmake build-essential python3-dev ffmpeg
libssl-dev


그와 더불어 이것도 오래되서 업데이트 해야 한단다.

pip install --upgrade pip
pip install --upgrade setuptools wheel

라즈베리파이에서 파이썬 라이브러리 설치하다가 다음과 같은 에러가 발생했다.


 

알아보니 라즈비안 정책상 파이썬 모듈로 전역설치를 못하게 막아두었단다. 
찾아보니 가상환경으로 바꾸어서 설치를 하라고 한다.

# 1. 가상환경 생성
python3 -m venv venv

# 2. 가상환경 활성화
source venv/bin/activate

# 3. 필요한 모듈 설치
pip install aiortc aiohttp opencv-python


위와 같이 실행하면 정상적으로 설치를 진행한다.



어느날 Xcode로 토이프로젝트를 진행하다 이제 깃허브에 올려야겠다싶어
터미널 단축키를 찾아봤는데 눈을 씻고 찾아도 없더라..
그런데 알고보니 Xcode엔 그냥 터미널을 지원 안한단다.
그런데 최대한 구글링을 해보니 흡사한 방법이 있어 적어본다.

결론은.. 윈도우 .bat 파일처럼 명령어를 사전에 적어놓고 실행하게끔 하면 된다.

 

1. 사전 명령어를 실행할 스크립트 파일 만들기

touch open_terminal.sh

 

2. 해당 파일접근

vi open_terminal.sh

 

Insert 키누르고, 아래스크립트 작성후에 :wq 작성후 엔터

#!/bin/zsh
open -a Terminal `pwd`

 

위의 #!/bin/zsh 부분은 bash일경우 #!/bin/bash로 바꾸어주면 된다. 실행할 프로그램을 선언하는 것이다.

이제 스크립트 준비는 끝났다.
이제 Xcode로 접근하자.

 

1. Xcode -> Behaviors -> Edit behaviors 접근  

 

 

2. 커스텀 Behavior 작성

 

좌측하단의 + 기호를 누르고 하단의 Run 항목에 체크를 하고 전에 작성한 스크립트를 넣는다.
이때 명령어를 직접 쓰는게 아니라 파일업로드하듯이 파일을 찾아 넣어야 한다.

 

위와 같이하면 해당 프로젝트경로를 가진 터미널을 바로 실행한다.

스벨트에서 객체 및 배열 반복하는 경우가 있어 예제를 작성한다.

  1. 배열 및 배열 안의 객체 반복
let  test_state1 = [1,2];
let  test_state2 = [{uid:1,name :'test1'},{uid:2,name :'test2'}];

{#each test_state1 as item} 
    <option value={item}>{item}</option>
 {/each}

{#each test_state2 as item} 
    <option value={item.uid}>{item.name}</option>
 {/each}
 

2.객체 반복

let  test_state = {"meat":"육류","fish":"어류"};

{#each Object.entries(test_state) as [key, value]}              
              <option value={key}>{value}</option>
{/each}

 

끝~!

 

 

개발환경에서 자바스크립트에 console.log 쓸 일이 매우많다. 지워주면 가장 좋지만,

개발하고 배포하고 개발하고 배포하고 하는 일들이 비일비재하기 때문에

너무 귀찮다.

vite를 활용하여 노출이 안되게 처리해주자.

  1. vite-plugin-remove-console npm 라이브러리 설치
 

vite-plugin-remove-console

A vite plugin that remove the types of console in the production environment. Latest version: 2.2.0, last published: a year ago. Start using vite-plugin-remove-console in your project by running `npm i vite-plugin-remove-console`. There are 8 other project

www.npmjs.com

 

npm i -- save vite-plugin-remove-console

 

2. vite.config.js(또는 .ts)

import { sveltekit } from '@sveltejs/kit/vite';
import  { defineConfig } from 'vite';
import removeConsole from "vite-plugin-remove-console";

export default defineConfig({
	plugins: [sveltekit(),removeConsole()],
  
	... 생략(서버 설정등)
  });
위의 plugins 에 removeConsole() 만 추가해주면 된다.

 

스벨트를 빌드해서 Docker 로 배포하려고 한다.

이때 설정하는 .dockerignore , Dockerfile 에 대해 설정하는 법을 작성해보고자 한다.

1) .dockerignore

node_modules
.svelte-kit

나의 경우 svelte-kit를 포함하고 있어서, svelte-kit를 사용하지 않는 사람은 생략해도 된다.

node_modules는 어차피 docker build를 할때 npm i 명령어로 install 하기 때문에 따로 건드리지 않는다.

2) DockerFile

# 이미지의 기반이 될 이미지 선택
FROM node:20.10.0

# 앱의 소스코드를 포함할 디렉토리 생성
WORKDIR /app

# package.json 파일을 복사한다. 만약 다시 빌드할 때 변경사항이 없을 경우 npm install까지 그냥 넘어간다.
COPY package.json /app


# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 앱 빌드
RUN npm run build


# 포트 설정
EXPOSE 3000

# 프로그램 실행
CMD ["npm","run","preview", "--", "--host"]

DockerFile의 경우 설정법이야 워낙 많지만.. 최소한의 것만 작성한다.

일단 나의 경우 vite를 썼기 때문에 npm run build를 적용하고 preview로 실행하는 데, 이때

포트가 0.0.0.0 으로만 켜지는 것을 방지하기 위해 --, --host를 추가적으로 작성해준다.

 

보통 프론트에서 백엔드 API 로 데이터 요청을 할때 같은 서버내에 프론트서버,백엔드서버 둘다 존재한다면

localhost.. 이런식으로 요청하거나 xxxx.co.kr 이런식으로 도메인을 따서 요청할 것이다.

그런 경우 .env 파일에 경로를 지정해서 import 해서 요청하는 방식을 적용할 것이다.

// .env 파일 
VITE_API_BASE_URL=http://localhost:8081
 
// api 요청 파일
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL;

	const login = (e : any) => { 
    	const url = `${apiBaseUrl}/sign-api/sign-in`
    }

 

위와 같은 식으로 말이다..

그러나 그것을 매번 소스코드에 입력하기도 귀찮고 보안상 그리 좋은 거 같지는 않다.

스벨트에 vite 를 적용했다면 다음과 같이 설정해보자

import { sveltekit } from '@sveltejs/kit/vite';
import  { defineConfig } from 'vite';

export default defineConfig({
	plugins: [sveltekit()],
	server: {
	  proxy: {
		'/api': {    
		  target: 'http://localhost:8081', 
		  changeOrigin: true,
		  rewrite: (path) => path.replace(/^\/api/, ''),
		},
	  },
	},
  });

위의 target은 실질적으로 백엔드 API 주소 를 말하며, '/api' 는 백엔드 API 주소를 치환하겠다는 말이다.

그럼 위 코드를 변경하면

// api 요청 파일
	const login = (e : any) => { 
    	const url = "/api/sign-api/sign-in"
  }

이런식으로

.env 파일이 필요 없어지고 긴 api 주소는 /api 문자열로 처리한다.

훨씬 깔끔한거 같다.

 

+ Recent posts