Skip to content

๐Ÿš€[๊ธฐ๋Šฅ๊ฐœ์„ ][Infra] ์„ค์ •ยท์ธํ”„๋ผ ์œ„์ƒ ๋ฐ ์ธก์ • ๊ธฐ๋ฐ˜ ํ™•๋ณด (์„œ๋ธŒํ”„๋กœ์ ํŠธ A)ย #806

Open

Description

@Cassiiopeia

๐Ÿ“ ํ˜„์žฌ ๋ฌธ์ œ์ 

ํ”„๋กœ์ ํŠธ๊ฐ€ 12๊ฐœ ๋ชจ๋“ˆ / Java 346ํŒŒ์ผ ๊ทœ๋ชจ๋กœ ์„ฑ์žฅํ•˜๋Š” ๋™์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •์€ ์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ํฌ๊ฒŒ ์†๋Œ€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค ์‹ค์ธก ๊ฒฐ๊ณผ ์•„๋ž˜ ๋ฌธ์ œ๊ฐ€ ํ™•์ธ๋์Šต๋‹ˆ๋‹ค.

  • open-in-view ์„ค์ •์ด ๋ฌด์‹œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. application.yml์—์„œ ์ด ํ‚ค๊ฐ€ spring.jpa.properties.hibernate ์•„๋ž˜์— ์žˆ๋Š”๋ฐ, Spring Boot๊ฐ€ ์ธ์‹ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋Š” spring.jpa ์ง์†์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ false๋กœ ์ ์–ด๋‘” ์„ค์ •์ด ์ ์šฉ๋˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ๊ฐ’ true๋กœ ๋™์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค.
  • ์šด์˜์—์„œ SQL์ด ์ „๋Ÿ‰ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. show_sql, format_sql, use_sql_comments๊ฐ€ ๋ชจ๋‘ true์ด๊ณ  ์šด์˜ ํ”„๋กœํ•„์— ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. show_sql์€ ๋กœ๊ฑฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  stdout์œผ๋กœ ์งํ–‰ํ•ด ๋กœ๊ทธ๋ ˆ๋ฒจ๋กœ ์ฐจ๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ปค๋„ฅ์…˜ ํ’€ ์„ค์ •์ด ์ „๋ฌดํ•ฉ๋‹ˆ๋‹ค. ์–ด๋А yml์—๋„ hikari ์„ค์ •์ด ์—†์–ด HikariCP ๊ธฐ๋ณธ๊ฐ’(ํ’€ ํฌ๊ธฐ 10)์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • JPA ๋ฐฐ์น˜/ํŽ˜์น˜ ํŠœ๋‹์ด ์ „๋ฌดํ•ฉ๋‹ˆ๋‹ค. default_batch_fetch_size๊ฐ€ ์—†์–ด ์ง€์—ฐ ๋กœ๋”ฉ N+1์ด ๊ทธ๋Œ€๋กœ N+1๋กœ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค.
  • ์šด์˜ ๋กœ๊ทธ๋ ˆ๋ฒจ์ด DEBUG์ž…๋‹ˆ๋‹ค. com.romrom, suh-logger, suh-api-log๊ฐ€ ๋ชจ๋‘ DEBUG์ด๊ณ  logback-spring.xml์—๋„ ์ค‘๋ณต ํ•˜๋“œ์ฝ”๋”ฉ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”ํŠธ๋ฆญ ๋…ธ์ถœ์ด ์—†์Šต๋‹ˆ๋‹ค. actuator ์˜์กด์„ฑ์€ ์žˆ์œผ๋‚˜ health๋งŒ ๋…ธ์ถœ๋ผ ์„ฑ๋Šฅ ๊ฐœ์„  ํšจ๊ณผ๋ฅผ ์ธก์ •ํ•  ์ˆ˜๋‹จ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” Flyway ์†์„ฑ์ด ์„ค์ •๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. spring.flyway.repair-on-migrate๋Š” Spring Boot 3.4.1์˜ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์—†๋Š” ํ‚ค๋กœ, "๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „ ์ž๋™ repair"๋ผ๋Š” ์ฃผ์„๊ณผ ๋‹ฌ๋ฆฌ ์กฐ์šฉํžˆ ๋ฌด์‹œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ / ์ œ์•ˆ ๊ธฐ๋Šฅ

์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ์„ค์ •๋งŒ์œผ๋กœ ์„ฑ๋Šฅยท์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ํ›„์† ๊ฐœ์„  ์ž‘์—…์˜ ํšจ๊ณผ๋ฅผ ์ˆซ์ž๋กœ ์ฆ๋ช…ํ•  ์ธก์ • ๊ธฐ๋ฐ˜์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

  • open-in-view ํ‚ค๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ์˜ฎ๊ธฐ๋˜ ํ˜„์žฌ ์‹ค์ œ ๋™์ž‘๊ฐ’์ธ true๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. false ์ „ํ™˜์€ ๋ฏธ๋ณดํ˜ธ LAZY ์—ฐ๊ด€๊ด€๊ณ„ ๊ฐ์‚ฌ๊ฐ€ ์„ ํ–‰๋ผ์•ผ ํ•˜๋ฏ€๋กœ ํ›„์† ์ž‘์—…์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • SQL ๋กœ๊น…์„ stdout ์งํ–‰ ๋ฐฉ์‹์—์„œ logback์„ ๊ฒฝ์œ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ต์ฒดํ•ด ํ”„๋กœํ•„๋ณ„ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • HikariCP ํ’€ ์„ค์ •๊ณผ JPA ๋ฐฐ์น˜ ํŽ˜์น˜ ํŠœ๋‹์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ๋ ˆ๋ฒจ ์ •์˜๋ฅผ yml ๋‹จ์ผ ์†Œ์Šค๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค.
  • Prometheus ๋ฉ”ํŠธ๋ฆญ์„ ๋…ธ์ถœํ•ด ์ปค๋„ฅ์…˜ ํ’€ยท์ฟผ๋ฆฌยท์—”๋“œํฌ์ธํŠธ p95๋ฅผ ๊ด€์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์ž‘์—… ๋‚ด์šฉ

  • application.yml์˜ open-in-view ํ‚ค ์œ„์น˜ ๊ต์ • (spring.jpa ์ง์†์œผ๋กœ ์ด๋™)
  • show_sql / format_sql / use_sql_comments ์ œ๊ฑฐ ํ›„ dev ํ”„๋กœํ•„์˜ org.hibernate.SQL ๋กœ๊ฑฐ๋กœ ๋Œ€์ฒด
  • default_batch_fetch_size: 100, jdbc.batch_size, jdbc.fetch_size, order_inserts, order_updates, in_clause_parameter_padding ์ถ”๊ฐ€
  • HikariCP ํ’€ ์„ค์ • ์ถ”๊ฐ€ (ํ’€ ํฌ๊ธฐ 20, ๋ˆ„์ˆ˜ ํƒ์ง€ 5์ดˆ)
  • logback-spring.xml์˜ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋กœ๊ทธ๋ ˆ๋ฒจ ์ œ๊ฑฐ โ€” Appender ์ •์˜๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ์ •๋ฆฌ
  • micrometer-registry-prometheus ์˜์กด์„ฑ ์ถ”๊ฐ€ ๋ฐ actuator์— metrics, prometheus ๋…ธ์ถœ
  • ๋ฌด์‹œ๋˜๊ณ  ์žˆ๋˜ spring.flyway.repair-on-migrate ์ œ๊ฑฐ
  • ์šด์˜ยทํ…Œ์ŠคํŠธ ํ”„๋กœํ•„ ๋กœ๊ทธ๋ ˆ๋ฒจ INFO ์ „ํ™˜ (GitHub Secret APPLICATION_PROD_YML, APPLICATION_TEST_YML ๊ฐฑ์‹  ํ•„์š”)
  • ์„ค์ • ํ‚ค ์œ„์น˜ยท์กด์žฌ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํšŒ๊ท€ ๋ฐฉ์ง€ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ (Spring ์ปจํ…์ŠคํŠธยทDB ๋ถˆํ•„์š”)
  • ์„ค์ • ๋Ÿฐํƒ€์ž„ ๋ฐ”์ธ๋”ฉ ๋ฐ actuator ์ธ์ฆ ๋ณดํ˜ธ ๊ฒ€์ฆ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
  • ๋ฐฐํฌ ํ›„ Prometheus ์ง€ํ‘œ ์ˆ˜์ง‘ ๋ฐ ์ฃผ์š” ์—”๋“œํฌ์ธํŠธ p95 ๋ฒ ์ด์Šค๋ผ์ธ ๊ธฐ๋ก

๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ (์˜๋„๋œ ์šด์˜ ์„ค๊ณ„์ด๋ฏ€๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์‹ค์ˆ˜๋กœ ๋ฐ”๋€Œ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์žก๋„๋ก ๊ฐ€๋“œ ํ…Œ์ŠคํŠธ๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค)

  • spring.jpa.hibernate.ddl-auto: update, spring.jpa.generate-ddl: true
  • spring.flyway.validate-on-migrate: false โ€” ์ผœ๋ฉด ์ฒดํฌ์„ฌ์ด ๊นจ์ง„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์—์„œ ๋ฐฐํฌ๊ฐ€ ์ฆ‰์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค
  • /actuator/health์˜ ์ธ์ฆ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ โ€” Dockerfile HEALTHCHECK์™€ Traefik ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ์ „ํ™˜์ด ์˜์กดํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“„ ๊ด€๋ จ ๋ฌธ์„œ

  • ์„ค๊ณ„: docs/superpowers/specs/2026-07-27-infra-config-hygiene-design.md
  • ๊ตฌํ˜„ ๊ณ„ํš: docs/superpowers/plans/2026-07-27-infra-config-hygiene.md

์ „์ฒด ๊ฐœ์„  ๋กœ๋“œ๋งต์—์„œ ์ด ์ด์Šˆ๋Š” ์„œ๋ธŒํ”„๋กœ์ ํŠธ A์— ํ•ด๋‹นํ•˜๋ฉฐ, ์ดํ›„ B(๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€), C(๊ด€์ธก์„ฑ/๋กœ๊น…), D(๋ฐฑ์—”๋“œ ์„ฑ๋Šฅ/๊ตฌ์กฐ)๊ฐ€ ์ˆœ์ฐจ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. D์˜ N+1 ์ œ๊ฑฐ์™€ OSIV ์ „ํ™˜์€ ์ด ์ž‘์—…์—์„œ ํ™•๋ณดํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ๊ทผ๊ฑฐ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ ๋‹ด๋‹น์ž

  • ๋ฐฑ์—”๋“œ: SUH SAECHAN

Activity

  1. self-assigned this
    on Jul 26, 2026
  2. github-actions commented on Jul 26, 2026

    @github-actions

    Chuseok22 Issue Helper

    ๋ธŒ๋žœ์น˜๋ช…

    20260726_#806_์„ค์ •_์ธํ”„๋ผ_์œ„์ƒ_๋ฐ_์ธก์ •_๊ธฐ๋ฐ˜_ํ™•๋ณด_์„œ๋ธŒํ”„๋กœ์ ํŠธ_A
    

    ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€

    ์„ค์ •_์ธํ”„๋ผ_์œ„์ƒ_๋ฐ_์ธก์ •_๊ธฐ๋ฐ˜_ํ™•๋ณด_์„œ๋ธŒํ”„๋กœ์ ํŠธ_A : feat : {๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์„ค๋ช…} https://github.com/TEAM-ROMROM/RomRom-BE/issues/806
    
  3. added
    ์ž‘์—…์ „์ž‘์—… ์‹œ์ž‘ ์ „ ์ค€๋น„ ์ƒํƒœ
    and removed
    ์ž‘์—…์ค‘์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ธ ์ƒํƒœ
    on Jul 26, 2026
  4. added 8 commits that reference this issue on Jul 26, 2026
  5. Cassiiopeia commented on Jul 31, 2026

    @Cassiiopeia
    MemberAuthor

    ์„ค์ •ยท์ธํ”„๋ผ ์œ„์ƒ ๋ฐ ์ธก์ • ๊ธฐ๋ฐ˜ ํ™•๋ณด (์„œ๋ธŒํ”„๋กœ์ ํŠธ A)

    ๊ฐœ์š”

    ํ”„๋กœ์ ํŠธ๊ฐ€ 12๊ฐœ ๋ชจ๋“ˆ / Java 346ํŒŒ์ผ๋กœ ์„ฑ์žฅํ•˜๋Š” ๋™์•ˆ ์†๋Œ€์ง€ ์•Š์•˜๋˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋กœ์ง ๋ณ€๊ฒฝ ์—†์ด ์„ค์ •๋งŒ์œผ๋กœ JPA ๋ฐฐ์น˜ ํŽ˜์น˜ยท์ปค๋„ฅ์…˜ ํ’€ยท๋กœ๊ทธ ์ถœ๋ ฅ์„ ์ •์ƒํ™”ํ•˜๊ณ , ์ดํ›„ ๊ฐœ์„  ์ž‘์—…์˜ ํšจ๊ณผ๋ฅผ ์ˆซ์ž๋กœ ์ฆ๋ช…ํ•  Prometheus ์ธก์ • ๊ธฐ๋ฐ˜์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.

    ์ž‘์—… ์ค‘ ์„ค์ • ํ‚ค๊ฐ€ ์ž˜๋ชป๋œ ์œ„์น˜์— ์žˆ์–ด ์กฐ์šฉํžˆ ๋ฌด์‹œ๋˜๋˜ ์‚ฌ๋ก€ 2๊ฑด๊ณผ, ๋ฐฐํฌ ํ›„ ์‹ค์ธก์—์„œ ๋ฉ”ํŠธ๋ฆญ ์—”๋“œํฌ์ธํŠธ์— ์•„๋ฌด๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋˜ ๋ฌธ์ œ 1๊ฑด์„ ๋ฐœ๊ฒฌํ•ด ํ•จ๊ป˜ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๊ด€๋ จ PR: #807 (์„ค์ • ์œ„์ƒ + ์ธก์ • ๊ธฐ๋ฐ˜), #811 (actuator ์ธ์ฆ ๊ฒฝ๋กœ ๋ณด๊ฐ•)

    ๊ธฐ๋Šฅ ํ๋ฆ„

    ๋ฉ”ํŠธ๋ฆญ ์—”๋“œํฌ์ธํŠธ ์ ‘๊ทผ ๊ฒฝ๋กœ๊ฐ€ ์ด๋ฒˆ ์ž‘์—…์˜ ํ•ต์‹ฌ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

    flowchart TD
        A(["/actuator/* ์š”์ฒญ"]) --> B{"AUTH_WHITELIST<br/>๋งค์นญ?"}
        B -->|"์˜ˆ (/actuator/health)"| C["์ธ์ฆ ์—†์ด ํ†ต๊ณผ"]
        C --> D(["200 OK"])
        B -->|์•„๋‹ˆ์˜ค| E{"AdminJwtAuthenticationFilter<br/>์ฒ˜๋ฆฌ ๋Œ€์ƒ?"}
        E -->|"์•„๋‹ˆ์˜ค (์ˆ˜์ • ์ „)"| F["์ธ์ฆ ์ฃผ์ฒด ๋ฏธ์„ค์ •"]
        F --> G["hasRole ADMIN ๊ฒ€์‚ฌ<br/>์ต๋ช…์œผ๋กœ ํŒ์ •"]
        G --> H(["403 โ€” ๊ด€๋ฆฌ์ž๋„ ์ ‘๊ทผ ๋ถˆ๊ฐ€"])
        E -->|"์˜ˆ (์ˆ˜์ • ํ›„)"| I["Bearer ํ† ํฐ ๋˜๋Š”<br/>accessToken ์ฟ ํ‚ค ์ถ”์ถœ"]
        I --> J{"ํ† ํฐ ์œ ํšจ?"}
        J -->|์•„๋‹ˆ์˜ค| K(["401"])
        J -->|์˜ˆ| L{"ROLE_ADMIN?"}
        L -->|์•„๋‹ˆ์˜ค| K
        L -->|์˜ˆ| M["SecurityContext ์ธ์ฆ ์„ค์ •"]
        M --> N(["200 โ€” ๋ฉ”ํŠธ๋ฆญ ๋ฐ˜ํ™˜"])
    
    Loading

    ๋ณ€๊ฒฝ ์‚ฌํ•ญ

    ๋ฌด์‹œ๋˜๊ณ  ์žˆ๋˜ ์„ค์ • ๊ต์ •

    • RomRom-Web/src/main/resources/application.yml: open-in-view ํ‚ค๊ฐ€ spring.jpa.properties.hibernate ์•„๋ž˜์— ์žˆ์–ด Spring Boot๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. false๋กœ ์ ํ˜€ ์žˆ์—ˆ์œผ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๊ธฐ๋ณธ๊ฐ’ true๋กœ ๋™์ž‘ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. spring.jpa ์ง์†์œผ๋กœ ์ด๋™ํ•˜๊ณ  ํ˜„์žฌ ์‹ค์ œ ๋™์ž‘๊ฐ’์ธ true๋ฅผ ๋ช…์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
    • RomRom-Web/src/main/resources/application.yml: spring.flyway.repair-on-migrate ์ œ๊ฑฐ. Spring Boot 3.4.1 ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค๋กœ, "๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „ ์ž๋™ repair"๋ผ๋Š” ์ฃผ์„๊ณผ ๋‹ฌ๋ฆฌ ํ•œ ๋ฒˆ๋„ ๋™์ž‘ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

    ์„ฑ๋Šฅ

    • application.yml: default_batch_fetch_size: 100 ์ถ”๊ฐ€ โ€” ์ง€์—ฐ ๋กœ๋”ฉ N+1์„ IN ์ ˆ ๋ฐฐ์น˜ ์กฐํšŒ๋กœ ์ ‘์Šต๋‹ˆ๋‹ค.
    • application.yml: jdbc.batch_size: 50, jdbc.fetch_size: 100, order_inserts, order_updates, query.in_clause_parameter_padding ์ถ”๊ฐ€
    • application.yml: HikariCP ์„ค์ • ์‹ ๊ทœ ์ถ”๊ฐ€. ๊ธฐ์กด์—๋Š” ์„ค์ •์ด ์ „๋ฌดํ•ด ๊ธฐ๋ณธ ํ’€ ํฌ๊ธฐ 10์œผ๋กœ ๋™์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ’€ 20, ๋ˆ„์ˆ˜ ํƒ์ง€ 5์ดˆ, ์ปค๋„ฅ์…˜ ํƒ€์ž„์•„์›ƒ 10์ดˆ.

    ๋กœ๊น…

    • application.yml: show_sql / format_sql / use_sql_comments ์ œ๊ฑฐ. show_sql์€ ๋กœ๊ฑฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  stdout์œผ๋กœ ์งํ–‰ํ•ด ์šด์˜์—์„œ ๋กœ๊ทธ๋ ˆ๋ฒจ๋กœ ์ฐจ๋‹จํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
    • application-dev.yml: org.hibernate.SQL: DEBUG, org.hibernate.orm.jdbc.bind: TRACE๋กœ ๋Œ€์ฒด. logback์„ ๊ฒฝ์œ ํ•˜๋ฏ€๋กœ ํ”„๋กœํ•„๋ณ„ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • RomRom-Web/src/main/resources/logback-spring.xml: ํ•˜๋“œ์ฝ”๋”ฉ๋œ <logger> ์ •์˜ ์ „๋ถ€ ์ œ๊ฑฐ. Appender ์ •์˜๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ์ •๋ฆฌํ•˜๊ณ  ๋กœ๊ทธ๋ ˆ๋ฒจ์€ ํ”„๋กœํ•„ yml ๋‹จ์ผ ์†Œ์Šค๋กœ ํ†ต์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๊ด€์ธก์„ฑ

    • RomRom-Web/build.gradle: micrometer-registry-prometheus ์ถ”๊ฐ€
    • application.yml: actuator์— metrics, prometheus ๋…ธ์ถœ. health๋Š” ์œ ์ง€.
    • application.yml: hibernate.generate_statistics: true โ€” ์ด ์„ค์ •์ด ์—†์œผ๋ฉด Micrometer๊ฐ€ hibernate_* ๋ฉ”ํŠธ๋ฆญ์„ ์•„์˜ˆ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • RomRom-Domain-Auth/.../SecurityUrls.java: /actuator/prometheus, /actuator/metrics๋ฅผ ADMIN_PATHS์— ์ถ”๊ฐ€ (๊ด€๋ฆฌ์ž ์ „์šฉ)
    • RomRom-Domain-Auth/.../AdminJwtAuthenticationFilter.java: /actuator/ ๊ฒฝ๋กœ๋„ ์ธ์ฆ ์ฒ˜๋ฆฌ ๋Œ€์ƒ์— ํฌํ•จ

    ํ…Œ์ŠคํŠธ

    • RomRom-Web/src/test/java/com/romrom/web/config/ApplicationYamlStructureTest.java (์‹ ๊ทœ, 12๊ฐœ): Spring ์ปจํ…์ŠคํŠธยทDB ์—†์ด ๋„๋Š” ์„ค์ • ํ‚ค ์œ„์น˜/์กด์žฌ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ
    • RomRom-Web/src/test/java/com/romrom/web/config/ConfigBindingTest.java (์‹ ๊ทœ, 6๊ฐœ): ์‹ค๊ธฐ๋™ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

    ์ฃผ์š” ๊ตฌํ˜„ ๋‚ด์šฉ

    ํšŒ๊ท€ ๋ฐฉ์ง€๋ฅผ ๋‘ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆˆ ์ด์œ 

    ์ด๋ฒˆ ์ž‘์—…์˜ ์ถœ๋ฐœ์ ์ด "ํ‚ค๊ฐ€ ์ž˜๋ชป๋œ ์œ„์น˜์— ์žˆ์–ด ์กฐ์šฉํžˆ ๋ฌด์‹œ๋จ"์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ๊ณ„์ธต์„ ์ง์ ‘ ๊ฒจ๋ƒฅํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

    • ApplicationYamlStructureTest๋Š” SnakeYAML๋กœ application.yml์„ ์ง์ ‘ ํŒŒ์‹ฑํ•ด ํ‚ค์˜ ๊ฒฝ๋กœ ์ž์ฒด๋ฅผ ๋‹จ์–ธํ•ฉ๋‹ˆ๋‹ค. Spring ์ปจํ…์ŠคํŠธ๋ฅผ ๋„์šฐ์ง€ ์•Š์•„ DBยทRedis ์—†์ด ์–ด๋””์„œ๋‚˜ ๋•๋‹ˆ๋‹ค.
    • ConfigBindingTest๋Š” ์‹ค์ œ๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„์›Œ Spring์ด ๊ทธ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. RANDOM_PORT๋กœ ์‹ค์ œ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด ๋ณด์•ˆ ๋™์ž‘๊นŒ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

    ๋‘ ๊ณ„์ธต ์ค‘ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด "ํ‚ค๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ž๋ฆฌ์— ์žˆ๋Š”๋ฐ ๋ฐ”์ธ๋”ฉ์ด ์•ˆ ๋˜๋Š”" ๊ฒฝ์šฐ๋‚˜ "์ธํ”„๋ผ๊ฐ€ ์—†์œผ๋ฉด ํšŒ๊ท€ ๋ฐฉ์ง€ ์ž์ฒด๊ฐ€ ์ฃฝ๋Š”" ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

    ๋ณ€๊ฒฝ ๊ธˆ์ง€ ๊ฐ€๋“œ

    ์˜๋„๋œ ์šด์˜ ์„ค๊ณ„์ธ ์•„๋ž˜ ํ•ญ๋ชฉ๋“ค์€ ๊ฐ’์ด ์‹ค์ˆ˜๋กœ ๋ฐ”๋€Œ๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋„๋ก ๊ฐ€๋“œ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

    • spring.jpa.hibernate.ddl-auto: update, spring.jpa.generate-ddl: true โ€” Spring์ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ์€ Hibernate์— ๋งก๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋งŒ Flyway๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์šด์˜ ๋ฐฉ์‹
    • spring.flyway.validate-on-migrate: false โ€” ์ผœ๋ฉด ์ฒดํฌ์„ฌ์ด ๊นจ์ง„ ๊ธฐ์กด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์—์„œ ๋ฐฐํฌ๊ฐ€ ์ฆ‰์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค
    • management.endpoints.web.exposure.include์˜ health โ€” Dockerfile HEALTHCHECK์™€ Traefik ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ์ „ํ™˜์ด ์˜์กดํ•ฉ๋‹ˆ๋‹ค

    ๋ฐฐํฌ ํ›„ ๋ฐœ๊ฒฌํ•œ ๋ฉ”ํŠธ๋ฆญ ์ ‘๊ทผ ๋ถˆ๊ฐ€ ๋ฌธ์ œ

    /actuator/prometheus๋ฅผ ADMIN_PATHS๋กœ ๋ณดํ˜ธํ•œ ๋’ค ์šด์˜์—์„œ ์‹ค์ธกํ–ˆ๋”๋‹ˆ ๊ด€๋ฆฌ์ž ํ† ํฐ์œผ๋กœ๋„ 403์ด ๋‚ฌ์Šต๋‹ˆ๋‹ค.

    ์›์ธ์€ ๋‘ ์ธ์ฆ ํ•„ํ„ฐ ๋ชจ๋‘ /actuator/*๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. TokenAuthenticationFilter๋Š” /api/๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ์—์„œ๋งŒ Bearer ํ† ํฐ์„ ์ฝ๊ณ , AdminJwtAuthenticationFilter๋Š” /admin, /api/admin, Swagger ๊ฒฝ๋กœ๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ actuator ์š”์ฒญ์€ ์ธ์ฆ ์ฃผ์ฒด๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ์ฑ„ hasRole("ADMIN") ๊ฒ€์‚ฌ์— ๋„๋‹ฌํ•ด ์ต๋ช…์œผ๋กœ ํŒ์ •๋์Šต๋‹ˆ๋‹ค.

    AdminJwtAuthenticationFilter๊ฐ€ ์ด๋ฏธ Swagger๋ผ๋Š” ๋น„-/api ๊ฒฝ๋กœ๋ฅผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์–ด, ๊ทธ ํŒจํ„ด์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ /actuator/๋ฅผ ์ฒ˜๋ฆฌ ๋Œ€์ƒ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. /actuator/health๋Š” ํ•„ํ„ฐ์˜ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์ฒดํฌ๊ฐ€ ํ”„๋ฆฌํ”ฝ์Šค ์ฒดํฌ ๋’ค์— ์žˆ์–ด ์—ฌ์ „ํžˆ ๋ฏธ์ธ์ฆ 200์ž…๋‹ˆ๋‹ค.

    ๋ฐฐํฌ ํ›„ ์‹ค์ธก ๊ฒฐ๊ณผ

    • ๋ธ”๋ฃจ โ†’ ๊ทธ๋ฆฐ ์ „ํ™˜ ์„ฑ๊ณต, ๊ธฐ๋™ 56.1์ดˆ, ๊ธฐ๋™ ์˜ˆ์™ธ ์—†์Œ
    • ์šด์˜ ๋กœ๊ทธ์— RomRomHikariPool ํ™•์ธ โ€” ์„ค์ •์ด ์‹ค์ œ ์šด์˜์— ๋ฐ˜์˜๋œ ์ง์ ‘ ์ฆ๊ฑฐ (๊ธฐ๋ณธ๊ฐ’์€ HikariPool-1)
    • ํฌ๋งท ์—†๋Š” raw SQL ์ถœ๋ ฅ 0๊ฑด โ€” show_sql ์ œ๊ฑฐ ํ™•์ธ
    • ์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜ ๊ฒฝ๊ณ  0๊ฑด
    • /actuator/health ๋ฏธ์ธ์ฆ 200 โ€” ํ—ฌ์Šค์ฒดํฌ ๊ฒฝ๋กœ ์ •์ƒ
    • ๊ด€๋ฆฌ์ž ์ธ์ฆ ํ›„ /actuator/prometheus 200, ๋ณธ๋ฌธ์— hikaricp_ยทjvm_ ์ง€ํ‘œ ํฌํ•จ

    PostgreSQL max_connections๋Š” ์‹ค์ธก ๊ฒฐ๊ณผ 200์ด๊ณ  ์‚ฌ์šฉ๋Ÿ‰์€ 59์˜€์Šต๋‹ˆ๋‹ค. ํ’€ 20์ด๋ฉด ๋ธ”๋ฃจ+๊ทธ๋ฆฐ+ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ํ•ฉ์ณ๋„ ์—ฌ์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฃผ์˜์‚ฌํ•ญ

    ์šด์˜ ๋กœ๊ทธ๋ ˆ๋ฒจ์€ ์•„์ง DEBUG์ž…๋‹ˆ๋‹ค

    application-prod.yml์€ GitHub Secret APPLICATION_PROD_YML์—์„œ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ๋กœ์ปฌ ์‚ฌ๋ณธ์ด ์šด์˜ ๋ฐฐํฌ๋ณธ๊ณผ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค.

    ์šด์˜ ์‹ค์ œ:  generation-model: gemini-3.1-flash-lite
    ๋กœ์ปฌ ์‚ฌ๋ณธ:  generation-model: gemini-2.0-flash-lite-001
    

    ๋กœ์ปฌ ์‚ฌ๋ณธ์œผ๋กœ Secret์„ ๋ฎ์–ด์ผ๋‹ค๋ฉด ์šด์˜ Vertex AI ์ƒ์„ฑ ๋ชจ๋ธ์ด ์กฐ์šฉํžˆ ๊ตฌ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ๋์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Secret์€ write-only๋ผ ๊ถŒ์œ„ ์žˆ๋Š” ์ตœ์‹ ๋ณธ์„ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์–ด ๊ฐฑ์‹ ์„ ๋ณด๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ๋กœ์ปฌ ์‚ฌ๋ณธ์€ ์šด์˜ ๋ฐฐํฌ๋ณธ๊ณผ ๋™๊ธฐํ™”ํ•˜๊ณ  ๋กœ๊ทธ๋ ˆ๋ฒจ INFO๊นŒ์ง€ ์ ์šฉํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ†  ํ›„ APPLICATION_PROD_YML๊ณผ APPLICATION_TEST_YML์„ ์ง์ ‘ ๊ฐฑ์‹ ํ•˜๋ฉด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ ๋•Œ๋ฌธ์— ๋น ์ง„ ๊ฒƒ์€ ๋กœ๊ทธ๋ ˆ๋ฒจ ํ•˜๋‚˜๋ฟ์ด๊ณ , ๋‚˜๋จธ์ง€ ๊ฐœ์„ ์€ ๊ณตํ†ต application.yml์— ์žˆ์–ด ์ด๋ฏธ ๋ฐ˜์˜๋์Šต๋‹ˆ๋‹ค.

    ํ›„์† ์ž‘์—…

    1. ์ผ๋ฐ˜ ํšŒ์› ํ† ํฐ์˜ ๋ฉ”ํŠธ๋ฆญ ์ ‘๊ทผ ์ฐจ๋‹จ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ โ€” ํ˜„์žฌ ๋™์ž‘์€ ์ •์ƒ(401)์ด๋‚˜, ROLE_ADMIN ๊ฒ€์‚ฌ๊ฐ€ ๋‚˜์ค‘์— ์ œ๊ฑฐ๋˜๋ฉด ์žก์•„๋‚ผ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    2. Prometheus ์Šคํฌ๋ ˆ์ดํผ ์šด์šฉ ์„ค๊ณ„ โ€” ์ง€๊ธˆ์€ ๋งŒ๋ฃŒ๋˜๋Š” ๊ด€๋ฆฌ์ž JWT๋ฅผ ์š”๊ตฌํ•ด ์Šคํฌ๋ ˆ์ดํผ๊ฐ€ ๋ถ™์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™ ๊ณ„์ธก์—๋Š” ๋ฌธ์ œ์—†์ง€๋งŒ ์Šคํฌ๋ ˆ์ดํผ ๋„์ž… ์ „์— ์ •์  ํฌ๋ฆฌ๋ด์…œ ๊ฒฝ๋กœ๋‚˜ ๋„คํŠธ์›Œํฌ ๋ ˆ๋ฒจ ์ œํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    3. OSIV ์ „ํ™˜ โ€” open-in-view: false๋Š” ์ด๋ฒˆ ๋ฒ”์œ„์—์„œ ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค. LAZY ์—ฐ๊ด€๊ด€๊ณ„ 28๊ฐœ ์ค‘ @JsonIgnore๋กœ ๋ณดํ˜ธ๋œ ๊ฒƒ์ด 3๊ฐœ๋ฟ์ด๊ณ  jackson-datatype-hibernate ๋ชจ๋“ˆ์ด ์—†์–ด, Entity๋ฅผ ๊ทธ๋Œ€๋กœ ์‘๋‹ต์— ๋‹ด๋Š” ์ด ํ”„๋กœ์ ํŠธ ์ปจ๋ฒค์…˜๊ณผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ง๋ ฌํ™” ์‹œ์ ์— ์˜ˆ์™ธ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ์—”๋“œํฌ์ธํŠธ ์ „์ˆ˜ ๊ฐ์‚ฌ๊ฐ€ ์„ ํ–‰๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    4. Flyway ์ฒดํฌ์„ฌ ์ •ํ•ฉํ™” โ€” validate-on-migrate๋ฅผ ์ผœ๋ ค๋ฉด ๋จผ์ € ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐฐํฌ ์ƒํƒœ ์ฐธ๊ณ 

    ์ž‘์—… ์ค‘ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, ์šด์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 2026-06-20 ๋นŒ๋“œ ์ด๋ฏธ์ง€๋กœ 5์ฃผ ๋„˜๊ฒŒ ๊ณ ์ •๋ผ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ์ด main์— ๋“ค์–ด๊ฐ„ ์ปค๋ฐ‹๋“ค์ด ๋ฐฐํฌ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€๊ณ , ์ด๋ฒˆ ๋ฐฐํฌ์— ํ•จ๊ป˜ ์‹ค๋ ธ์Šต๋‹ˆ๋‹ค.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

์ž‘์—…์ „์ž‘์—… ์‹œ์ž‘ ์ „ ์ค€๋น„ ์ƒํƒœ

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions