ZEYO 개발 환경

back-end : JAVA Spring Framework, JPA, QueryDSL, MyBatis, Maven, Gradle, MariaDB, Redis, GitLab, Jenkins
front-end : Vue.js, Nuxt, AngularJS, ES6+

1. ZEYO 서비스 배치도(AWS 기준)

1.GIF

2. API 서버 배포 과정 (언어 : SPRING BOOT)

API 서버 배포시 꼭 해야 할 설정들

  • Java 8 설치(리눅스 우분투)

    1
    2
    3
    4
    sudo apt-get update
    sudo apt-get install java-1.8.0-openjdk-devel.x86_64
    sudo /usr/sbin/alternatives --config java (환경변수 설정)
    java -version
  • 로컬에서 해당 프로젝트 디렉토리 위치에 build를 수행하자

    1
    mvn clean package (maven)
  • 생성한 jar 파일을 해당 리눅스 서버에 옮기고 배포하기
    일단 배포 스크립트를 만들어서 해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// deploy.sh 파일을 생성
vi {디렉토리}/deploy.sh

#################deploy.sh##################

REPOSITORY={jar파일을 이동한 디렉토리 주소}
cd $REPOSITORY

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f {jar파일명}})

echo "$CURRENT_PID"

if [ -z $CURRENT_PID ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -2 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 5
fi

echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep '{jar파일명}' | tail -n 1)

echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &

nohup java -Dspring.profiles.active={환경변수명} -jar $REPOSITORY/$JAR_NAME --logging.file={로그 파일 저장 디렉토리}/{로그명}.log &
##################################

./deploy.sh (실행하자)

3. SPRING BOOT 구조 및 파악

아키텍처

2.png

  • Controller Layer : UI 에서 요청을 받고 응답을 전달 및 유효성 검사
  • Service Layer : 비즈니스 로직을 구현
  • Repository Layer : 데이터베이스에서 가져올 쿼리를 구현. JPA를 이용하는 경우 정해진 규칙에 따라서 메소드를 사용하거나, 만들어놓으면 적절한 쿼리를 수행할 수 있습니다.
  • Domain Layer : 실제로 데이터베이스 물리 테이블과 1:1 매핑이 되어 바인딩 되어 있습니다.
    • entity : JPA가 관리하는 클래스로, 해당 클래스를 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스
    • request : request 전용 DTO(Data Transfer Object)
    • response : response 전용 DTO(Data Transfer Object)

4. SPRING BOOT 프로젝트 파일 구조

3.GIF

.1 key_store

  • ZEYO 인증 방식은 JWT TOKEN 방식으로 처리하게 된다.
  • JWT TOKEN 생성시 더 신뢰성 있고 안전한 방식을 위하여 비대칭키를 이용한 서명을 하게된다.
    • public_key : 공개키
    • server.jks : 비밀키
  • 이미지와 같이 rest 프로젝트에 공개키, 비밀키이 있는데 key_store에 보관되는 2개 파일은 보관용이고 rest(Resource Server) 경우 공개키만 사용(복호화)합니다. 실질적으로 공개키 보관되고 사용하는 곳은 “application-{profile}.yml” 파일에 있습니다.
  • zeyo-authorization 프로젝트 경우 server.jks(비밀키) 통해 TOKEN을 암호화 해서 zeyo-rest 프로젝트에 있는 public-key로 복호화 한다.
  • 비대칭키 생성 방법 : https://syh8088.github.io/JKS

.2 mapper

  • Spring MyBatis XML SQL문 정의 및 관리

.3 error.properties

  • controller단에 해당 API 호출시 유효성 validation 정책에 어긋날 경우 400대 에러 response 호출 같이 에러 메세지 보낼때 사용되는 파일

.4 application-{profile}.yml

  • 외부 설정 파일 (애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의할 수 있는 기능을 말한다.)

4.GIF
.1 controller

  • UI 에서 요청을 받고 응답을 전달 및 유효성 검사 담당

.2 model

  • entity : JPA가 관리하는 클래스로, 해당 클래스를 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스
  • request : request 전용 DTO(Data Transfer Object)
  • response : response 전용 DTO(Data Transfer Object)

.3 repository

  • {파일명}Mapper - Spring MyBatis Interface
  • {파일명}Repository - Spring JPA 에서 제공하는 Repository 라는 인터페이스를 정의해 해당 Entity 의 데이타를 사용 할 수 역활
  • {파일명}RepositoryCustom, {파일명}RepositoryImpl - JAP Querydsl 담점인 Custom Repository와 JpaRepository를 상속한 Repository가 기능을 나눠서 의존성으로 받아야한다는 점, 이를 보완하기위해 Spring Data Jpa에서는 Custom Repository를 JpaRepository 상속 클래스에서 사용할 수 있도록 기능을 고안
    5.png

.4 service

  • 비지니스 로직 담당

5. JPA 중심 개발

현재 ZEYO REST 경우 JPA, QueryDSL(동적쿼리시), MyBatis(그외 복잡한 서브쿼리 사용시) 사용되어 있습니다.

※ JPA란? (https://blog.woniper.net/255)

JPA 구동 방식

8.GIF

ZEYO REST 비지니스 로직 경우 가장 핵심인 JPA 의존 및 활용하면서 개발되어져 있습니다.

이중 비즈니스 로직 경우 대부분 서비스단 에서 처리하는 하고 있습니다. : 트랜잭션 스크립트 패턴(http://martinfowler.com/eaaCatalog/transactionScript.html)

.1 기존 SQL 중심 유지보수 및 개발시

6.GIF

.2 JPA 이용시

7.GIF


Copyright 201- syh8088. 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.

💰

×

Help us with donation