[Sprint Mission7]

1. ํ”„๋กœ์ ํŠธ ๋งˆ์ผ์Šคํ†ค

  • ๋กœ๊ทธ ๊ด€๋ฆฌ
  • ์ปค์Šคํ…€ ์˜ˆ์™ธ ์„ค๊ณ„
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • Actuator๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
  • ์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

2. ๊ธฐ๋ณธ ์š”๊ตฌ์‚ฌํ•ญ

2-1. ํ”„๋กœํŒŒ์ผ ๊ธฐ๋ฐ˜ ์„ค์ • ๊ด€๋ฆฌ

  • ๊ฐœ๋ฐœ, ์šด์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํ”„๋กœํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.
    • application-dev.yaml,ย application-prod.yamlย ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”.
    • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •๊ฐ’์„ ํ”„๋กœํŒŒ์ผ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์„ธ์š”.
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด
      • ์„œ๋ฒ„ ํฌํŠธ


2-2. ๋กœ๊ทธ ๊ด€๋ฆฌ

  • Lombok์˜ย @Slf4jย ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•ด ๋กœ๊น…์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•˜์„ธ์š”.
  • application.yaml์— ๊ธฐ๋ณธ ๋กœ๊น… ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•˜์„ธ์š”.
    • ๊ธฐ๋ณธ์ ์œผ๋กœย infoย ๋ ˆ๋ฒจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํ™˜๊ฒฝ ๋ณ„ ์ ์ ˆํ•œ ๋กœ๊น… ๋ ˆ๋ฒจ์„ ํ”„๋กœํŒŒ์ผ ๋ณ„๋กœ ์„ค์ •ํ•ด๋ณด์„ธ์š”.
    • SQL ๋กœ๊ทธ๋ฅผ ๋ณด๊ธฐ์œ„ํ•ด ์„ค์ •ํ–ˆ๋˜ ๋ ˆ๋ฒจ์€ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    • ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ์ ํŠธ์˜ ๋กœ๊ทธ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œย debug, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š”ย infoย ๋ ˆ๋ฒจ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Spring Boot์˜ ๊ธฐ๋ณธ ๋กœ๊น… ๊ตฌํ˜„์ฒด์ธ Logback์˜ ์„ค์ • ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.
    • logback-spring.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์„ธ์š”.
    • ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์€ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๊น… ํŒจํ„ด๊ณผ ์ถœ๋ ฅ ๋ฐฉ์‹์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์„ธ์š”.
      • ๋กœ๊ทธ ์ถœ๋ ฅ ์˜ˆ์‹œ

        # ํŒจํ„ด
        {๋…„}-{์›”}-{์ผ} {์‹œ}:{๋ถ„}:{์ดˆ}:{๋ฐ€๋ฆฌ์ดˆ} [{์Šค๋ ˆ๋“œ๋ช…}] {๋กœ๊ทธ ๋ ˆ๋ฒจ(5๊ธ€์ž๋กœ ๋งž์ถค)} {๋กœ๊ฑฐ ์ด๋ฆ„(์ตœ๋Œ€ 36๊ธ€์ž)} - {๋กœ๊ทธ ๋ฉ”์‹œ์ง€}{์ค„๋ฐ”๊ฟˆ}
        
        # ์˜ˆ์‹œ
        25-01-01 10:33:55.740 [main] DEBUG c.s.m.discodeit.DiscodeitApplication - Running with Spring Boot v3.4.0, Spring v6.2.0
        
    • ์ฝ˜์†”๊ณผ ํŒŒ์ผ์— ๋™์‹œ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก ์„ค์ •ํ•˜์„ธ์š”.
      • ํŒŒ์ผ์€ย {ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ}/.logsย ๊ฒฝ๋กœ์— ์ €์žฅ๋˜๋„๋ก ์„ค์ •ํ•˜์„ธ์š”.
    • ๋กœ๊ทธ ํŒŒ์ผ์€ ์ผ์ž๋ณ„๋กœ ๋กค๋ง๋˜๋„๋ก ๊ตฌ์„ฑํ•˜์„ธ์š”.
    • ๋กœ๊ทธ ํŒŒ์ผ์€ 30์ผ๊ฐ„ ๋ณด๊ด€ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์„ธ์š”.
  • ์„œ๋น„์Šค ๋ ˆ์ด์–ด์™€ ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ์— ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
    • ๋กœ๊น… ๋ ˆ๋ฒจ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์„ธ์š”: ERROR, WARN, INFO, DEBUG
    • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ์— ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:
      • ์‚ฌ์šฉ์ž ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ
      • ์ฑ„๋„ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ
      • ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ
      • ํŒŒ์ผ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ


2-3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ณ ๋„ํ™”

  • ์ปค์Šคํ…€ ์˜ˆ์™ธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์„ธ์š”.
    • ํŒจํ‚ค์ง€๋ช…: com.sprint.mission.discodeit.exception[.{๋„๋ฉ”์ธ}]
    • ErrorCode Enum ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ ์ฝ”๋“œ๋ช…๊ณผ ๋ฉ”์‹œ์ง€๋ฅผ ์ •์˜ํ•˜์„ธ์š”.
      • ์•„๋ž˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๋‹ค์–‘ํ•œ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•˜์„ธ์š”.
      • ์˜ˆ์‹œ

    • ๋ชจ๋“  ์˜ˆ์™ธ์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” DiscodeitException ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์„ธ์š”.
      • ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

      • details๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

        • ์˜ˆ์‹œ
          • ์กฐํšŒ ์‹œ๋„ํ•œ ์‚ฌ์šฉ์ž์˜ ID ์ •๋ณด
          • ์—…๋ฐ์ดํŠธ ์‹œ๋„ํ•œ PRIVATE ์ฑ„๋„์˜ ID ์ •๋ณด
    • DiscodeitException์„ ์ƒ์†ํ•˜๋Š” ์ฃผ์š” ๋„๋ฉ”์ธ ๋ณ„ ๋ฉ”์ธ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์„ธ์š”.
      • UserException,ย ChannelExceptionย ๋“ฑ
      • ์‹ค์ œ๋กœ ํ™œ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค.
    • ๋„๋ฉ”์ธ ๋ฉ”์ธ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜์„ธ์š”.
      • UserNotFoundException, UserAlreadyExistException ๋“ฑ ํ•„์š”ํ•œ ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•˜์„ธ์š”.
      • ์˜ˆ์‹œ

  • ๊ธฐ์กด์— ๊ตฌํ˜„ํ–ˆ๋˜ ์˜ˆ์™ธ๋ฅผ ์ปค์Šคํ…€ ์˜ˆ์™ธ๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”.
    • NoSuchElementException
    • IllegalArgumentException
    • โ€ฆ
  • ErrorResponse๋ฅผ ํ†ตํ•ด ์ผ๊ด€๋œ ์˜ˆ์™ธ ์‘๋‹ต์„ ์ •์˜ํ•˜์„ธ์š”.
    • ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

    • int status: HTTP ์ƒํƒœ์ฝ”๋“œ
    • String exceptionType: ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์˜ ํด๋ž˜์Šค ์ด๋ฆ„
  • ์•ž์„œ ์ •์˜ํ•œ ErrorResponse์™€ @RestControllerAdvice๋ฅผ ํ™œ์šฉํ•ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”.
    • ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ๋Š” ์ผ๊ด€๋œ ์‘๋‹ต(ErrorResponse)์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


2-4. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

  • Spring Validation ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
  • ์ฃผ์š” Request DTO์— ์ œ์•ฝ ์กฐ๊ฑด ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ตฌํ•˜์„ธ์š”.
    • @NotNull,ย @NotBlank,ย @Size,ย @Emailย ๋“ฑ
  • ์ปจํŠธ๋กค๋Ÿฌ์—ย @Validย ๋ฅผ ์‚ฌ์šฉํ•ด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜์„ธ์š”.
  • ๊ฒ€์ฆ ์‹คํŒจ ์‹œ ๋ฐœ์ƒํ•˜๋Š”ย MethodArgumentNotValidException์„ ์ „์—ญ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜์„ธ์š”.
  • ์œ ํšจ์„ฑ ๊ฒ€์ฆ ์‹คํŒจ ์‹œ ์ƒ์„ธํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.


2-5. Actuator

  • Spring Boot Actuator ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
  • ๊ธฐ๋ณธ Actuator ์—”ํŠธํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.
    • health, info, metrics, loggers
  • Actuator info๋ฅผ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„:ย Discodeit
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ„์ „:ย 1.7.0
    • ์ž๋ฐ” ๋ฒ„์ „:ย 17
    • ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฒ„์ „:ย 3.4.0
    • ์ฃผ์š” ์„ค์ • ์ •๋ณด
      • ๋ฐ์ดํ„ฐ์†Œ์Šค: url, ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค ์ด๋ฆ„
      • jpa: ddl-auto
      • storage ์„ค์ •: type, path
      • multipart ์„ค์ •: max-file-size, max-request-size
  • Spring Boot ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ ํ›„ ๊ฐ์ข… ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
    • /actuator/info
    • /actuator/metrics
    • /actuator/health
    • /actuator/loggers


2-6. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

  • ์„œ๋น„์Šค ๋ ˆ์ด์–ด์˜ ์ฃผ์š” ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
    • ๋‹ค์Œ ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ๊ฐ๊ฐ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ(์„ฑ๊ณต, ์‹คํŒจ)์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
      • UserService: create, update, delete ๋ฉ”์†Œ๋“œ
      • ChannelService: create(PUBLIC, PRIVATE), update, delete, findByUserId ๋ฉ”์†Œ๋“œ
      • MessageService: create, update, delete, findByChannelId ๋ฉ”์†Œ๋“œ
    • Mockito๋ฅผ ํ™œ์šฉํ•ด Repository ์˜์กด์„ฑ์„ ๋ชจ์˜(mock)ํ•˜์„ธ์š”.
    • BDDMockito๋ฅผ ํ™œ์šฉํ•ด ํ…Œ์ŠคํŠธ ๊ฐ€๋…์„ฑ์„ ๋†’์ด์„ธ์š”.


2-7. ์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ

  • ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ ˆ์ด์–ด์˜ ์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
    • @DataJpaTest๋ฅผ ํ™œ์šฉํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”.
    • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.
      • application-test.yaml์„ ์ƒ์„ฑํ•˜์„ธ์š”.
      • ๋ฐ์ดํ„ฐ์†Œ์Šค๋Š” H2 ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , PostgreSQL ํ˜ธํ™˜ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
      • H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
      • ํ…Œ์ŠคํŠธ ์‹œ์ž‘ ์‹œ ์Šคํ‚ค๋งˆ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ์„ค์ •ํ•˜์„ธ์š”.
      • ๋””๋ฒ„๊น…์— ์šฉ์ดํ•˜๋„๋ก ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์„ธ์š”.
    • ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฐ„ย testย ํ”„๋กœํŒŒ์ผ์„ ํ™œ์„ฑํ™” ํ•˜์„ธ์š”.
    • JPA Audit ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—ย @EnableJpaAuditing์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
    • ์ฃผ์š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ(User, Channel, Message)์˜ ์ฃผ์š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ๊ฐ๊ฐ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ(์„ฑ๊ณต, ์‹คํŒจ)์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
      • ์ปค์Šคํ…€ ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ
      • ํŽ˜์ด์ง• ๋ฐ ์ •๋ ฌ ๋ฉ”์†Œ๋“œ
  • ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด์˜ ์Šฌ๋ผ์ด์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
    • @WebMvcTest๋ฅผ ํ™œ์šฉํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”.
    • WebMvcTest์—์„œ ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์˜ Bean์ด ํ•„์š”ํ•˜๋‹ค๋ฉด @Import๋ฅผ ํ™œ์šฉํ•ด ์ถ”๊ฐ€ํ•˜์„ธ์š”.
      • ์˜ˆ์‹œ
        @Import({ErrorCodeStatusMapper.class})
        
    • ์ฃผ์š” ์ปจํŠธ๋กค๋Ÿฌ(User, Channel, Message)์— ๋Œ€ํ•ด ์ตœ์†Œ 2๊ฐœ ์ด์ƒ(์„ฑ๊ณต, ์‹คํŒจ)์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
    • MockMvc๋ฅผ ํ™œ์šฉํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.
    • ์„œ๋น„์Šค ๋ ˆ์ด์–ด๋ฅผ ๋ชจ์˜(mock)ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ๋กœ์ง๋งŒ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.
    • JSON ์‘๋‹ต์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์„ธ์š”.


2-8. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.
    • @SpringBootTest๋ฅผ ํ™œ์šฉํ•ด Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.
    • H2 ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.
    • ํ…Œ์ŠคํŠธ์šฉ ํ”„๋กœํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.
  • ์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
    • ์ฃผ์š” API์— ๋Œ€ํ•ด ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
      • ์‚ฌ์šฉ์ž ๊ด€๋ จ API (์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ, ๋ชฉ๋ก ์กฐํšŒ)
      • ์ฑ„๋„ ๊ด€๋ จ API (์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ)
      • ๋ฉ”์‹œ์ง€ ๊ด€๋ จ API (์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ, ๋ชฉ๋ก ์กฐํšŒ)
    • ๊ฐ ํ…Œ์ŠคํŠธ๋Š”ย @Transactional์„ ํ™œ์šฉํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์„ธ์š”.

3. ์‹ฌํ™” ์š”๊ตฌ์‚ฌํ•ญ

3-1. MDC๋ฅผ ํ™œ์šฉํ•œ ๋กœ๊น… ๊ณ ๋„ํ™”

  • ์š”์ฒญ ID, ์š”์ฒญ URL, ์š”์ฒญ ๋ฐฉ์‹ ๋“ฑ์˜ ์ •๋ณด๋ฅผ MDC์— ์ถ”๊ฐ€ํ•˜๋Š” ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š”.
    • ํด๋ž˜์Šค๋ช…:ย MDCLoggingInterceptor
    • ํŒจํ‚ค์ง€๋ช…:ย com.**.discodeit.config
    • ์š”์ฒญ ID๋Š” ๋žœ๋คํ•œ ๋ฌธ์ž์—ด๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (UUID)
    • ์š”์ฒญ ID๋Š” ์‘๋‹ต ํ—ค๋”์— ํฌํ•จ์‹œ์ผœ ๋” ๋งŽ์€ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
      • ํ—ค๋” ์ด๋ฆ„:ย Discodeit-Request-ID
  • WebMvcConfigurer๋ฅผ ํ†ตํ•ดย MDCLoggingInterceptor๋ฅผ ๋“ฑ๋กํ•˜์„ธ์š”.
    • ํด๋ž˜์Šค๋ช…:ย WebMvcConfig
    • ํŒจํ‚ค์ง€๋ช…:ย com.**.discodeit.config
  • Logback ํŒจํ„ด์— MDC ๊ฐ’์„ ํฌํ•จ์‹œํ‚ค์„ธ์š”.
    • ๋กœ๊ทธ ์ถœ๋ ฅ ์˜ˆ์‹œ

      # ํŒจํ„ด
      
      {๋…„}-{์›”}-{์ผ} {์‹œ}:{๋ถ„}:{์ดˆ}:{๋ฐ€๋ฆฌ์ดˆ} [{์Šค๋ ˆ๋“œ๋ช…}] {๋กœ๊ทธ ๋ ˆ๋ฒจ(5๊ธ€์ž๋กœ ๋งž์ถค)} {๋กœ๊ฑฐ ์ด๋ฆ„(์ตœ๋Œ€ 36๊ธ€์ž)} [{MDC:์š”์ฒญID} | {MDC:์š”์ฒญ ๋ฉ”์†Œ๋“œ} | {MDC:์š”์ฒญ URL}] - {๋กœ๊ทธ ๋ฉ”์‹œ์ง€}{์ค„๋ฐ”๊ฟˆ}
      
      # ์˜ˆ์‹œ
      
      25-01-01 10:33:55.740 [main] DEBUG o.s.api.AbstractOpenApiResource [827cbc0b | GET | /v3/api-docs] - Init duration for springdoc-openapi is: 216 ms
      


3-2. Spring Boot Admin์„ ํ™œ์šฉํ•œ ๋ฉ”ํŠธ๋ฆญ ๊ฐ€์‹œํ™”

  • Spring Boot Admin ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ๋ชจ๋“ˆ์„ ์ƒ์„ฑํ•˜์„ธ์š”.
    • IntelliJ ํ™”๋ฉด ์ฐธ๊ณ 

    • ๋ชจ๋“ˆ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ์˜์กด์„ฑ

  • admin ๋ชจ๋“ˆ์˜ ๋ฉ”์ธ ํด๋ž˜์Šค์— @EnableAdminServer ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์„œ๋ฒ„๋Š” 9090๋ฒˆ ํฌํŠธ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    import de.codecentric.boot.admin.server.config.EnableAdminServer;
    
    @SpringBootApplication
    @EnableAdminServer
    public class AdminApplication {
        public static void main(String[] args) {
            SpringApplication.run(AdminApplication.class, args);
        }
    }
    
    # application.yaml
    spring:
      application:
        name: admin
    server:
      port: 9090
    
  • admin ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ localhost:9090/applications ์— ์ ‘์†ํ•ด๋ด…๋‹ˆ๋‹ค.
  • discodeit ํ”„๋กœ์ ํŠธ์— Spring Boot Admin Client๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      dependencies {
          ...
          implementation 'de.codecentric:spring-boot-admin-starter-client:3.4.5
      }
      
    • admin ์„œ๋ฒ„์— ๋“ฑ๋ก๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ • ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      # application.yml
      spring:
        application:
          name: discodeit
          ...
        boot:
          admin:
            client:
              instance:
                name: discodeit
      ...
      
      # application-dev.yml
      spring:
        application:
          name: discodeit
          ...
        boot:
          admin:
            client:
              url: http://localhost:9090
      ...
      
      # application-prod.yml
      spring:
        application:
          name: discodeit
          ...
        boot:
          admin:
            client:
              url: ${SPRING_BOOT_ADMIN_CLIENT_URL}
      ...
      
    • discodeit ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , admin ๋Œ€์‹œ๋ณด๋“œ์— discodeit ์ธ์Šคํ„ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • admin ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์„ ์กฐ์ž‘ํ•ด๋ณด๋ฉด์„œ ๊ฐ์ข… ๋ฉ”ํŠธ๋ฆญ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
    • ์ฃผ์š” API์˜ ์š”์ฒญ ํšŸ์ˆ˜, ์‘๋‹ต์‹œ๊ฐ„ ๋“ฑ
    • ์„œ๋น„์Šค ์ •๋ณด


3-3. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๊ด€๋ฆฌ

  • JaCoCo ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

    plugins {
        id 'jacoco'
    }
    
    test {
        finalizedBy jacocoTestReport
    }
    
    jacocoTestReport {
        dependsOn test
        reports {
            xml.required = true
            html.required = true
        }
    }
    
  • ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ›„ ์ƒ์„ฑ๋œ ๋ฆฌํฌํŠธ๋ฅผ ๋ถ„์„ํ•ด๋ณด์„ธ์š”.
    • ๋ฆฌํฌํŠธ๋Š”ย build/reports/jacocoย ๊ฒฝ๋กœ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • com.sprint.mission.discodeit.service.basic ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด์„œ 60% ์ด์ƒ์˜ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋‹ฌ์„ฑํ•˜์„ธ์š”.

Leave a comment