๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

24์ผ์ฐจ. SECREAT ํŒŒ์ผ์„ ๋งŒ๋“ค์ž

by GreenJin_S2 2025. 11. 11.

 

์ด๋ถ€๋ถ„์ด ๊ผญ ์žˆ์–ด์•ผํ•จ

 

 

 

 

 

 

1. ํŒŒ์ผ๋“ค ๋งŒ๋“ค๊ณ  ์‹œํฌ๋ฆฟ ๋นผ๊ณ ๋Š” ๋‚˜๋จธ์ง€  api-server ํŒŒ์ผ ๋ณต์‚ฌํ•˜๊ธฐ 

2. ๊นƒ์€ ๋ฐ–์— ํ•˜๋‚˜๋งŒ ๋ณต์‚ฌํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋‹ค ์ง€์šฐ๊ธฐ

3. ํŒŒ์ผ ์ถ”๊ฐ€-docker-compose.yaml (์ƒˆ๋กœ๋งŒ๋“ค๊ธฐ -ํ…์ŠคํŠธ ๋ฌธ์„œ)

 

4. Dockerfile (ํ™•์žฅ์ž ์—†์Œ. ์•ž์— ๋Œ€๋ฌธ์ž! ) ํŒŒ์ผ ๋งŒ๋“ค๊ณ  ๊ฐ๊ฐ ํŒŒ์ผ์— ๋ชจ๋‘ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ด์„œ ๋„ฃ๊ธฐ (์„œ๋น„์Šค ํŒŒ์ผ๋„ ๊ฐ๊ฐ ์—ด๊ธฐ, yamlํŒŒ์ผ์€ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด์„œ ๋ฐ–์— ๋†“๋Š”๊ฑฐ!)

 

 

5. api-server์—์„œ ์ปค์„œ ์—ด๊ธฐ

yaml ํŒŒ์ผ์€ ํ•˜๋‚˜๋ฟ์ธ๊ฒŒ ๋งž์Œ!

 

์ด๊ฒŒ ๋– ์„œ  install ๋ˆ„๋ฆ„


 

@Dockerfile ์—ฌ๊ธฐ์— ์˜คํ”ˆ jdk 21 ์Šฌ๋ฆผ ๋ฒ„์ „ ์ด๋ฏธ์ง€๋ฅผ, ๋ณผ๋ฅจ์€ tmp๋ฅผ ์‚ฌ์šฉํ•ด์ค˜.์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ๋Š” gateway๋กœ ํ•ด์„œ ์ด ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ค˜

 

FROM openjdk:21-slim
VOLUME /tmp
RUN apt-get update && apt-get install -y curl
COPY ./build/libs/*.jar soccer-service.jar
ENTRYPOINT ["java", "-jar", "/gateway-server.jar"]
 

 

 

 

 

 

 

 

@docker-compose.yaml ์—ฌ๊ธฐ์— @Dockerfile @Dockerfile @Dockerfile @Dockerfile @Dockerfile @Dockerfile ์ด๊ฒƒ๋“ค์„ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค˜

 

๋„์ปค ํŒŒ์ผ ๋ชจ๋‘ ๋Œ์–ด๋‹ค ๋†“๊ณ  ๋งํ•˜๊ธฐ!!

 

ํ•„์š”์— ๋”ฐ๋ผ ํฌํŠธ ๋ฒˆํ˜ธ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

 

 

 

์œ ๋ ˆ์นด๋Š” ์›๋ž˜ 8761

 

 

์„œ๋น„์Šค๋ณ„ ํฌํŠธ:
Config Server: 8888
Eureka Server: 8761
Gateway Server: 8080
Common Service: 8081
Soccer Service: 8082
User Service: 8083

 

 

** ํฌํŠธ ๋ฒˆํ˜ธ ์žˆ์–ด์•ผํ•จ

 


๊ฐ ํŒŒ์ผ ์•ˆ์— ๋นŒ๋“œ๊ทธ๋ž˜๋“ค ํŒŒ์ผ์— dependencies ์•ˆ์—๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๊ธฐ

 

์ปจํ”ผ๊ทธ ์„œ๋ฒ„ ๊ทธ๋ž˜๋“ค

implementation group: 'org.springframework.cloud', name: 'spring-cloud-config-server', version: '4.1.3' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '3.3.4' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'org.springframework.cloud:spring-cloud-config-server' implementation 'org.springframework.boot:spring-boot-starter-actuator'

 

 

์œ ๋ ˆ์นด ์„œ๋ฒ„ ๊ทธ๋ž˜๋“ค

implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-server', version: '4.1.3' implementation group: 'org.springframework.cloud', name: 'spring-cloud-config', version: '4.1.3' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

 

 

๊ฒŒ์ดํŠธ์›จ์ด ๊ทธ๋ž˜๋“ค // spring security implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '3.3.4' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-oauth2-client', version: '3.3.4' // spring webflux //implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '3.3.4' // spring cloud implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-gateway', version: '4.0.0' implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-circuitbreaker-reactor-resilience4j', version: '3.1.2' // JWT implementation 'io.jsonwebtoken:jjwt-api:0.12.6' runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.6' runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.6' // prometheus implementation group: 'io.micrometer', name: 'micrometer-registry-prometheus', version: '1.13.4' // spring doc implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webflux-ui', version: '2.6.0' // config implementation group: 'org.springframework.cloud', name: 'spring-cloud-config', version: '4.1.3' // mongo implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive' // lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' implementation 'org.springframework.cloud:spring-cloud-starter-config' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

 

**๋ชจ๋“  ์„œ๋น„์Šค์— ๋™์ผํ•˜๊ฒŒ ๋„ฃ๊ธฐ

 

๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' // Spring Boot ์Šคํƒ€ํ„ฐ implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.seleniumhq.selenium:selenium-java:4.19.1' implementation 'org.seleniumhq.selenium:selenium-chrome-driver:4.19.1' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" implementation 'org.jsoup:jsoup:1.15.3' implementation 'org.springframework.cloud:spring-cloud-starter-config' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' // Spring Boot DevTools developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.9.3' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3' // Swagger ์„ค์ •์„ ์œ„ํ•œ Springdoc OpenAPI implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.9.3' // junit ์ตœ์ข…๋ฒ„์ „ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3' // JUnit Jupiter API testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3' // JUnit Jupiter Engine // selenium ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (๋™์  ์‚ฌ์ดํŠธ) //implementation 'org.seleniumhq.selenium:selenium-java:4.1.2' implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '4.19.1' implementation 'org.seleniumhq.selenium:selenium-java:4.19.1' implementation 'org.seleniumhq.selenium:selenium-chrome-driver:4.19.1' implementation 'io.github.bonigarcia:webdrivermanager:5.3.0' //์˜์ˆ˜์ฆ ์ธ์‹ OCR์„ ์œ„ํ•œ JSON ํŒŒ์‹ฑ implementation 'com.googlecode.json-simple:json-simple:1.1.1' // ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ์„ ์œ„ํ•œ AWS SDK S3 implementation 'com.amazonaws:aws-java-sdk-s3:1.12.300' implementation 'javax.xml.bind:jaxb-api:2.3.1' implementation 'org.json:json:20211205'

 

 


๋ฃจํŠธ ๋นŒ๋“œ ๊ทธ๋ž˜๋“ค ๋””ํŽœ๋˜์‹œ testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

 

-๋งจ ๋ฐ–์— ์žˆ๋Š” ๋นŒ๋“œ ๊ทธ๋ž˜๋“ค

 

 

 

 

 

 


 

 

privateKey: | -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn NhAAAAAwEAAQAAAQEAnLDFrxGBk69QQ0ZWeNNnHUUxCqr6Hrkre0tjb0uspksbU+7yQhfG F0SrIdmmmQJ7r47LPBoTHWjbm+SWI0Zq/lYDQZtZIsP+w91MaDXP+1Q1mm3147m/DjEMfO srgaoaDEfJVa2byr88CoTSALLvulIRHWS1dIGMpw4fHMqBTpqq67l96b57xWtvm+7uQra6 C2ksktvxOEzJQz7vA/DLAbqYvdnHXXJ79xsFvIi4j09BPNItVjL6WVybr6MPix1Qjievb0 QXboA5MVeoPBgqQOPCxzalcI4Y73b4VoQIKgsak94h4s3w0CFlu0fPWXRA915HdWZqvfld hyqFMqw8pwAAA8iH7cM6h+3DOgAAAAdzc2gtcnNhAAABAQCcsMWvEYGTr1BDRlZ402cdRT -----END OPENSSH PRIVATE KEY-----//key:my secret ๊ตฌ์„ฑ์„œ๋ฒ„์—์„œ openssh provate key๋ฅผ ๋“ฑ๋กํ•˜๋ ค๊ณ  ํ•ด ๊ณผ์ •์„ ์•Œ๋ ค์ค˜

 

 

 

 

ssh-keygen -t ed25519 -C "seoeunjin716@gmail.com"

 

 

 

cat ~/.ssh/id_ed25519.pub

 

 

2. GitHub์— ๊ณต๊ฐœ ํ‚ค ๋“ฑ๋ก

GitHub ๊ณ„์ •์— Ed25519 ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ SSH ์ธ์ฆ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. GitHub์— ๋กœ๊ทธ์ธ:
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ GitHub์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. SSH ํ‚ค ์ถ”๊ฐ€ ํŽ˜์ด์ง€๋กœ ์ด๋™:
    • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ํ”„๋กœํ•„ ์•„์ด์ฝ˜ → SettingsSSH and GPG keysNew SSH key ๋˜๋Š” Add SSH key ๋ฒ„ํŠผ ํด๋ฆญ.
  3. ๊ณต๊ฐœ ํ‚ค ์ถ”๊ฐ€:
    • Title: ํ‚ค๋ฅผ ์‹๋ณ„ํ•  ์ด๋ฆ„(์˜ˆ: "My Laptop Ed25519").
    • Key type: "Authentication Key" ์„ ํƒ (๊ธฐ๋ณธ๊ฐ’).
    • Key: ๋กœ์ปฌ์—์„œ ๋ณต์‚ฌํ•œ ๊ณต๊ฐœ ํ‚ค๋ฅผ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
      • cat ~/.ssh/id_ed25519.pub์˜ ์ถœ๋ ฅ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜, ํŒŒ์ผ ๋‚ด์šฉ์„ ์ง์ ‘ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • Add SSH key ๋ฒ„ํŠผ ํด๋ฆญ.
  4. ์ธ์ฆ ํ™•์ธ:
    • GitHub๊ฐ€ ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    •  

 

.shhํŒŒ์ผ์—์„œ ํŒŒ์›Œ์‰˜(ํ„ฐ๋ฏธ๋„)์—ด๊ธฐ

 

์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด ๋„ฃ๊ธฐ

 

 

cat ~/.ssh/id_ed25519.pub

 

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILzeFpfbY8xdxH9Vys09wDZViQf9Dd5js5lBRVq775nG seoeunjin716@gmail.com

-์ด ๋‚ด์šฉ์„ ๊นƒํ—ˆ๋ธŒ์— ๋„ฃ๊ธฐ

 

  1. SSH ํ‚ค ์ถ”๊ฐ€ ํŽ˜์ด์ง€๋กœ ์ด๋™:
    • ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ํ”„๋กœํ•„ ์•„์ด์ฝ˜ → Settings  SSH and GPG keys  New SSH key ๋˜๋Š” Add SSH key ๋ฒ„ํŠผ ํด๋ฆญ.

 

ํŒŒ์›Œ์…€์—์„œ cat ์“ฐ๊ณ   ํƒญ ๋ˆ„๋ฅด๋ฉด ์งœ์ž” ๋‚˜์˜ด

cat .\id_ed25519

 

 

๋ฐ‘์— ์ฝ”๋“œ๋ฅผ configration ์— ์žˆ๋Š”  yamlํŒŒ์ผ์— ๋„ฃ๊ธฐ

url ์€ ๊นƒํ—ˆ๋ธŒ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ (ssh)

๋ฐ˜๋“œ์‹œ private๋กœ ์„ค์ •ํ•˜๊ธฐ!!

 

์—ฌ๊ธฐ์„œ ๊ฐ€์ ธ์˜จ url์„

 

 

์—ฌ๊ธฐ์— ๋„ฃ๊ธฐ

 

 

๊ฒŒ์ดํŠธ์›จ์ด  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜.yaml์‚ญ์ œ

์œ ๋ ˆ์นด ์•ˆ์— yaml ์‚ญ์ œ

๋ชจ๋“  yamlํŒŒ์ผ ์‚ญ์ œ, configration ๋นผ๊ณ !

 

 

 

๋Œ€์‹  ์ด ๋‘ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์คŒ~! (๊ณตํŒŒ์ผ)-์ด์‚ฌ ์‹œํ‚จ๋‹ค๋Š” ๊ฐœ๋…

 

 

 

๋‹ค yamlํŒŒ์ผ ์‚ญ์ œํ•˜๊ณ  

 

 

์‹œํฌ๋ฆฟ์— ๋งŒ๋“ค์–ด์คŒ

 

 

 

@application.yaml ์—ฌ๊ธฐ์—์„œ @application.yaml (18-22) ์ด ๋น„๋ฐ€ํ‚ค๋ฅผ .envํŒŒ์ผ์—์„œ ํ˜ธ์ถœํ•˜๋„๋ก ํ•ด์ค˜

 

๋‹ค ๋ณต๋ถ™ํ•˜์ง€ ๋ง๊ณ  ์ผ๋ถ€๋ถ„๋งŒ ์ปค์„œํ•œํ…Œ ๋ฌผ์–ด๋ณด๊ธฐ

 

 

์ด๋ ‡๊ฒŒ ์•ˆํ•˜๊ณ 

 

 

 

envํŒŒ์ผ ๋งŒ๋“ค๊ณ  "" ์•ˆ์— ๋„ฃ๊ธฐ

 

 

CONFIG_SERVER_PRIVATE_KEY=

 

๋„ฃ๊ธฐ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

echo "# esgseed-secret" >> README.md
git init
git add .
git commit -m "๋ณด์•ˆ ํด๋” ์ƒ์„ฑ 2511 18:00"
git branch -M main
git remote add origin git@github.com:seoeunjin716/esgseed-secret.git
git push -u origin main -์—ฌ๊ธฐ์„œ  YES ๋ˆ„๋ฅด๊ธฐ

 

์˜ฌ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•!! ์กฐ์‹ฌํžˆ ํ™•์ธํ•˜๊ธฐ

 

-ํšŒ์‚ฌ์— ๋ณด๋‚ผ๊ฑฐ๋Š” ๋”ฐ๋กœ ๋งŒ๋“ค๊ธฐ

 

 

api ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ ค์ง€๊ณ  env ํŒŒ์ผ ์•ˆ๋ณด์ด๊ณ  secret ํŒŒ์ผ ์•ˆ๋ˆŒ๋Ÿฌ์ง€๋ฉด ์„ฑ๊ณต!