BizSpring.ai

์ง€์‹์„ผํ„ฐ / ๋ ˆํผ๋Ÿฐ์Šค

๐Ÿ—๏ธ DDD ํ™•์žฅ ํ…œํ”Œ๋ฆฟ โ€” Java/PHP ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ์šฉ

# DDD ํ™•์žฅ ํ…œํ”Œ๋ฆฟ โ€” Java/PHP ํ”„๋กœ์ ํŠธ์šฉ > ํ…œํ”Œ๋ฆฟ v1.0 | 2026-02-23 > ์šฉ๋„: ์‚ฌ๋‚ด Java/PHP ํ”„๋กœ์ ํŠธ๋ฅผ Claude ํ”„๋กœ์ ํŠธ ๋ฐฉ์— ์˜จ๋ณด๋”ฉํ•  ๋•Œ ์ด ํ…œํ”Œ๋ฆฟ์„ ์ฑ„์›Œ์„œ ์‚ฌ์šฉ --- ## ์‚ฌ์šฉ๋ฒ• 1. ์ƒˆ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์‹œ ์ด ํ…œํ”Œ๋ฆฟ์„ ๋ณต์‚ฌ 2. ๊ฐ

ํ•ต์‹ฌ ์š”์•ฝ

    # DDD ํ™•์žฅ ํ…œํ”Œ๋ฆฟ โ€” Java/PHP ํ”„๋กœ์ ํŠธ์šฉ

    > ํ…œํ”Œ๋ฆฟ v1.0 | 2026-02-23

    > ์šฉ๋„: ์‚ฌ๋‚ด Java/PHP ํ”„๋กœ์ ํŠธ๋ฅผ Claude ํ”„๋กœ์ ํŠธ ๋ฐฉ์— ์˜จ๋ณด๋”ฉํ•  ๋•Œ ์ด ํ…œํ”Œ๋ฆฟ์„ ์ฑ„์›Œ์„œ ์‚ฌ์šฉ

    ---

    ์‚ฌ์šฉ๋ฒ•

    1. ์ƒˆ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์‹œ ์ด ํ…œํ”Œ๋ฆฟ์„ ๋ณต์‚ฌ
    2. ๊ฐ ์„น์…˜์˜ {placeholder}๋ฅผ ์‹ค์ œ ๊ฐ’์œผ๋กœ ์ฑ„์›€
    3. ์™„์„ฑ๋œ ๋ฌธ์„œ๋ฅผ KHub์— ๋“ฑ๋ก + Claude ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์— ์ถ”๊ฐ€
    4. ํ•„์š” ์‹œ COMMON ์šฉ์–ด ์‚ฌ์ „์— ์ƒˆ ์šฉ์–ด ์ถ”๊ฐ€

    ---

    ๐Ÿ“– ์šฉ์–ด ์‚ฌ์ „ โ€” {ํ”„๋กœ์ ํŠธ๋ช…}

    > COMMON ์šฉ์–ด ์‚ฌ์ „๊ณผ ๋ณ‘ํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ. ํ”„๋กœ์ ํŠธ ๊ณ ์œ  ์šฉ์–ด๋งŒ ์—ฌ๊ธฐ์— ๋“ฑ๋ก.

    DB ํ…Œ์ด๋ธ”

    ์ •๊ทœ ์ด๋ฆ„์Šคํ‚ค๋งˆ์šฉ๋„DB ์œ„์น˜
    {ํ…Œ์ด๋ธ”๋ช…}{์Šคํ‚ค๋งˆ}{์„ค๋ช…}{MySQL/PostgreSQL/Oracle ๋“ฑ}

    ํŒจํ‚ค์ง€/๋ชจ๋“ˆ ๊ตฌ์กฐ

    ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ์—ญํ• ๋น„๊ณ 
    {com.bizspring.xxx.controller}{API ์ปจํŠธ๋กค๋Ÿฌ}
    {com.bizspring.xxx.service}{๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง}
    {com.bizspring.xxx.repository}{๋ฐ์ดํ„ฐ ์ ‘๊ทผ}
    {com.bizspring.xxx.dto}{๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ์ฒด}

    API ์—”๋“œํฌ์ธํŠธ

    MethodPath์šฉ๋„๋‹ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ
    {GET}{/api/v1/xxx}{์„ค๋ช…}{XxxController}

    ์ธํ”„๋ผ ๋ณ„์นญ

    ์ •๊ทœ ์ด๋ฆ„์—ญํ• ์ ‘์† ์ •๋ณด
    {db-production}์šด์˜ DB{host:port/dbname}
    {db-staging}์Šคํ…Œ์ด์ง• DB{host:port/dbname}
    {redis-cache}์บ์‹œ ์„œ๋ฒ„{host:port}

    ์™ธ๋ถ€ ์—ฐ๋™

    ์„œ๋น„์Šค๋ช…์šฉ๋„์ธ์ฆ ๋ฐฉ์‹ํ‚ค ์œ„์น˜
    {Naver API}{๊ฒ€์ƒ‰ ์—ฐ๋™}{API Key}{vault/ํ™˜๊ฒฝ๋ณ€์ˆ˜/DB}

    ---

    ๐ŸŽฏ ๋„๋ฉ”์ธ ํŠธ๋ฆฌ๊ฑฐ โ€” {ํ”„๋กœ์ ํŠธ๋ช…}

    > ํ‚ค์›Œ๋“œ ๊ฐ์ง€ ์‹œ Claude๊ฐ€ ์ž๋™์œผ๋กœ ์ฐธ์กฐํ•  ๋ฌธ์„œ/์ฝ”๋“œ ๋งคํ•‘

    ํ‚ค์›Œ๋“œ๋„๋ฉ”์ธ์ž๋™ ์กฐํšŒ์ฐธ์กฐ ๋Œ€์ƒ
    {๊ฒฐ์ œ, ์ •์‚ฐ}{payment}khub_search("{๊ฒฐ์ œ ๋ชจ๋“ˆ}", "{PROJECT_CODE}"){PaymentService, ๊ฒฐ์ œ ํ”Œ๋กœ์šฐ ๋ฌธ์„œ}
    {ํšŒ์›, ์ธ์ฆ, ๋กœ๊ทธ์ธ}{auth}khub_search("{์ธ์ฆ ๋ชจ๋“ˆ}", "{PROJECT_CODE}"){AuthService, JWT ์„ค์ •}
    {๋กœ๊ทธ, ์ถ”์ , ํŠธ๋ž˜ํ‚น}{tracking}khub_search("{์ถ”์  ๋ชจ๋“ˆ}", "{PROJECT_CODE}"){TrackingController, SDK ๊ฐ€์ด๋“œ}
    {๋ฆฌํฌํŠธ, ํ†ต๊ณ„, ๋Œ€์‹œ๋ณด๋“œ}{report}khub_search("{๋ฆฌํฌํŠธ ๋ชจ๋“ˆ}", "{PROJECT_CODE}"){ReportService, ์ง‘๊ณ„ ์ฟผ๋ฆฌ}
    {๋ฐฐ์น˜, ์Šค์ผ€์ค„, cron}{batch}khub_search("{๋ฐฐ์น˜ ์ฒ˜๋ฆฌ}", "{PROJECT_CODE}"){BatchConfig, ์Šค์ผ€์ค„๋Ÿฌ ์„ค์ •}
    {๋ฐฐํฌ, CI/CD, ๋ฆด๋ฆฌ์ฆˆ}{deploy}khub_search("{๋ฐฐํฌ ๊ฐ€์ด๋“œ}", "{PROJECT_CODE}"){Jenkinsfile, deploy ์Šคํฌ๋ฆฝํŠธ}
    {์„ค์ •, config, properties}{config}khub_search("{ํ™˜๊ฒฝ ์„ค์ •}", "{PROJECT_CODE}"){application.yml, .env}

    ---

    ๐Ÿ† ๊ณจ๋“  ํŒจํ„ด โ€” {ํ”„๋กœ์ ํŠธ๋ช…}

    > ์ƒˆ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์ฐธ์กฐํ•  ํ‘œ์ค€ ๊ตฌ์กฐ. ๊ธฐ์กด ์ฝ”๋“œ ์ค‘ ๊ฐ€์žฅ ์ž˜ ๋œ ๊ฒƒ์„ ๊ณจ๋“ ์œผ๋กœ ์ง€์ •.

    Java ๊ณจ๋“  ํŒจํ„ด

    ํŒจํ„ด ์œ ํ˜•๊ณจ๋“  ํŒŒ์ผ/ํด๋ž˜์Šค์œ„์น˜์ฐธ์กฐ ์ด์œ 
    REST Controller{XxxController.java}{๊ฒฝ๋กœ}{ํ‘œ์ค€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง, Swagger ์–ด๋…ธํ…Œ์ด์…˜}
    Service Layer{XxxServiceImpl.java}{๊ฒฝ๋กœ}{ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ๋กœ๊น… ํŒจํ„ด}
    Repository/DAO{XxxRepository.java}{๊ฒฝ๋กœ}{QueryDSL/JPA ์‚ฌ์šฉ ํŒจํ„ด}
    DTO/Mapper{XxxDto.java + XxxMapper.java}{๊ฒฝ๋กœ}{Validation, MapStruct ์‚ฌ์šฉ}
    Batch Job{XxxBatchConfig.java}{๊ฒฝ๋กœ}{Spring Batch ํ‘œ์ค€ ๊ตฌ์กฐ}
    Test{XxxServiceTest.java}{๊ฒฝ๋กœ}{Mockito + ํ†ตํ•ฉํ…Œ์ŠคํŠธ ํŒจํ„ด}

    PHP ๊ณจ๋“  ํŒจํ„ด

    ํŒจํ„ด ์œ ํ˜•๊ณจ๋“  ํŒŒ์ผ์œ„์น˜์ฐธ์กฐ ์ด์œ 
    Controller{XxxController.php}{๊ฒฝ๋กœ}{๋ฏธ๋“ค์›จ์–ด, ์—๋Ÿฌ ํ•ธ๋“ค๋ง}
    Model{Xxx.php}{๊ฒฝ๋กœ}{Eloquent ๊ด€๊ณ„, ์Šค์ฝ”ํ”„}
    Service{XxxService.php}{๊ฒฝ๋กœ}{๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„๋ฆฌ}
    Migration{create_xxx_table.php}{๊ฒฝ๋กœ}{์ธ๋ฑ์Šค, FK ์„ค์ • ํ‘œ์ค€}

    ๊ณตํ†ต ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜

    ํ•ญ๋ชฉ๊ทœ์น™
    ๋„ค์ด๋ฐ{camelCase/snake_case/PascalCase ๊ธฐ์ค€}
    ์—๋Ÿฌ ํ•ธ๋“ค๋ง{GlobalExceptionHandler / try-catch ํŒจํ„ด}
    ๋กœ๊น…{SLF4J + Logback / Monolog ๊ธฐ์ค€}
    ์ธ์ฆ{JWT / Session / OAuth2 ๊ธฐ์ค€}
    DB ์ ‘๊ทผ{JPA / MyBatis / Eloquent ๊ธฐ์ค€}

    ---

    โ›” ์•ˆํ‹ฐํŒจํ„ด โ€” {ํ”„๋กœ์ ํŠธ๋ช…}

    > ํ”„๋กœ์ ํŠธ ๊ณ ์œ  ์•ˆํ‹ฐํŒจํ„ด. COMMON AP-01~11๊ณผ ๋ณ‘ํ–‰ ์ ์šฉ.

    ID๊ทœ์น™์œ„๋ฐ˜ ์‹œ
    {JP-01}{SQL ์ง์ ‘ ์ž‘์„ฑ ๊ธˆ์ง€ โ†’ ORM/QueryDSL ์‚ฌ์šฉ}{์ฆ‰์‹œ ์ค‘๋‹จ}
    {JP-02}{์šด์˜ DB ์ง์ ‘ ์ ‘์† ๊ธˆ์ง€ โ†’ ์Šคํ…Œ์ด์ง•์—์„œ ๊ฒ€์ฆ}{์ฆ‰์‹œ ์ค‘๋‹จ}
    {JP-03}{ํ•˜๋“œ์ฝ”๋”ฉ ์„ค์ • ๊ธˆ์ง€ โ†’ application.yml/ํ™˜๊ฒฝ๋ณ€์ˆ˜}{์ฆ‰์‹œ ์ค‘๋‹จ}
    {JP-04}{public ํ•„๋“œ ๊ธˆ์ง€ โ†’ getter/setter ๋˜๋Š” record}{์ฝ”๋“œ ๋ฆฌ๋ทฐ}
    {JP-05}{ํ…Œ์ŠคํŠธ ์—†๋Š” ๋ฐฐํฌ ๊ธˆ์ง€ โ†’ ์ตœ์†Œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ํ•„์ˆ˜}{๋ฐฐํฌ ์ฐจ๋‹จ}

    ---

    ๐Ÿ“‹ ์˜จ๋ณด๋”ฉ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

    ํ”„๋กœ์ ํŠธ๋ฅผ Claude ๋ฐฉ์— ๊ฐ€์ ธ์˜ฌ ๋•Œ:

    - [ ] ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ๋ฌธ์„œ ์ž‘์„ฑ (๋ชฉ์ , ์Šคํƒ, ํŒ€)
    - [ ] ๐Ÿ“– ์šฉ์–ด ์‚ฌ์ „ ์ฑ„์šฐ๊ธฐ (DB ํ…Œ์ด๋ธ”, ํŒจํ‚ค์ง€, API)
    - [ ] ๐ŸŽฏ ๋„๋ฉ”์ธ ํŠธ๋ฆฌ๊ฑฐ ๋งคํ•‘ (ํ‚ค์›Œ๋“œ โ†’ ๋ฌธ์„œ/์ฝ”๋“œ)
    - [ ] ๐Ÿ† ๊ณจ๋“  ํŒจํ„ด ์ง€์ • (๊ฐ ๋ ˆ์ด์–ด๋ณ„ ๋ชจ๋ฒ” ์ฝ”๋“œ)
    - [ ] โ›” ์•ˆํ‹ฐํŒจํ„ด ์ •๋ฆฌ (ํ”„๋กœ์ ํŠธ ๊ณ ์œ  ๊ธˆ๊ธฐ์‚ฌํ•ญ)
    - [ ] KHub์— ๋“ฑ๋ก (project_code ์ƒˆ๋กœ ์ƒ์„ฑ)
    - [ ] Claude ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์— Instructions ์ถ”๊ฐ€
    - [ ] ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ๋ก (DDD ํ•ต์‹ฌ + ํ”„๋กœ์ ํŠธ ๊ณ ์œ  ๊ทœ์น™)

    ---

    ๐Ÿ’ก ํŒ: ๋น ๋ฅธ ์˜จ๋ณด๋”ฉ ์ˆœ์„œ

    1์ผ์ฐจ: ํ”„๋กœ์ ํŠธ ๊ฐœ์š” + DB ํ…Œ์ด๋ธ” ๋ชฉ๋ก โ†’ ์šฉ์–ด ์‚ฌ์ „ ์ดˆ์•ˆ
    2์ผ์ฐจ: ์ฃผ์š” ์ฝ”๋“œ ํŒŒ์ผ ํŒŒ์•… โ†’ ๊ณจ๋“  ํŒจํ„ด ์ง€์ •
    3์ผ์ฐจ: ํŒ€ ์ปจ๋ฒค์…˜ + ๊ธˆ๊ธฐ์‚ฌํ•ญ โ†’ ์•ˆํ‹ฐํŒจํ„ด ์ •๋ฆฌ
    4์ผ์ฐจ: ํ‚ค์›Œ๋“œ-๋ฌธ์„œ ๋งคํ•‘ โ†’ ๋„๋ฉ”์ธ ํŠธ๋ฆฌ๊ฑฐ ์™„์„ฑ
    โ†’ ์ดํ›„ Claude๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ/์ƒ์„ฑ ์‹œ ์ž๋™ ์ฐธ์กฐ

    ๋‹ค๋ฅธ ํ‘œํ˜„: Markdown ยท JSON ยท ์ตœ์ข… ๊ฐฑ์‹  2026-08-24