๐Ÿง ATMS - JEUS ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 6๊ฐœ ๊ตฌ์„ฑ๊ธฐ(๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๊ฑท์–ด๋‚ธ ์ด์œ )



์ง€๋‚œ ๊ธ€๊นŒ์ง€๋Š” ์—…์ฒด ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ docker compose๋กœ 7๊ฐœ ์„œ๋น„์Šค๋ฅผ ๋„์šฐ๊ณ , CI/CD์™€ ์ €๋„ ๊ฒ€์ƒ‰ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ถ™์ธ ์ด์•ผ๊ธฐ์˜€๋‹ค.

โ–ถ ๐Ÿง ATMS - ELK Stack ๊ตฌ์ถ•(Kafka ๊ธฐ๋ฐ˜ ์ €๋„ ์ŠคํŠธ๋ฆฌ๋ฐ)

์ด๋ฒˆ ๊ธ€๋ถ€ํ„ฐ๋Š” ๋ฌด๋Œ€๊ฐ€ ์€ํ–‰ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋กœ ์˜ฎ๊ฒจ๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์€ ์˜์™ธ๋กœ ๋‹จ์ˆœํ–ˆ๋‹ค โ€” "์ด 6๊ฐœ ๋ชจ๋“ˆ์„ ์€ํ–‰ WAS์— ์–ด๋–ป๊ฒŒ ์˜ฌ๋ฆฌ์ง€?"



๋ฐฐ๊ฒฝ โ€” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹ˆ๋ผ ์€ํ–‰ ํ‘œ์ค€ WAS ์œ„๋กœ


์—…์ฒด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ชจ๋“ˆ๋งˆ๋‹ค ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜์”ฉ, ๋‚ด์žฅ ํ†ฐ์บฃ์œผ๋กœ ๋–  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์€ํ–‰ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋Š” ์กฐ๊ฑด์ด ์™„์ „ํžˆ ๋‹ฌ๋ž๋‹ค.

  • ์€ํ–‰ ํ‘œ์ค€ WAS์ธ JEUS์™€ ์›น์„œ๋ฒ„ WebtoB๊ฐ€ ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ๊ณ , ๋ฐฑ์—”๋“œ๋Š” ๊ทธ ์œ„์—์„œ ๋Œ์•„์•ผ ํ•œ๋‹ค.
  • ํ์‡„๋ง์ด๋ผ ์™ธ๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋‚˜ Maven ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  • ์„œ๋ฒ„๋Š” 2์ฝ”์–ด์ด๊ณ , JEUS ์„ค์น˜ยท์„œ๋ฒ„ ์ƒ์„ฑยท์žฌ๊ธฐ๋™์€ WAS ๋‹ด๋‹น์˜ ์˜์—ญ์ด๋‹ค.

JEUS / WebtoB ํ•œ ์ค„ ์ •๋ฆฌ
๊ตฌ๋ถ„ ์—ญํ•  ์ต์ˆ™ํ•œ ๊ฒƒ์— ๋น„์œ ํ•˜๋ฉด
JEUS WAS (์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ) Tomcat
WebtoB ์›น์„œ๋ฒ„ (์ •์  ํŒŒ์ผ + WAS ์—ฐ๋™) Apache / nginx
JSV WebtoB โ†” JEUS ์ „์šฉ ์—ฐ๊ฒฐ AJP / ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ

ํŠน์ดํ•œ ์ ์€ JSV ์—ฐ๊ฒฐ์˜ ๋ฐฉํ–ฅ์ด๋‹ค. JEUS ์„œ๋ฒ„๊ฐ€ WebtoB์˜ JSV ํฌํŠธ๋กœ ์ ‘์†ํ•ด ์˜จ๋‹ค. nginx์ฒ˜๋Ÿผ ์›น์„œ๋ฒ„๊ฐ€ WAS๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ๋ถ€ํ„ฐ ๋ฐ”๊ฟจ๋‹ค. ์‹คํ–‰ํ˜• JAR(bootJar) ๋Œ€์‹  WAR(bootWar -Pjeus)๋ฅผ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  Application ํด๋ž˜์Šค๊ฐ€ SpringBootServletInitializer๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ํ–ˆ๋‹ค. -Pjeus๋ฅผ ์ค„ ๋•Œ๋งŒ WAR๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ์˜ bootRun๊ณผ ๊ธฐ์กด JAR ๋นŒ๋“œ๋Š” ๊ทธ๋Œ€๋กœ๋‹ค.

// ๋ฃจํŠธ build.gradle โ€” -Pjeus ๋กœ ๋นŒ๋“œํ•  ๋•Œ๋งŒ WAR ๋กœ ์ „ํ™˜
pluginManager.withPlugin('org.springframework.boot') {
    if (project.hasProperty('jeus')) {
        apply plugin: 'war'
        dependencies {
            // ๋‚ด์žฅ ํ†ฐ์บฃ์€ WAR ์—์„œ ์ œ์™ธ (JEUS ๊ฐ€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• )
            providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
        }
        tasks.named('bootWar') {
            from(rootProject.file('jeus/web.xml')) {
                into 'WEB-INF'
                expand(profile: 'jeus', moduleName: project.name)
            }
        }
    }
}
ํ”„๋กœํŒŒ์ผ์€ JVM ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ web.xml๋กœ

ํ•œ JVM์— WAR ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, -Dspring.profiles.active๋ฅผ JVM ์˜ต์…˜์œผ๋กœ ๋„ฃ์œผ๋ฉด ๋ชจ๋“  ์•ฑ์ด ๊ฐ™์€ ๊ฐ’์„ ๊ณต์œ ํ•ด๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ WAR์˜ WEB-INF/web.xml์— spring.profiles.active๋ฅผ context-param์œผ๋กœ ๋„ฃ์–ด WAR๋งˆ๋‹ค ํ”„๋กœํŒŒ์ผ์„ ๋“ค๊ณ  ๋‹ค๋‹ˆ๊ฒŒ ํ–ˆ๋‹ค.

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="5.0" metadata-complete="false">
    <display-name>${moduleName}</display-name>
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>${profile}</param-value>
    </context-param>
</web-app>


1์ฐจ ๊ตฌ์„ฑ โ€” ์„œ๋ฒ„ 1๊ฐœ + ์ปจํ…์ŠคํŠธ 6๊ฐœ + ๊ฒŒ์ดํŠธ์›จ์ด


์ฒ˜์Œ์—๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•ด ๋ณด์ด๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค. JEUS ์„œ๋ฒ„(=JVM) ํ•˜๋‚˜์— WAR 6๊ฐœ๋ฅผ ์˜ฌ๋ฆฌ๊ณ , ์ปจํ…์ŠคํŠธ ๊ฒฝ๋กœ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

1์ฐจ ๊ตฌ์„ฑ์˜ ์ปจํ…์ŠคํŠธ ๋ฐฐ์น˜
๋ชจ๋“ˆ ์ปจํ…์ŠคํŠธ
atms-web /
atms-journal /journal
atms-batch /batch
atms-file /file
atms-if-internal /ifin
atms-if-external /ifex

๋ฌธ์ œ๋Š” ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ์ฃผ์†Œ๋“ค์ด์—ˆ๋‹ค. ATM ์—์ด์ „ํŠธ๋Š” /api/journal/..., /atmf/... ๊ฐ™์€ ๊ณ ์ • ๊ฒฝ๋กœ๋กœ ์ €๋„๊ณผ ํŒŒ์ผ์„ ๋ณด๋‚ด๊ณ , ๋Œ€๋‚ดยท๋Œ€์™ธ ๊ธฐ๊ด€๋„ ์ •ํ•ด์ง„ ๊ฒฝ๋กœ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ์š”์ฒญ๋“ค์€ /journal ๊ฐ™์€ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ถ€ ๋ฃจํŠธ(/) = atms-web์œผ๋กœ ๋–จ์–ด์ง„๋‹ค.

๊ทธ๋ž˜์„œ atms-web ๋งจ ์•ž์— ๊ฒŒ์ดํŠธ์›จ์ด ํ•„ํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋’€๋‹ค. ๊ฒฝ๋กœ ์ ‘๋‘์–ด๋ฅผ ๋ณด๊ณ , ๊ฐ™์€ JEUS ์•ˆ์˜ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋กœ HTTP ์š”์ฒญ์„ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.

graph TD
	A[ATM ์—์ด์ „ํŠธ POST /api/journal/...]
	B[WebtoB]
	C[JEUS ์„œ๋ฒ„ 1๊ฐœ - ์ปจํ…์ŠคํŠธ / = atms-web]
	D[ModuleGatewayFilter - ์ ‘๋‘์–ด ๋งค์นญ]
	E[๊ฐ™์€ JEUS ์˜ /journal ์ปจํ…์ŠคํŠธ๋กœ HTTP ์žฌ์š”์ฒญ]
	F[atms-journal ์ฒ˜๋ฆฌ]

	A --> B --> C --> D --> E --> F
gateway:
  enabled: true
  routes:
    - prefix: /api/journal
      target: ${jeus.base-url}/journal
    - prefix: /api/batch
      target: ${jeus.base-url}/batch
    - prefix: /atmf
      target: ${jeus.base-url}/file
    # ... /api/agent, /api/file, /api/if/internal, /api/if/external

Tomcat์— ์˜ฌ๋ ค ๊ฒ€์ฆ๊นŒ์ง€ ๋งˆ์ณค๊ณ , ๋™์ž‘ ์ž์ฒด๋Š” ๋ฌธ์ œ์—†์—ˆ๋‹ค. ๋‹ค๋งŒ ์ด ๊ตฌ์กฐ์—์„œ ์ปจํ…์ŠคํŠธ ๊ฒฝ๋กœ ๋•Œ๋ฌธ์— ์ƒ๊ธด ๋ฒ„๊ทธ ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋‚ฌ๋‹ค.

ํ•จ์ • 1 โ€” /journal ์•„๋ž˜์—์„œ HMAC ๊ฒ€์ฆ์ด ์กฐ์šฉํžˆ ๋น ์กŒ๋‹ค

์ €๋„ ์ˆ˜์‹ ์„ ๊ฒ€์ฆํ•˜๋Š” HMAC ํ•„ํ„ฐ๊ฐ€ getRequestURI()๋กœ /api/journal ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ปจํ…์ŠคํŠธ๊ฐ€ /์ผ ๋•Œ๋Š” ๋งž์•˜์ง€๋งŒ, JEUS์—์„œ๋Š” URI๊ฐ€ /journal/api/journal/...์ด ๋˜๋ฉด์„œ ๋งค์นญ ์‹คํŒจ โ†’ ๊ฒ€์ฆ ์ž์ฒด๋ฅผ ๊ฑด๋„ˆ๋›ฐ์—ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ผ "ํ†ต๊ณผ"๋กœ ๋‚˜ํƒ€๋‚˜์„œ ๋” ์œ„ํ—˜ํ–ˆ๋‹ค. ๊ฒฝ๋กœ๋ฅผ ๋น„๊ตํ•  ๋•Œ๋Š” getContextPath()๋ฅผ ๋บ€ ๊ฒฝ๋กœ๋กœ ํŒ๋‹จํ•˜๋„๋ก ๊ณ ์ณค๋‹ค.

ํ•จ์ • 2 โ€” ๋Œ€์ƒ ๋ชจ๋“ˆ์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ๋๋‹ค

๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์—ฐ๊ฒฐ์— ์‹คํŒจํ•˜๋ฉด sendError(502)๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ, /error๋กœ ์žฌ๋””์ŠคํŒจ์น˜๋œ ์š”์ฒญ์—๋Š” ์ธ์ฆ ์ •๋ณด๊ฐ€ ์—†์–ด์„œ Spring Security๊ฐ€ ์ด๋ฅผ 401๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ ธ๋‹ค. ํ”„๋ก ํŠธ๋Š” 401์„ ๋ฐ›์œผ๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ๋ณด๋‚ด๋‹ˆ, ๋ชจ๋“ˆ ํ•˜๋‚˜๊ฐ€ ์ฃฝ์œผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ๋˜๋Š” ์…ˆ์ด์—ˆ๋‹ค. sendError ๋Œ€์‹  502 ์ƒํƒœ์™€ JSON ๋ณธ๋ฌธ์„ ์ง์ ‘ ์จ์„œ ์‘๋‹ตํ•˜๋„๋ก ๋ฐ”๊ฟจ๋‹ค.



๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์ง์ ‘ ์žฌ ๋ณด๋‹ˆ โ€” ์„ฑ๋Šฅ๊ณผ ์Šค๋ ˆ๋“œ ๊ต์ฐฉ


"๊ฒŒ์ดํŠธ์›จ์ด ํ•˜๋‚˜ ๋” ๊ฑฐ์น˜๋Š” ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋น„์šฉ์ผ๊นŒ?" ๊ฐ์œผ๋กœ ํŒ๋‹จํ•˜์ง€ ์•Š๊ณ  Claude Code์™€ ํ•จ๊ป˜ ์ง์ ‘ ์žฌ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ์€ํ–‰ JEUS์—์„œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜๋Š” ์—†์–ด์„œ, Tomcat 10.1์— webยทfile ๋‘ ๋ชจ๋“ˆ์„ ์˜ฌ๋ ค ์ฐธ๊ณ ์น˜๋กœ ์ธก์ •ํ–ˆ๋‹ค.

์„ฑ๋Šฅ ์‹ค์ธก (Tomcat 10.1, 4์ฝ”์–ด โ€” JEUS ์•„๋‹˜, ์ฐธ๊ณ ์น˜)
ํ•ญ๋ชฉ ์ง์ ‘ ํ˜ธ์ถœ ๊ฒŒ์ดํŠธ์›จ์ด ๊ฒฝ์œ  ์ฐจ์ด
์ž‘์€ JSON ์ˆœ์ฐจ 300ํšŒ (p50) 5.3ms 7.9ms ๊ฑด๋‹น ์•ฝ +2.6ms
์ฒ˜๋ฆฌ๋Ÿ‰ (๋™์‹œ 20) 690 req/s 518 req/s ์•ฝ -25%
50MB ๋‹ค์šด๋กœ๋“œ 596ms 883ms ์•ฝ -32%

ํ™”๋ฉด ์ˆ˜์ค€์˜ ํŠธ๋ž˜ํ”ฝ์—์„œ๋Š” ์ฒด๊ฐํ•˜๊ธฐ ์–ด๋ ค์šด ์ฐจ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ์‹œ์Šคํ…œ์—๋Š” ์ˆ˜์ฒœ ๋Œ€์˜ ATM์ด ๊ณ„์† ๋ณด๋‚ด๋Š” ์ €๋„๊ณผ ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์žˆ๊ณ , 2์ฝ”์–ด ์„œ๋ฒ„์—์„œ ์ „๋‹ฌ ์š”์ฒญ์€ CPU๋ฅผ ์•ฝ 1.5๋ฐฐ ์“ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง„์งœ ๋ฌธ์ œ๋Š” ์ˆซ์ž๋ณด๋‹ค ๊ตฌ์กฐ์— ์žˆ์—ˆ๋‹ค.

๊ฒŒ์ดํŠธ์›จ์ด ์š”์ฒญ์€ ์Šค๋ ˆ๋“œ๋ฅผ 2๊ฐœ ์“ด๋‹ค

atms-web์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€์ƒ ๋ชจ๋“ˆ์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๋Œ€์ƒ ๋ชจ๋“ˆ๋„ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋‘˜์ด ๊ฐ™์€ ์Šค๋ ˆ๋“œ ํ’€์—์„œ ๋‚˜์˜ค๋ฉด ์„œ๋กœ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์žฌํ˜„ํ•ด๋ดค๋‹ค. ์Šค๋ ˆ๋“œ ํ’€์„ 4๊ฐœ๋กœ ์ค„์ด๊ณ  ๋™์‹œ 16๊ฑด์”ฉ 32๊ฑด์„ ๋ณด๋ƒˆ๋‹ค.

์žฌํ˜„ ๊ฒฐ๊ณผ โ€” ์ง์ ‘ ํ˜ธ์ถœ์€ ์ „๋ถ€ ์„ฑ๊ณต, ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ์ „๋ถ€ ํƒ€์ž„์•„์›ƒ
ํ˜ธ์ถœ ๋ฐฉ์‹ ๊ฒฐ๊ณผ
์ง์ ‘ ํ˜ธ์ถœ 32๊ฑด ๋ชจ๋‘ ์„ฑ๊ณต (0.5์ดˆ)
๊ฒŒ์ดํŠธ์›จ์ด ๊ฒฝ์œ  32๊ฑด ๋ชจ๋‘ ํƒ€์ž„์•„์›ƒ โ€” ์ฝ๊ธฐ ํƒ€์ž„์•„์›ƒ(120์ดˆ)๊นŒ์ง€ ์„œ๋ฒ„ ์ „์ฒด ๋ฌด์‘๋‹ต

์Šค๋ ˆ๋“œ ๋คํ”„๋ฅผ ๋– ๋ณด๋‹ˆ 4๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‘ ModuleGatewayFilter์—์„œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ๊ณ , ์ •์ž‘ ๋Œ€์ƒ ์•ฑ์€ ์Šค๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜๋„ ๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

graph TD
	A[์š”์ฒญ 4๊ฑด ๋„์ฐฉ - ์Šค๋ ˆ๋“œ 4๊ฐœ ๋ชจ๋‘ ์‚ฌ์šฉ]
	B[๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ /journal ๋กœ ์žฌ์š”์ฒญ]
	C[์žฌ์š”์ฒญ์ด ๊ฐ™์€ ํ’€์—์„œ ๋นˆ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆผ]
	D[๋นˆ ์Šค๋ ˆ๋“œ ์—†์Œ - ์•„๋ฌด๋„ ๋๋‚˜์ง€ ์•Š์Œ]

	A --> B --> C --> D
	D -->|ํƒ€์ž„์•„์›ƒ๊นŒ์ง€ ๋Œ€๊ธฐ| A

JEUS์—์„œ๋Š” ์™ธ๋ถ€ ์š”์ฒญ(WebtoB ์ปค๋„ฅํ„ฐ)๊ณผ ์žฌ์š”์ฒญ(HTTP ๋ฆฌ์Šค๋„ˆ)์ด ์„œ๋กœ ๋‹ค๋ฅธ ํ’€์„ ์“ฐ๋Š” ๊ตฌ์กฐ๋ผ ๋‹น์žฅ ํ„ฐ์งˆ ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์•˜๋‹ค. ํ•˜์ง€๋งŒ "ํ’€ ์„ค์ •์— ๋”ฐ๋ผ ์„œ๋ฒ„ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ" ๋ฅผ ์šด์˜๊นŒ์ง€ ๊ฐ€์ ธ๊ฐ€๊ณ  ์‹ถ์ง€๋Š” ์•Š์•˜๋‹ค.



"JEUS 6๊ฐœ"๋Š” ๋ฌด์—‡์„ ๋œปํ•˜๋Š”๊ฐ€


๊ฒฐ์ •์ ์ธ ๊ณ„๊ธฐ๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ์—ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์ ๊ฒ€ํ•ด๋ณด๋‹ˆ 6๊ฐœ ์•ฑ ์ค‘ 1๊ฐœ๋งŒ ๋“ฑ๋ก๋˜์–ด ์žˆ์—ˆ๊ณ , ๋‚˜๋จธ์ง€ 5๊ฐœ ๋“ฑ๋ก์€ ์–ด์ฐจํ”ผ WAS ๋‹ด๋‹น์—๊ฒŒ ์š”์ฒญํ•ด์•ผ ํ–ˆ๋‹ค. ์–ด์ฐจํ”ผ ์š”์ฒญํ•  ๊ฑฐ๋ผ๋ฉด ๊ตฌ์„ฑ ์ž์ฒด๋ฅผ ๋‹ค์‹œ ์ •ํ•˜์ž๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ "๋ชจ๋“ˆ๋งˆ๋‹ค ํฌํŠธ๋ฅผ ๋”ฐ๋กœ ๊ฐ–๊ฒŒ ํ•ด ์ฃผ์„ธ์š”"๋ฅผ JEUS์˜ ์–ธ์–ด๋กœ ๋ฐ”๊พธ๋ ค๋‹ˆ ์šฉ์–ด๋ถ€ํ„ฐ ํ—ท๊ฐˆ๋ ธ๋‹ค. ๊ทธ๋ž˜์„œ Claude Code์—๊ฒŒ ์งˆ๋ฌธ์„ ํ•˜๋‚˜์”ฉ ์ชผ๊ฐœ์„œ ๋˜์ง€๋ฉฐ ๊ฐœ๋…๋ถ€ํ„ฐ ๋งž์ท„๋‹ค.

์งˆ๋ฌธ์„ ์ชผ๊ฐœ๊ฐ€๋ฉฐ ๊ฐœ๋…๋ถ€ํ„ฐ ๋งž์ท„๋‹ค
์ˆœ์„œ ์งˆ๋ฌธ ์ •๋ฆฌ๋œ ๋‹ต
1 JEUS ํ•˜๋‚˜์—์„œ 6๊ฐœ๋ฅผ ๊ฐ์ž ํฌํŠธ๋กœ ๋„์šธ ์ˆ˜ ์žˆ๋‚˜? ์„œ๋ฒ„ 1๊ฐœ(=JVM 1๊ฐœ)์—์„œ๋Š” WAR๊ฐ€ ํฌํŠธ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค. ์„œ๋ฒ„์˜ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์ปจํ…์ŠคํŠธ๋กœ ๊ตฌ๋ถ„ํ•  ๋ฟ์ด๋‹ค
2 "JEUS 6๊ฐœ"๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ์€? โ‘  ์„œ๋ฒ„ 1๊ฐœ + ๋ฆฌ์Šค๋„ˆ 6๊ฐœ โ‘ก ๋„๋ฉ”์ธ 1๊ฐœ + ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 6๊ฐœ โ‘ข JEUS(๋„๋ฉ”์ธ) 6๊ฐœ โ€” ์ฐจ์ด์˜ ํ•ต์‹ฌ์€ JVM ์ˆ˜
3 ๋‚ด์žฅ ํ†ฐ์บฃ 6๊ฐœ๋ฅผ ๋„์šฐ๋˜ ์—…์ฒด ๊ตฌ์„ฑ์€ ์…‹ ์ค‘ ๋ฌด์—‡๊ณผ ๊ฐ™๋‚˜? ๊ตฌ์กฐ(JVM 6๊ฐœยทํฌํŠธ 6๊ฐœยท์žฅ์•  ๊ฒฉ๋ฆฌ)๋Š” โ‘ก์™€ ๊ฐ™๋‹ค
4 ํ†ฐ์บฃ๊ณผ JEUS๋Š” ๊ฐ™์€ ๊ฐœ๋… ์•„๋‹Œ๊ฐ€? ๋งž๋‹ค โ€” ๋‘˜ ๋‹ค ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋‹ค. ์ฐจ์ด๋Š” JEUS ์ชฝ์— ๊ด€๋ฆฌ ์ธต(DASยทNodeManager)์ด ๋ถ™๋Š”๋‹ค๋Š” ๊ฒƒ๋ฟ

JEUS์˜ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์ด๋ ‡๋‹ค.

๋ฌผ๋ฆฌ ์„œ๋ฒ„ (2์ฝ”์–ด)
โ””โ”€ JEUS ์„ค์น˜
   โ””โ”€ ๋„๋ฉ”์ธ (domain.xml ํ•˜๋‚˜)
      โ”œโ”€ DAS               โ† ๊ด€๋ฆฌ ์ „์šฉ JVM. ์„ค์ • ๋ณด๊ด€ยท๋ฐฐํฌยท์„œ๋ฒ„ ๊ธฐ๋™/์ •์ง€ ๋ช…๋ น
      โ”œโ”€ NodeManager       โ† ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๊ณ  ๊ฐ์‹œํ•˜๋Š” ๋ฐ๋ชฌ
      โ””โ”€ ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ ร— N  โ† ์‹ค์ œ ์•ฑ์ด ๋„๋Š” JVM. ๊ฐ์ž ๋ฆฌ์Šค๋„ˆ(ํฌํŠธ)ยทํž™ยท๋กœ๊ทธ
         โ””โ”€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (WAR)
์„ธ ๊ฐ€์ง€ "JEUS 6๊ฐœ" ๋น„๊ต
๊ตฌ์„ฑ JVM ์ˆ˜ ํŒ๋‹จ
โ‘  ์„œ๋ฒ„ 1๊ฐœ + ๋ฆฌ์Šค๋„ˆ 6๊ฐœ 1 ํฌํŠธ๋งŒ ๋‚˜๋‰˜๊ณ  ์žฅ์•  ๊ฒฉ๋ฆฌ๋Š” ์—†์Œ, ์ง€์› ์—ฌ๋ถ€๋„ ๋ฏธํ™•์ธ
โ‘ก ๋„๋ฉ”์ธ 1๊ฐœ + ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 6๊ฐœ 6 (+DAS) ์ฑ„ํƒ
โ‘ข JEUS(๋„๋ฉ”์ธ) 6๊ฐœ 12 ๊ด€๋ฆฌ ์ธต์ด 6๋ฒŒ โ€” 2์ฝ”์–ด ์„œ๋ฒ„์— ๋ถ€์ ํ•ฉ
๋‚ด์žฅ ํ†ฐ์บฃ๊ณผ JEUS ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„์˜ ๋Œ€์‘
๋‚ด์žฅ ํ†ฐ์บฃ (๋กœ์ปฌ) JEUS
java -jar atms-journal.jar ํ”„๋กœ์„ธ์Šค 1๊ฐœ ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 1๊ฐœ (JVM)
server.port=8081 ์„œ๋ฒ„์˜ HTTP ๋ฆฌ์Šค๋„ˆ ํฌํŠธ
์•ฑ์ด ํ†ฐ์บฃ์„ ํ’ˆ์Œ (JAR) ์„œ๋ฒ„๊ฐ€ ์•ฑ์„ ํ’ˆ์Œ (WAR ๋“ฑ๋ก)
ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง์ ‘ ์‹คํ–‰ยท์ •์ง€ DASยทNodeManager๊ฐ€ ์„œ๋ฒ„๋“ค์„ ๊ด€๋ฆฌ

๊ฒฐ๊ตญ "๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 6๊ฐœ" = "๋‚ด์žฅ ํ†ฐ์บฃ 6๊ฐœ" ์™€ ์‹คํ–‰ ๋‹จ์œ„๊ฐ€ ๊ฐ™๋‹ค. ๋Œ๊ณ  ๋Œ์•„ ์—…์ฒด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๊ตฌ์กฐ(๋ชจ๋“ˆ๋‹น ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜)๋กœ ๋Œ์•„๊ฐ€๋Š” ์…ˆ์ด์—ˆ๋‹ค.



์ตœ์ข… ๊ตฌ์„ฑ โ€” ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 6๊ฐœ, ์ปจํ…์ŠคํŠธ๋Š” ๋ชจ๋‘ /


graph TD
	PC[์šด์˜์ž PC ๋ธŒ๋ผ์šฐ์ €] --> W[WebtoB]
	W -->|/index.html, /assets/| S[์ •์  ํŒŒ์ผ - ํ™”๋ฉด]
	W -->|/api/journal/, /api/agent/| J[journal ์„œ๋ฒ„ :8081]
	W -->|/api/batch/| B[batch ์„œ๋ฒ„ :8082]
	W -->|/api/file/, /atmf/| F[file ์„œ๋ฒ„ :8083]
	W -->|/api/if/internal/| I[if-internal ์„œ๋ฒ„ :8084]
	W -->|/api/if/external/| E[if-external ์„œ๋ฒ„ :8085]
	W -->|๋‚˜๋จธ์ง€ /api/| WEB[web ์„œ๋ฒ„ :8080]
  • ํฌํŠธ๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ๊ณผ ๋˜‘๊ฐ™์ด 8080~8085๋กœ ๋งž์ท„๋‹ค. ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ ์ฃผ์†Œ ์ฒด๊ณ„๊ฐ€ ๋กœ์ปฌ๊ณผ ๊ฐ™์•„์ ธ์„œ JEUS ์ „์šฉ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ํ•„์š” ์—†์–ด์กŒ๋‹ค.
  • ์ปจํ…์ŠคํŠธ๋Š” ์ „๋ถ€ /์ด๊ณ , ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ๊ป๋‹ค. ๊ฒฝ๋กœ ๋ถ„๋ฐฐ๋Š” WebtoB๊ฐ€ ๊ฐ ์„œ๋ฒ„๋กœ ์ง์ ‘ ํ•œ๋‹ค.
  • WebtoB ๊ฒฝ๋กœ ๊ทœ์น™์€ ๊ตฌ์ฒด์ ์ธ ๊ฒฝ๋กœ๋ฅผ ๋จผ์ € ์ ๋Š”๋‹ค. (/api/journal/์ด /api/๋ณด๋‹ค ์•ž)
  • ATM ์—์ด์ „ํŠธ๋Š” WebtoB๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ , ๋‚ด๋ถ€ L4๋ฅผ ํ†ตํ•ด journalยทfile ์„œ๋ฒ„๋กœ ๋ฐ”๋กœ ๋“ค์–ด์˜จ๋‹ค.

โ‘ก๋ฅผ ๊ณ ๋ฅธ ์ด์œ ์™€ ๊ฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ
์–ป๋Š” ๊ฒƒ ๊ฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ
๋ชจ๋“ˆ๋ณ„ ์žฅ์•  ๊ฒฉ๋ฆฌ (ํ•œ ๋ชจ๋“ˆ์˜ OOMยท์Šค๋ ˆ๋“œ ๊ณ ๊ฐˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋ฒˆ์ง€์ง€ ์•Š์Œ) JVM 6๊ฐœ๋ถ„ ๋ฉ”๋ชจ๋ฆฌยทCPU โ†’ ์„œ๋ฒ„๋‹น ํž™์„ 512m~768m๋กœ ์ž‘๊ฒŒ
๋ชจ๋“ˆ๋งŒ ๋”ฐ๋กœ ์žฌ๊ธฐ๋™ (์ด์ „์—๋Š” 6๊ฐœ๊ฐ€ ํ•จ๊ป˜ ๋‚ด๋ ค๊ฐ) ์„œ๋ฒ„ ์ƒ์„ฑยทWebtoB ์ปค๋„ฅํ„ฐ ๋“ฑ๋ก ๊ฐ™์€ WAS ๋‹ด๋‹น ์ž‘์—…
๋กœ์ปฌ๊ณผ ๊ฐ™์€ ์ฃผ์†Œ ์ฒด๊ณ„ (8080~8085, ์ปจํ…์ŠคํŠธ /) ์„œ๋ฒ„๋งˆ๋‹ค ๋กœ๊ทธยท์žฌ๊ธฐ๋™ ๋ฉ”๋‰ดยท๋ชจ๋‹ˆํ„ฐ๋ง์ด ๋”ฐ๋กœ
๊ฒŒ์ดํŠธ์›จ์ด ์ œ๊ฑฐ โ†’ ์ง€์—ฐยท์ฒ˜๋ฆฌ๋Ÿ‰ ์†ํ•ด์™€ ๊ต์ฐฉ ์œ„ํ—˜์ด ์‚ฌ๋ผ์ง WebtoB ๊ฒฝ๋กœ ๊ทœ์น™์ด 6๊ฐœ ์„œ๋ฒ„๋กœ ๋Š˜์–ด๋‚จ


๋ฐ”๋€ ๊ฒƒ โ€” ์†Œ์Šค๋Š” yml ๋ช‡ ์ค„


๊ตฌ์„ฑ์€ ํฌ๊ฒŒ ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ ์†Œ์Šค ๋ณ€๊ฒฝ์€ ์˜์™ธ๋กœ ์ž‘์•˜๋‹ค. ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ ์ฃผ์†Œ๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์œผ๊ณ , ๊ฐ ๋ชจ๋“ˆ์ด ๊ทธ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ํ–ˆ๋‹ค.

โ‘  ๊ณตํ†ต ์„ค์ • jeus-common.yml โ€” ๋ชจ๋“ˆ๋ณ„ ์ฃผ์†Œ๋ฅผ ํ•œ ๊ณณ์—

jeus:
  host: 10.0.20.15        # ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹ค์ œ๋กœ LISTEN ํ•˜๋Š” ์ฃผ์†Œ
  url:
    web:     http://${jeus.host}:8080
    journal: http://${jeus.host}:8081
    batch:   http://${jeus.host}:8082
    file:    http://${jeus.host}:8083
    ifin:    http://${jeus.host}:8084
    ifex:    http://${jeus.host}:8085

โ‘ก ๋ชจ๋“ˆ๋ณ„ application-jeus.yml โ€” ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๋„๊ณ  ์ฃผ์†Œ๋Š” ์ฐธ์กฐ๋งŒ

spring:
  config:
    import: classpath:jeus-common.yml

# ๋ ˆ๊ฑฐ์‹œ ์—์ด์ „ํŠธ .do ๊ฒฝ๋กœ โ†’ atms-journal
agent:
  proxy:
    journal-base-url: ${jeus.url.journal}

# ๋ชจ๋“ˆ ๊ฒฝ๋กœ๋Š” WebtoB ๊ฐ€ ๊ฐ ์„œ๋ฒ„๋กœ ๋ฐ”๋กœ ๋ณด๋‚ธ๋‹ค โ†’ atms-web ์ด ์ „๋‹ฌํ•˜์ง€ ์•Š์Œ
gateway:
  enabled: false

โ‘ข ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ โ€” ๋ชจ๋“ˆ โ†’ ํฌํŠธ, ์žฌ๊ธฐ๋™์€ ๊ทธ ์„œ๋ฒ„๋งŒ

  • ๊ธฐ๋™ ํ™•์ธ์€ http://<์„œ๋ฒ„>:<ํฌํŠธ>/v3/api-docs๊ฐ€ 200์ธ์ง€๋กœ ๋ณธ๋‹ค. (actuator health๋Š” DB๊ฐ€ ๋ถ™๊ธฐ ์ „์—๋Š” 503์ด๋ผ ๋Œ€์‹  ์‚ฌ์šฉ)
  • Jenkins ๋ฐฐํฌ ๋’ค ์žฌ๊ธฐ๋™๋„ ๋ฐฐํฌํ•œ ๋ชจ๋“ˆ์˜ ์„œ๋ฒ„๋งŒ ํ•˜๋‚˜์”ฉ ํ•œ๋‹ค. ์žฌ๊ธฐ๋™ ์ˆ˜๋‹จ์ด ์•„์ง ์—†๋Š” ๋ชจ๋“ˆ์€ ํŒŒ์ผ๋งŒ ๊ต์ฒดํ•˜๊ณ  ๋นŒ๋“œ๋ฅผ UNSTABLE๋กœ ํ‘œ์‹œํ•ด์„œ ์‚ฌ๋žŒ์ด ํ™•์ธํ•˜๊ฒŒ ํ–ˆ๋‹ค.
127.0.0.1๋กœ๋Š” ์•ˆ ๋œ๋‹ค

์ด์ „ ๊ตฌ์„ฑ์—์„œ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์„œ๋ฒ„ IP์—๋งŒ LISTENํ•˜๊ณ  ์žˆ์–ด์„œ, 127.0.0.1๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•ญ์ƒ 000์„ ๋ฐ›์€ ์ ์ด ์žˆ๋‹ค. ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ ์ฃผ์†Œ์™€ ํ—ฌ์Šค์ฒดํฌ ์ฃผ์†Œ๋Š” ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์‹ค์ œ๋กœ LISTENํ•˜๋Š” ์ฃผ์†Œ์™€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ss -ltn์œผ๋กœ ๋จผ์ € ํ™•์ธํ•˜์ž.



๊ฒฐ๋ก 

  • ๊ฒŒ์ดํŠธ์›จ์ด ์ตœ์ ํ™” X
  • ์„œ๋ฒ„ 1๊ฐœ + ์ปจํ…์ŠคํŠธ 6๊ฐœ ์œ ์ง€ X
  • ๋ชจ๋“ˆ๋งˆ๋‹ค JVM ํ•˜๋‚˜ โ€” ๋งค๋‹ˆ์ง€๋“œ ์„œ๋ฒ„ 6๊ฐœ + WebtoB ๊ฒฝ๋กœ ๋ถ„๋ฐฐ O

์ฒ˜์Œ ๊ตฌ์„ฑ์€ "JEUS ํ•˜๋‚˜์— ๋‹ค ์˜ฌ๋ฆฐ๋‹ค"๋Š” ์ง๊ด€์—์„œ ์ถœ๋ฐœํ–ˆ๊ณ , ๊ทธ ์ง๊ด€์„ ์ง€ํ‚ค๋ ค๊ณ  ๊ฒŒ์ดํŠธ์›จ์ด๋ผ๋Š” ์šฐํšŒ๋กœ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ง์ ‘ ์žฌ ๋ณด๋‹ˆ ๊ทธ ์šฐํšŒ๋กœ๊ฐ€ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๋ชจ๋‘์—์„œ ๋น„์šฉ์„ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‹ต์€ ์—…์ฒด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ(๋ชจ๋“ˆ๋‹น ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜)๋ฅผ WAS์˜ ์–ธ์–ด๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

AI์™€์˜ ํ˜‘์—…์—์„œ ๊ฐ€์žฅ ๋„์›€์ด ๋œ ๊ฑด ์ •๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, "JEUS 6๊ฐœ"์ฒ˜๋Ÿผ ๋ชจํ˜ธํ•œ ๋ง์„ ์งˆ๋ฌธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ ๊ฐœ๋…๋ถ€ํ„ฐ ๋งž์ถ˜ ๊ฒƒ์ด์—ˆ๋‹ค. ์šฉ์–ด๊ฐ€ ์ •๋ฆฌ๋˜์ž WAS ๋‹ด๋‹น์—๊ฒŒ ๋ณด๋‚ผ ์š”์ฒญ์„œ๋„ ํ•œ ์žฅ์œผ๋กœ ์ •๋ฆฌ๋๋‹ค.



๋‹ค์Œ์—๋Š” ์ธํ„ฐ๋„ท์ด ๋ง‰ํžŒ ํ์‡„๋ง์—์„œ Gitea + Jenkins๋กœ CI/CD๋ฅผ ๋‹ค์‹œ ๊ตฌ์„ฑํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.