Post

aidaboat-1-openproject

작성 목적

  • rest api 개발 운영 서비스 신규 플젝
  • 수행 중 만나는 결정사항들을 기록함.

요구사항

기술적

  • spring boot, cloud인프라 운영환경 (뭘쓸까)
  • cicd
  • msa(스럽게, 모듈은 분리하여 DDD지향 하나 서버는 한대만사용자수가 초반에 크지 않으니)
  • gitlab
  • jdk 21

업무적

  • 별도 작성
  • 중개와 중계
    • seller, buyer 사이에서 3자가..
    • 중개 : seller-buyer 계약을 도와주고 수수료받음. ex) 공인중개사.
    • 중계 : seller 에게 물건사서 buyer에게 물건팜. 계약의 당사자가 됨.
  • https://www.joongang.co.kr/article/2811365#home

개발환경

  • openjdk 21
  • intellij idea (>= 2024.3 )
  • spring boot (>= 3.2)
  • gradle (>= 8.0)
  • 로컬 : windows,mac, 개발,운영: linux
  • gitlab remote repository : private. (커맨드 툴: sourcetree, git bash)
  • cicd : 구성 하는대로 업뎃 (jenkins standalone? gitlabCI?)
  • mariadb
  • 모듈방식
    • 작은서비스겠으나 DDD지향함
    • 모듈별 기능 배포 용이하게끔
    • 예)
      • 유저:8081
      • 기계정보(제품):8082
      • 주문:…
      • 결제:…
      • 계약:…
      • admin 등등
  • jira free plan
    • 100이메일 noti/일 제한
    • site url(xxxx.atlassian.net/… )변경 안됨
    • 그외 여러가지 기능제한 있겠으나, 써보면서 느껴보는걸로
    • 120일 액티베이션 모니터링한다함, 안그러면 deactivate 됨. 맞는번역인지 확실치 않음, 100일간 마늘먹듯이 매일 들어가야하나?

개발&운영 서버 환경

  • docker on linux
  • 그외 tbd

이 장에서의 수행 범위

  • new project (intellij idea)
  • create remote repo (gitlab)
  • jira 프로젝트 생성 (aidaboat.atlassian.net)
    • 본 문서 쓰면서 업뎃
  • application.yml 로컬개발운영config 나눔

new project


intellij

  • new project

gitlab

  • create project만 해줌

push, clone, gradle 시험


gitlab push

1
2
3
4
5
$ git init
Initialized empty Git repository in C:/.../aidaboat24/.git/
$ git remote add origin https://gitlab.com/gonnichiwa/aidaboat.git
$ git add .
$ git commit -m "initial commit"

sourcetree add

  • sourcetree 새탭(+)에서 Add
  • push

  • .gitIgnore 다른곳에 각자 흩어져있어도 함께 적용됨

전체 날리고 clone, gradlew 시험

1
2
3
$ git clone https://gitlab.com/gonnichiwa/aidaboat24.git
$ cd aidaboat24
$ gradlew build

user 모듈 생성

  • 로그인 api를 담당
  • (intellij)new - module
  • spring-starter-web만 추가
  • 그외 더 필요한것들 ctrl+shift+a, edit starters 띄워 추가
  • core모듈 따로 빼서 통합 고민중
  • 좀더 진행하고 해도 무방해보임

config setting

  • application.yml, application-local.yml, application-dev.yml, application-prod.yml
  • 운영 config정보는 운영서버에 숨겨놓고 외부에서 쓰고 싶다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.aidaboat.user;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class UserApplication {
    private static final String APP_CONFIG_LOCATION = "spring.config.location="
            + "classpath:application.yml"
            + ",optional:file:./config/application-prod.yml"; // TODO: CD 작업시 배포 테스트

    public static void main(String[] args){
        new SpringApplicationBuilder(UserApplication.class)
                .properties(APP_CONFIG_LOCATION)
                .build()
                .run(args);
    }
}
  • UserApplication.java
  • 메인을 application.yml로 둠
  • 운영 config파일은 운영서버 내 특정 경로 config/application.yml 로 읽어들이도록
  • optional: 줘서 로컬에서 빌드 시 해당 (운영config) 파일 없어도 구동되도록
    • application.yml에 active profile을 prod로 놓고 돌리면 당연히 안돌겠지…
  • spring boot의 .yml 참조 우선순위는
  • 문서와 같다
  • https://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-loading-yaml
  • https://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/boot-features-profiles.html

  • UserApplication.java 에서는
    1. optional:file:./config/application-prod.yml
    2. -Dspring.profiles.active=dev
    3. classpath:application.yml
  • 순으로 프로파일 config 설정 함

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
package com.aidaboat.user.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Value("${spring.datasource.driver-class-name}")
    private String driver;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create()
            .driverClassName(this.driver)
            .url(this.url)
            .username(this.username)
            .password(this.password)
            .build();
    }
}
  • DataSourceConfig.java
  • application-{profiles}.yml 의 k,v 를 UserApplication.java 실행 시점에 DI함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server:
  port: 8081

spring:
  profiles:
    active: local
# 본 파일 경로에 application-common.yml 만들어서 프로파일마다 그룹으로 함께 참조하도록 지정할 수 있음.
#    group:
#      local:
#        - common
#      dev:
#        - common
#      prod:
#        - common
  • application.yml
  • local,dev,prod 포함하는 common config 역할
  • spring.profiles.active: local 설정으로 놔도 command line설정 이 우선됨, commandline 설정은 intellij에서 설정 창으로 가능함.
  • intellij 설정 : ctrl+shift+a, edit configuration, active profiles

1
2
3
4
5
6
7
8
9
10
#내 PC
#server:
#  port: 8082

spring:
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/dbname
    username: ....
    password: ....
  • application-local.yml
  • 이외 application-dev.yml, application-prod.yml도 함께 생성해줌.
This post is licensed under CC BY 4.0 by the author.