728x90

개요

Postman Team 사용이 4명 이상일 경우 해당 기간 동안만 무료로 사용할 수 있어서 방안을 찾던 중 방안 중 하나인 API 명세서 만들어주는 Swagger를 설정 방법과 사용법에 대해 작성하려고 한다.

Swagger란?

Swagger를 사용하면 @어노테이션 코드 몇 줄 추가하여 간단하게 API별로 문서화 및 API테스트 가능한 UI 까지 제공하여 문서 작성 시간을 극도로 단축하여 개발에 집중할 수 있다.

Swagger 버전

Swagger는 버전별로 차이가 있다.

Swagger 3.x.x 이후 부터 접속 url 변경 등 2.x.x 와 3.x.x 는 차이점이 있으며 해당 프로젝트는 Swagger 2.9.2 사용한다.

Swagger 설정

  • Gradle에 Swagger 의존성을 추가해준다.
//swagger
	implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
	implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
  • Swagger 버전 호환 이슈 해결
    1. org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
    2. Caused by: java.lang.NullPointerException: null

Swagger 버전 호환 이슈로 위와 같은 오류가 발생했다.

해결법

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

application.yml이나 application.propertise에 위와 같은 코드를 작성한다.

  • Swagger config class 생성
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket restAPI() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("j2kb.ponicon.scrap")) // 특정 패키지경로를 API문서화 한다.
                .paths(PathSelectors.any()) // apis중에서 특정 path조건 API만 문서화 하는 2차 필터
                .build()
                .groupName("API 1.0.0") // group별 명칭을 주어야 한다.
                .useDefaultResponseMessages(false); // 400,404,500 .. 표기를 ui에서 삭제한다.
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot REST API test")
                .version("v0.0.1")
                .description("스크랩 JPA swagger api 입니다.")
                .build();
    }
}

useDefaultResponseMessages(false)를 사용하면 아래와 같은 화면이 출력되지 않는다.

적용 전

적용 후

private ApiInfo apiInfo()는 아래와 같은 Swagger 화면을 작성하는 메서드이다.

  • Swagger-ui 실행

현재 우리는 2.x.x 버전을 사용하므로 http://localhost:8081/swagger-ui.html

  • API에 Swagger @Annotation 추가
@Api(tags = "카테고리와 관련된 API") -> class
@ApiOperation(value = "카테고리 조회 API", notes = "UserId를 RequestParam으로 받아서 categoryService.categories 후 카테고리를 조회하는 역할을 합니다. /category/all?id=") -> Method
@ApiParam(value = "User의 id 값", example = "2") -> parameter
  • @Api tags : 해당하는 controller.java 에 대한 Title명칭 부여
  • @ApiOperation value : API에 대한 요약하여 작성 notes : API에 대한 자세한 설명 작성
  • @ApiParam value= 파라미터에 대한 설명 descriptionexample = 파라미터의 default 값이 있을 때 사용 required = true : 파라미터의 필수인지 표기 필수는 true, 아니면 false

위의 @Api 어노테이션을 통해 작성한 Swagger 화면

위의 @ApiOperation 어노테이션을 통해 작성한 Swagger 화면

위의 @ApiParam 어노테이션을 통해 작성한 Swagger 화면

Swagger 사용법

  • 위의 사진의 오른쪽 상단에 보면 Try it out이 있다. Try it out을 클릭한다.

  • 만약 Default값으로 값이 들어가 있다면 바로 Execute버튼을 클릭하면 실행이 된다. Default값 외의 다른 값으로 Test해보고 싶을 때는 다른 값을 넣어준다.

  • 위의 파라미터 값을 넣어서 실행한 화면이다.

단점

Swagger 코드가 들어가서 코드가 길어보이고 지저분해 보인다.

 

참고 블로그

https://velog.io/@dkatlf900/swagger

 

Swagger API DOC 구축부터 실행까지

Spring Boot REST API, Swagger 구축.

velog.io

 

728x90
728x90

전체적인 구성

  1. 로컬 PC에서 개발을 한 후 Github에 Push를 합니다.
  2. Github Repository 특정 branch에 push가 되면 Github Action이 동작을 시작합니다.
  3. Github Actions가 Github Container Registry에 소스를 받은 후 Docker 이미지로 빌드를 합니다.
  4. 빌드된 이미지를 EC2에 등록된 Runner가 복사합니다.
  5. 기존 이미지를 삭제하고 새로운 이미지로 실행을 합니다.

흐름도

  • 형상관리 : Git (Github)
  • 빌드 : Docker (Github Action)
  • 서버 : Linux (AWS EC2 micro)

순서

  • Docker로 로컬 테스트
  • Github Actions
  • AWS EC2 생성 및 Docker 설치
  • 자동 배포 테스트

IntelliJ에서 설정

  1. gradle에서 build bootJar 더블클릭하면 build 폴더에 libs에 .jar 파일 생성됨

스프링에서 libs에 스프링부트 2.5.0이후 plain.jar가 만들어지기때문에 꺼두었습니다.

jar {
    enabled = false
}

 

Docker로 로컬 테스트

  • Docker 이미지를 만들기 위해 프로젝트 루트에 Dockerfile을 아래와 같이 생성합니다.
FROM openjdk:11
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

# FROM : Docker Base Image (기반이 되는 이미지, <이미지 이름>:<태그> 형식으로 설정, java8로 코드를 작성했다면 11대신 8로 넣어줘야 합니다.)
# ARG : 컨테이너 내에서 사용할 수 있는 변수를 지정할 수 있다.
# COPY : 위에 선언했던 JAR_FILE 변수를 컨테이너의 app.jar로 복사한다.
# ENTRYPOINT : 컨테이너가 시작되었을 때 스크립트 실행
  • cd 명령어를 통해 jar 파일이 있는 곳으로 터미널 위치를 옮긴다. (cd build/libs)
  • 이미지를 생성 합니다.
docker build -t springio/scrap-spring-boot-docker .
# docker build -t {이미지명} .
  • 생성되었는지 확인
docker images

빌드가 완료되었다면 다음 명령어를 터미널에 입력해 springio/scrap-spring-boot-docker이 생성되었는지 확인한다.

  • 컨테이너 실행하기
docker run -d -p 5000:8080 springio/scrap-spring-boot-docker
# 현재 내 로컬에서 5000port 사용으로 8083으로 변경
  • 로컬에서 실행되는지 테스트


GitHub 설정

  • .dockerignore파일 작성
.idea/
*.iml
*.iws
target/
.sonar/
.sonarlint/
  • 프로필 우측에있는 화살표를 눌러 Settings에 들어간다.

  • Settings 제일 밑 하단에 Developer settings에 들어간다.

  • 왼쪽 메뉴에 Personal access tokens를 누르고 Generate new token 을 클릭한다.

  • 토큰의 유효기간과 권한을 설정합니다.

  • 유효기간은 최대 1년까지 가능합니다.
  • 권한은 workflow, write:packages, delete:packages를 선택합니다.
  1. Generate token을 누르면 토큰이 생성된다.
  2. 생성한 토큰을 복사해서 배포를 진행할 레파지토리로 이동한다.

상위 메뉴의 Settings에 들어가 왼쪽 하단 메뉴의 Secrets의 Actions에 들어간다.

왼쪽 상단에 있는 New repository secret을 누른다.

  • 이름을 지정하고 복사했던 토큰을 붙여넣어준다.

  • dockerHub USERNAME과 PASSWORD를 작성한다.

  • 아래와 같이 workflow 파일을 작성합니다.

이것은 Github Container Registry를 이용해서 docker를 빌드하고 서버에 푸시해주는 역할을 합니다.(.github/workflows/main.yml)

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 # 수정해야함
      with:
        arguments: build
    - name: Docker build
      run: |
       docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }}
       docker build -t spring-cicd .
       docker tag spring-cicd lusida0131/spring-cicd:latest
       docker push lusida0131/spring-cicd:latest
  deploy:
    needs: build  # build 후에 실행되도록 정의
    name: Deploy
    runs-on: [ self-hosted, label-go ] # AWS ./configure에서 사용할 label명
    steps:
      # 3000 -> 80 포트로 수행하도록 지정
      - name: Docker run
        run: |
          docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }}
          docker stop spring-cicd && docker rm spring-cicd && docker rmi lusida0131/spring-cicd:latest
          docker run -d -p 8080:8080 --name spring-cicd --restart always lusida0131/spring-cicd:latest

workflow파일 설명

on:
  push:
    branches: [ main ]
  • 여러 브랜치에서 개발 후 main 브랜치에 push or 병합될 때만 실행되도록 설정한다.
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
  • Workflow는 다양한 job으로 구성되고 위 yml은 build와 deploy라는 job을 생성한다.
  • runs-on은 어떤 OS에서 실행될지를 지정한다.
- uses: actions/checkout@v3
  • build의 step 첫 번째는 현재 상태의 소스코드를 가상의 컨테이너 안으로 checkout 해주는 역할
- name: Set up docker buildx
        id: buildx
        uses: docker/setup-buildx-action@v1
  • build의 step 두 번째는 가상의 컨테이너 안에 docker가 돌아갈 수 있는 환경을 설치하는 역할
- name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
  • build의 step 두 번째는 JDK 11을 설치한다.
- name: Docker build
      run: |
       docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }}
       docker build -t spring-cicd .
       docker tag spring-cicd lusida0131/spring-cicd:latest
       docker push lusida0131/spring-cicd:latest
  • build의 step 네 번째는 Secret에 설정해놓은 USERNAME과 PASSWORD로 도커허브에 로그인해서 Docker image를 만들고 push한다.
deploy:
    needs: build  # build 후에 실행되도록 정의
    name: Deploy
    runs-on: [ self-hosted, label-go ] # AWS ./configure에서 사용할 label명
    steps:
      # 3000 -> 80 포트로 수행하도록 지정
      - name: Docker run
        run: |
          docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }}
          docker stop spring-cicd && docker rm spring-cicd && docker rmi lusida0131/spring-cicd:latest
          docker run -d -p 8080:8080 --name spring-cicd --restart always lusida0131/spring-cicd:latest
  • Deploy는 Docker에 로그인 후 저장되어 있는 Docker image를 이용해 컨테이너를 실행시키는 역할
  • Docker run은 실행 중인 도커 컨테이너를 중지하고 이전 버전인 컨테이너와 이미지를 삭제 후 새로운 이미지로 컨테이너를 run하는 방식이다.
  • runs-on 중 self-hosted는 필수로 써야한다.(이 값을 설정해야 서버에 등록한 runner가 실행된다.)
  • 이 부분에서 어느 Runner(EC2)로 실행할지 지정해줘야 한다.

AWS EC2 생성 및 Docker 설치

  • EC2 보안그룹 편집, 규칙추가 버튼을 누르고 8081번 port를 추가
  • EC2에 Docker 설치 방법
sudo apt-get update 
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

apt가 HTTPS 프로토콜을 통해서 repository를 사용할 수 있도록 패키지를 설치한다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker의 공식 GPG key를 추가한다.

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

apt source list에 repository를 추가한다.

sudo apt-get update
$ sudo apt-get install docker-ce

apt package index를 update하고 Docker를 설치한다.

sudo service docker start # Docker 서비스를 시작합니다.
ps -ef|grep docker # 프로세스 확인 명령어
sudo usermod -a -G docker ubuntu # sudo를 사용하지 않고도 Docker 명령을 실행할 수 있도록 docker 그룹에 ec2-user를 추가합니다.
sudo usermod -aG docker $USER

docker ps 명령어를 실행했을때 아래와 같은 오류가 발생하면 docker.sock 권한을 바꾸어준다.

docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
sudo chmod 666 /var/run/docker.sock  # sudo를 사용하지 않고도 명령을 실행하게 docer.sock 권한을 바꾸어준다.
  • AWS에 Github Runner 설치

해당 Repository에 Settings에 들어가서 왼쪽 메뉴 Actions의 Runners를 클릭한다.

  • Download에 있는 내용, Configure을 EC2서버에 복사해서 한 줄씩 실행시킨다.

하단의 Configure도 위와 동일하게 실행

  • Enter the name of the runner group to add this runner to : 엔터
  • Enter the name of runner : 엔터
  • Configure 진행할 때 Enter any additional labels가 나오면 아래에 있는 label-go를 등록한다.
  • Enter name of work folder : 엔터
deploy:
    needs: build  # build 후에 실행되도록 정의
    name: Deploy
    runs-on: [ self-hosted, label-go ] # AWS ./configure에서 사용할 label명
  • Configure에 ./run.sh는 nohup으로 실행
nohup ./run.sh &
  • Runner 세팅이 끝나면 github의 Settings - Actions - Runner 메뉴에서 등록된 것을 확인할 수 있습니다.

참고 블로그

https://velog.io/@soosungp33/Github-Actions으로-AWS-EC2에-CICD-구축하기

 

Github Actions으로 AWS EC2에 CI/CD 구축하기

AWS EC2에 CI/CD 구축하기

velog.io

https://codegear.tistory.com/84?category=985388

 

배포자동화(CI/CD) - Github Actions/Nuxtjs/Docker/EC2

다음은 이 글의 유튜브 영상입니다. https://youtu.be/E3i9qt0SS-I 프로젝트를 진행할때 많은 시간을 들여야 하는 것 중에 하나가 바로 배포입니다. 형상관리(Git)에 커밋을 하고, 서버에 파일을 업로드

codegear.tistory.com

 

728x90
728x90

1 - 3. 스프링 부트 Mapper와 Mapper 오류, Mail 전송

오늘은 회원에 관한 코드들을 스프링에서 스프링 부트로 바꾸는 작업을 진행하였습니다. 코드를 가져와서 실행을 하던 중에 mapper를 찾지 못하는 에러가 발생했습니다. 


1. @Mapper 어노테이션


스프링에서 mybatis를 사용하는 방식은 SqlSession, SqlSessionTemplate을 설정하고 maper네임스페이스. id, parameter 등의 메서드를 통해 쿼리를 사용하였지만 스프링 부트, mybatis 3.0 이상에서는 sqlSessionTemplate을 설정하고, selectone 메서드를 사용하지 않고 @mapper 어노테이션을 이용해 메서드명과 xml 파일의 id를 매핑시켜 편리하게 사용할 수 있다.


mapper 인터페이스에 @Mapper 어노테이션을 붙여주니 해결되었다.

참고 블로그 : https://frozenpond.tistory.com/85

 

[spring] mapper 어노테이션을 통한 springboot, mybatis 세팅하기

spring boot로 프로젝트를 생성, Mybatis 연동하는 예제입니다. 스프링에서 mybatis를 사용하는 방식은 SqlSession, SqlSessionTemplate을 설정하고 selectOne(maper네임스페이스.id, parameter) 등의 메서드를 통..

frozenpond.tistory.com

 


2. 자바 명명규칙

진행하던 중에 프로젝트 패키지 이름이 바뀌고 클래스 이름 등 자바 명명규칙을 어긴 것들을 발견해서 경로들을 수정해주었다. 

참고 블로그 :  https://ozofweird.tistory.com/entry/Java-%EB%AA%85%EB%AA%85-%EA%B7%9C%EC%B9%99


왼쪽은 수정 전 오른쪽은 수정 후 사진이다.

또한 전에 진행했던 데이터 베이스 테이블들 이름이 너무 헷갈려서 명확하게 이름을 다시 지었다.

 


왼쪽은 수정 전 오른쪽은 수정 후 사진이다.


3. Mapper.xml (not found) 오류


유효성 검사를 실시하면 위와 같은 오류가 발생했다. 진짜 찾는데 3일 내내 찾았는데 못 찾았다. 공식문서와 수많은 블로그를 찾아봤는데 다해봤는데도 안됐다. 마지막 4일째 오류를 해결했다... 이유는 Mapper.xml 파일이 하나라도 오류가 나면 전체가 매핑에 실패해 오류가 난다.

mybatis.mapper-locations= mapper/*.xml

application.properties에 위에 코드를 추가시켜준다.


Jsp에서 Mybatis를 이용할 때 스프링 부트에서 만들어주는 resources에 mapper 밑에 Mapper.xml 파일을 추가시켜준다.


보통 Mapper를 찾지 못하는 오류는 mapper namespace의 경로가 잘못되었거나 Mapper.xml 파일의 id와 Mapper.java파일의 메서드 이름이 잘못된 오류이거나 오타이다.


4. 회원가입 인증 메일 전송

회원가입을 할 때 인증번호를 보내는 기능이 있었는데 구글 계정만 있으면 무료로 발송할 수 있는 Gmail SMTP Server를 이용했다. 메일전송은 MailSender 인터페이스를 상속받은 JavaMailSender를 사용해 구현하였습니다. 새로 스프링 부트에는 dependency와 설정이 빠져있어 오류가 발생했다.

implementation 'org.springframework.boot:spring-boot-starter-mail'

build.gradle dependencies에 위에 코드를 작성한다.



Gmail SMTP Server를 이용하려면 위와 사진과 같은 설정이 필요하다.

위의 설정은 application.properties에 추가 해줘야 한다.

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.username=gmail
spring.mail.password=password

잘되는것을 확인할 수 있다.


오늘의 회고

mapper 오류에 4일을 걸렷다ㅠㅠ 부트로 바꾸는 프로젝트를 진행하기 전에 제가 진행했던 프로젝트여서 코드 분석을 하지 않고 바로 진행했던 점이 문제로 다가왔다. 프로젝트를 끝낸지 7개월이라는 시간이 흘렀고 제가 작성하지 않은 코드들도 있어서 파악이 안되는 문제가 발생했다. 오늘 내일은 코드를 분석하는 작업을 진행하려고 합니다. 분석을 끝내고 위에 진행했던 코드들의 테스트 코드를 블로그에 작성하겠습니다.

728x90
728x90

오늘은 스프링 부트에서 MyBatis 연결을 하려고 합니다. 

1-2 스프링 부트 MyBatis 연결

1. 스프링 부트 MyBatis 설정

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
runtimeOnly 'mysql:mysql-connector-java'

build.gradle dependencies에 위의 코드를 추가시켜줍니다. 

# database
spring.datasource.url: jdbc:mysql://host:3306/DatabaseName?characterEncoding=utf8
spring.datasource.username: DatabaseName
spring.datasource.password: password
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver

# mybatis
mybatis.config=mybatis-config.xml
mybatis.type-aliases-package: com.example.demo.model
mybatis.mapper-locations: mapper/*.xml

application.properties에 위에 코드를 추가 시켜줍니다. url에는 자신의 포트번호와 데이터베이스 이름을 입력해주고, 유저네임과 패스워드도 자신과 맞게 입력해줍니다. mapper-locations도 mapper. xml이 있는 파일로 설정해주면 끝입니다.


2. DataBase연결 Test

이제 DataBase연결이 잘 되었는지 Test를 해보려고 합니다. Test에 dbTest페키지를 만들고 MyBatisTest class파일을 만들어 줍니다.

package com.skylife_Transformation.dbTest;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;

public class MyBatisTest {
    // MySQL Connector 의 클래스. DB 연결 드라이버 정의
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    // DB 경로
    private static final String URL = "jdbc:mysql://localhost:port/name?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false";
    private static final String USER = "name";
    private static final String PASSWORD = "password";

    @Test
    public void testConnection() throws Exception {
        // DBMS에게 DB 연결 드라이버의 위치를 알려주기 위한 메소드
        Class.forName(DRIVER);
        try {
            Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println(connection);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MyBatisTest파일에 위의 코드를 추가시켜줍니다. DB 커넥션이 제대로 생성되었는지를 출력해 확인해보는 과정입니다.

DB URL에 allowPublicKeyRetrieval은 클라이언트 옵션을 추가 하여 클라이언트가 서버에서 자동으로 공개 키를 요청할 수 있도록 하는 것입니다. default는 false이고 MySQL 8.0 이상은 이를 true로 지정하지 않을 시 public key retrieval is not allowed 에러가 발생할 수 있습니다. 그 뒤에 userSSL은 default는 true이고 false로 지정 시 SSL 사용을 막을 수 있다. 또한 하지만 개발, 혹은 테스트 중에서만 비활성화시키는 걸 추천합니다. 배포 시엔 useSSL를 false로 지정하기보단 SSL을 설정해주면 됩니다.


위의 Test코드를 실행하면 정상적으로 실행되는 것을 확인 할 수 있다. 


참고 블로그

https://doozi0316.tistory.com/entry/Spring-Boot-MyBatis-MySQL-%EC%97%B0%EB%8F%99-%EB%B0%A9%EB%B2%95


오늘의 회고

오늘은 MyBatis연결부터 연결 테스트 까지 진행하였습니다. URL을 입력할 때 allowPublicKeyRetrieval, userSSL은 기존에 사용했었지만 개념과 사용 이유에 대해 몰랐었는데 새롭게 알게 되었습니다. 리펙토링을 진행하다가 빠진 개념 등 다시 정리하면서 가야 될 것 같습니다.

728x90
728x90

header

🎬 Cobye 프로젝트

Cobye 코로나 종식을 희망하며 코로나 감염자 수에 대한 정보를 제공하는 서비스입니다.

프로젝트 기획 중 갑작스러운 코로나 감염자 수 증가로 인한 수도권 거리 두기 4단계가 진행되었습니다.
코로나 장기화와 지속적인 거리 두기로 인해 자영업자, 항공업종사자, 의료인, 의료종사자분 등 많은 피해가
지속되고 아이들은 태어나자마자 영문도 모른 채 마스크를 쓰고 있습니다.
코로나로 인해 더이상 피해입는 사람들이 발생하지 않고 하루빨리 코로나가 종식되길 희망하며 만든 프로젝트입니다.

 


📆 작업 기간

2021.7.21 ~ 2021.7.28 (8일간)

👩‍💻 팀원 구성

박현성, 김다슬, 고정현, 유승준

🎯 기술 스택

Front-end

HTML5 JavaScript Bootstrap jQuery

Back-end

Java Spring

Communication Tools

GitHub Discord Notion

📜 API 사용내역

1. 시도별 통계,성별/연령별 통계 시도별 API

2. 일별, 누적 확진자수 API

3. 선별진료소 카카오 맵 API

4. 예방접종 의료기관 안내 API


📄 기능 구현 사항

1. 메인 페이지(일별/누적 확진자)

  • (1) 실시간, 어제,누적 확진자, 누적 사망자 수
  • (2) 전일대비 확진자 비교(전일대비 증감률)
  • (3) 최근 10일 일별 코로나 확진 현황(그래프)
  • (4) 최근 코로나 누적 확진 현황

2. 지역/성별/연령별 확진자 페이지

  • (1) 성별/연령별 확진자
  • (2) 연령별 확진자 수(그래프)
  • (3) 연령별 확진률, 확진자, 사망률, 사망자(표)
  • (4) 지역별 확진자 수(그래프)
  • (5) 지역별 등록 일시, 전체 확진자, 전일대비, 격리중, 격리 해제 사망자, 지역 발생, 해외 유입(표)

3. 선별진료소 페이지

  • (1) 지도 (현위치, 선별진료소, 임시 선별진료소 정보)
  • (2) 길찾기

4. 예방접종 의료기관

  • (1) 거주지 검색
  • (2) 주변 병원 정보
  • (3) 지도 위치 정보
    5. (BETA)실시간 확진자
  • (1) 실시간 추가 확진자
  • (2) 어제 확진자
  • (3) 실시간 코로나 확진 현황(재난문자)
728x90
728x90

이전에 진행했던 팀 프로젝트 입니다. Git에서 Readme만 가지고 왔습니다.

 

header

🎬 SkyLife 프로젝트

SkyLife는 예매의 편리함과 커뮤니티를 제공하여 정보를 공유할 수 있게 만들어진 항공 예매 플랫폼 서비스입니다.

여행을 즐기는 사람들이 증가하게 되면서 자연스레 항공을 이용하는 빈도 또한 높아지고 있다.
그러나 항공 이용객의 증가 추세에 비하여 항공권 예매 플랫폼 서비스에는 미흡한 부분이 있다.
원하는 시간과 가격 등을 반영한 항공권 티켓을 예매하기위해 항공권을 검색하면
검색 결과에는 원치않는 정보가 많아 가독성이 떨어진다.
이에 항공권 검색 과정의 가독성을 높여 예매의 편리함을 제공하고,
주변 여행지 추천 및 커뮤니티를 제공하여 여행 준비의 편리함과
여행 지역의 정보를 공유할 수 있는 항공 예매 플랫폼 서비스를 만들고자 한다.


📆 작업 기간

2021.6.27 ~ 2021.7.20 (24일간)

👩‍💻 팀원 구성

박현성, 김다슬, 고정현, 유승준

🎯 기술 스택

Front-end

HTML5 JavaScript Bootstrap jQuery

Back-end

Java Spring MySQL

Communication Tools

GitHub Discord Notion

💻 DB 명세서

📜 API 사용내역

1. 카카오 로그인, 맵, 페이 API

2. 구글 로그인 API

3. 항공조회, 주차장조회 API(공공데이터포탈)


📄 기능 구현 사항 (유튜브로 이동)

1. 메인 페이지

  • (1) 항공편, 주차장 조회

2. 항공 조회 페이지

  • (1) 항공사별 카테고리
  • (2) 페이징 처리
  • (3) 찜 기능
  • (4) 카카오 페이 결제 API
  • (5) 결제 상세보기

구현기능 : 1, 2


구현기능 : 3, 4, 5


3. 회원가입, 로그인 페이지

  • (1) 이용약관 동의
  • (2) 아이디, 이메일 중복체크, 인증번호 인증
  • (3) 카카오 로그인 API
  • (4) 구글 로그인 API

구현기능 : 1, 2


구현기능 : 3


구현기능 : 4


4. 서비스 페이지(지도 API, 주차장 API)

  • (1) 지도 카테고리별 위치, 현재 위치 표시, 검색기능
  • (2) 각 공항별 주차장 실시간 정보

구현기능 : 1

구현기능 : 2


5. 게시판

  • (1) 글 작성, 수정/삭제, 상세보기, 조회수, 페이징 처리, 검색
  • (2) 댓글 작성, 수정/삭제, 페이징 처리

구현기능 : 1


구현기능 : 2


6. 공지사항

  • (1) 관리자 공지사항 추가, 수정/삭제

7. 마이 페이지

  • (1) 회원정보 조회/수정, 탈퇴
  • (2) 찜, 결제 목록 조회/삭제
  • (3) 목록 조회
  • (4) 카카오 페이 결제 API

8. 관리자 페이지

  • (1) 회원 목록 조회/삭제, 결제목록 조회/통계(월별 매출)
  • (2) 공지사항 작성, 수정, 삭제
  • (3) 게시글, 댓글 삭제

구현기능 : 1


구현기능 : 2


구현기능 : 3

728x90
728x90

개요

skyLife_Transformation 프로젝트로 기존에 스프링으로 진행했던 프로젝트에서 성능반복되는 코드고려하지 않고 그저 기능이 구현되고 돌아가기 위한 코드를 작성했던 프로젝트를 스프링 부트로 바꾸고 성능을 개선하는 프로젝트를 진행하려고 합니다. 천천히 단계별로 개선을 시켜나갈 생각입니다.


1-1 스프링에서 스프링 부트

1. 스프링 부트 프로젝트 만들기

https://start.spring.io/ 에서 스프링 부트를 쉽게 만들 수 있습니다.

저는 Build Tool은 Gradle, 스프링 부트 버전은 2.7.0, Packaging은 Jar, Java 11 버전을 사용할 것입니다.

Dependencies는 Lombok, Spring Web, Spring Security, MyBatis Framework, MySQL Driver, Spring REST Docs를 추가해주었습니다.


2.  스프링 부트 JSP를 위한 수정사항

일단 저는 기존에 진행했던 프로젝트에서 뷰는 수정을 하지 않으려고 합니다.

기존 프로젝트는 jsp로 진행을 해서 스프링 부트에서 jsp를 사용해주려면 설정해줘야 하는 것들이 있습니다.

우선 JSP도 템플릿 엔진이기 때문에 사용하기 위해서는 별도의 라이브러리가 필요합니다.

implementation "org.apache.tomcat.embed:tomcat-embed-jasper"

build.gradle를 파일에 dependencies 부분에 위의 코드를 추가를 해줍니다.

또한 JSP를 사용하기 위해서는 webapp와 WEB-INF 폴더를 포함한 구조로 프로젝트를 변경해야 합니다.

스프링 부트에서 사용하는 뷰 리졸버의 경로를 변경해야 합니다. 뷰 리졸버의 경로는 application.properties에서 변경합니다.

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp

위의 코드를 application.properties에 추가시켜줍니다. Controller 코드까지 작성하면 스프링 부트에서 jsp를 사용할 수 있습니다.

프로젝트의 메인화면입니다. 성공적으로 나오는 것을 확인할 수 있습니다.


3. 인텔리제이와 Github연동

인텔리제이 상단 메뉴에서 VCS를 누르고 Enable Version Control Integration을 클릭하면 밑에 사진과 같은 창이 나옵니다.

위의 창에서 ok를 클릭합니다.

위에서 ok를 클릭하면 상단 메뉴가 Git으로 바뀐 것을 확인하실 수 있습니다. Git 메뉴에서 Manage Remotes를 클릭하면 오른쪽 사진과 같은 창이 나옵니다. 오른쪽 사진에서 Add를 눌어주면 URL을 입력할 수 있는 밑에와 같은 창이 나옵니다.

URL 입력 창에 깃허브에서 레파지토리 주소를 복사해서 붙여 넣어줍니다.

밑에 Commit Message를 적을 수 있는 칸이 있고 Commit Message를 작성한 후 Commit and Push를 클릭해 주시면 깃허브에 잘 올라가는 것을 확인하실 수 있습니다.


오늘의 회고

오늘은 스프링 부트에서 프로젝트 메인화면을 띄우는 것부터 진행하였습니다. 뷰를 만들고 필요 없는 코드와 반복되는 코드들을 수정하고 프로젝트 설계부터 효율적인 방법을 고려해 진행할 예정입니다.

728x90

+ Recent posts