[Spring Boot][Total-Back-Office Project] Log Back์„ ์ด์šฉํ•œ Discord์— Exception ์ •๋ณด ๋ณด๋‚ด๊ธฐ ๋ฐ Data Base ์ €์žฅ feat.MyBatis & Test Code(JUnit 5) - โ‘ก ๋””์Šค์ฝ”๋“œ๋กœ ๋กœ๊ทธ ์ •๋ณด ๋ฐœ์†ก

2023. 7. 22. 18:57ใ†Back-End ์ž‘์—…์‹ค/Spring Framework

728x90
๋ฐ˜์‘ํ˜•

 




 

์Šคํ”„๋ง ๋ถ€ํŠธ 3 ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ : ์ž๋ฐ” ํŽธ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ

๐Ÿง‘‍๐Ÿ’ป ์ฝ”๋”ฉ

โœ…  [Spring Boot][Total-Back-Office Project] AOP, Annotation์„ ์ด์šฉํ•œ API ๋™์ž‘ ์‹œ๊ฐ„ ์ธก์ •
โœ… [Spring Boot][Total-Back-Office Project] AOP, Annotation์„ ์ด์šฉํ•œ API ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ feat.MyBatis & Test Code(JUnit 5) (https://junyharang.tistory.com/457
)

โœ… [Spring Boot][Total-Back-Office Project] Log Back์„ ์ด์šฉํ•œ Discord์— Exception ์ •๋ณด ๋ณด๋‚ด๊ธฐ ๋ฐ Data Base  ์ €์žฅ feat.MyBatis & Test Code(JUnit 5) - โ‘  Log Back ์„ค์ •
โœ… [Spring Boot][Total-Back-Office Project] Log Back์„ ์ด์šฉํ•œ Discord์— Exception ์ •๋ณด ๋ณด๋‚ด๊ธฐ ๋ฐ Data Base ์ €์žฅ feat.MyBatis & Test Code(JUnit 5) - โ‘ก ๋””์Šค์ฝ”๋“œ๋กœ ๋กœ๊ทธ ์ •๋ณด ๋ฐœ์†ก
โœ… [Spring Boot][Total-Back-Office Project] Log Back์„ ์ด์šฉํ•œ Discord์— Exception ์ •๋ณด ๋ณด๋‚ด๊ธฐ ๋ฐ Data Base ์ €์žฅ feat.MyBatis & Test Code(JUnit 5) - โ‘ข ๋กœ๊ทธ ๋ฐ ์š”์ฒญ ์ด์šฉ์ž, ์š”์ฒญ ์ •๋ณด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ

 

๐Ÿšš ๋ฐฐํฌ

โš ๏ธ ์•„๋ž˜ ๋ชฉ์ฐจ ์ค‘ ๋ช‡๋ช‡๊ฐœ์˜ ๋งํฌ๊ฐ€ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š” ๋ฌธ์ œ๋กœ ๊ธ€ ๋งจ ํ•˜๋‹จ์— ๋‹ค์Œ ๊ธ€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

โœ… [CI/CD] Jenkins์™€ Gitea ์—ฐ๋™
โœ… [CI/CD] Jenkins Trigger ์ •๋ณด Discord๋กœ ๋ณด๋‚ด๊ธฐ
โœ… [CI/CD] ์ •์  ์ฝ”๋“œ ๋ถ„์„ ํˆด SonarQube์™€ Jenkins ์—ฐ๋™
โœ… [CI/CD] SonarQube๋ฅผ ํ†ตํ•ด Code Convention ์ ์šฉ
โœ… [DevOps] JAVA Gradle JaCoCo (Code coverage) ์„ค์ •ํ•˜๊ธฐ 
โœ… [DevOps] JAVA Gradle JaCoCo (Code coverage) ์„ค์ •ํ•˜๊ธฐ (์ถ”๊ฐ€)(https://junyharang.tistory.com/392)

โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘  Application Linuxt(Ubuntu)์— SSH๋ฅผ ์ด์šฉํ•œ ํŒŒ์ผ ์ „์†ก
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ก Create Docker Image And BackUp
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ข Application Server Docker Job (โ‘  Application ๋„์ปค ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ)
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ข Application Server Docker Job (โ‘ก Application Docker Run)(https://junyharang.tistory.com/406)
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ข Application Server Docker Job (โ‘ข Application Docker Health Check)
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ฃ NGINX Server Docker Job (โ‘  NGINX ๊ฐ ์ข… ์„ค์ •) 
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ฃ NGINX Server Docker Job (โ‘ก NGINX Docker ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ) 
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ฃ NGINX Server Docker Job (โ‘ข NGINX Docker Run & Health Check)
โœ… [CI/CD] Jenkins + Docker๋ฅผ ์ด์šฉํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ - โ‘ฃ NGINX Server Docker Job (โ‘ข NGINX ์žฌ ์„ค์ •)



 

๐Ÿ’พ Git Hub Repository : https://github.com/junyharang-personal-project/junyss-total-back-office

 

GitHub - junyharang-personal-project/junyss-total-back-office: [Back-Office] ๋””์Šค์ฝ”๋“œ ๋ด‡๊ณผ Logback, AOP ๋“ฑ์„ ์ด์šฉํ•˜

[Back-Office] ๋””์Šค์ฝ”๋“œ ๋ด‡๊ณผ Logback, AOP ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ์ด์šฉ์ž ์ ‘์† ์ •๋ณด, Exception ์ •๋ณด ๋“ฑ์„ ๋””์Šค์ฝ”๋“œ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค - GitHub - junyharang-personal-project/junyss-total-back-office: [Back-Office] ๋””์Šค์ฝ”๋“œ

github.com

 

 

 

 

๐Ÿš€ ๋””์Šค์ฝ”๋“œ๋กœ ๋กœ๊ทธ ์ •๋ณด ๋ณด๋‚ด๊ธฐ

    ๐Ÿ”ฝ ๊ฐœ์š”

        ๐Ÿ“ฆ ์†Œ๊ฐœ

์šด์˜ ํ™˜๊ฒฝ์— Application์ด ์˜ฌ๋ผ๊ฐ€๊ณ , ์šด์˜ ์ค‘์ด๋ฉด ๋งŽ์€ ์ด์šฉ์ž๊ฐ€ ์ ‘์†ํ•  ๊ฑฐ์—์š”.
์ด ๋•Œ, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋กœ Exception์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ ํ…๋ฐ, ์•Œ๋ฆผ์ด ์—†์œผ๋ฉด ์–ด๋–ค Exception์ด ํ„ฐ์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๊ณ ,
๋˜ ๋งค๋ฒˆ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ Log๋ฅผ ํ™•์ธํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ๋งค์šฐ ์œ„ํ—˜ํ•ด์š”.

์ •๋ณด ๋ณด์•ˆ์—์„œ๋Š” ๋‚ด๋ถ€ ์ง์›์— ๋Œ€ํ•ด ์ ‘๊ทผ ๊ถŒํ•œ ๋“ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ๊ณ ํ•˜๊ณ  ์žˆ์–ด์š”.

์–ด๋–ค ์ฃผ์š” ์ •๋ณด ๋“ฑ์ด ๋…ธ์ถœ๋˜๋Š” ์‚ฌ๊ณ ์— ๋Œ€๋ถ€๋ถ„์€ ๋‚ด๋ถ€ ์ง์›์„ ํ†ตํ•ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๊ณ , ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ๊ผญ ํ•„์š”ํ•œ ์„œ๋ฒ„์— ํ•„์š”ํ•œ ์ธ์›๋งŒ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์ค˜์„œ ์ ‘๊ทผํ•˜๊ฒŒ ํ•˜๊ณ , ๊ตณ์ด ์ ‘๊ทผํ•ด๋„ ๋˜์ง€ ์•Š๋Š” ์ง์›์€ ์ ‘๊ทผ์„ ๋ง‰๋Š” ๊ฒƒ์ด ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์ข‹๋‹ต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Exception์ด ๋ฐœ์ƒํ•ด์„œ Log๊ฐ€ ์ €์žฅ ๋˜์—ˆ์„ ๋•Œ, ์ด๋ฅผ ์„œ๋ฒ„์— ์ ‘์†ํ•˜์ง€ ์•Š๊ณ , ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Exception ๋ฐœ์ƒ ์‹œ ์ฆ‰๊ฐ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ผ๊นŒ?๋ฅผ ๊ณ ๋ฏผํ•ด ๋ณด์•˜์–ด์š”.

๊ทธ๋ฆฌ๊ณ , ์ž ์‹œ ๊ทผ๋ฌดํ–ˆ์—ˆ๋˜ ํšŒ์‚ฌ์—์„œ Telegram์„ ํ†ตํ•ด Exception์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น Exception ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ๋†“์€ ๊ฒƒ์„ ๋ณด์•˜๋Š”๋ฐ, ํ•ด๋‹น ๋‚ด์šฉ์—๋Š” ๋‹จ์ˆœํžˆ Exception ์ •๋ณด๋งŒ ๋“ค์–ด์˜ค๋„๋ก ์ฒ˜๋ฆฌํ•ด ๋‘์—ˆ์—ˆ์–ด์š”.

์—ฌ๊ธฐ์„œ ์ฃผ๋‹ˆ๋Š” ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋ฐ›๊ณ  ์‹ถ์—ˆ์–ด์š”.

๊ทธ ์ด์œ ๋Š” ์–ด๋–ค Exception์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ SQL Injection ๋“ฑ์˜ ๊ณต๊ฒฉ์„ ์œ„ํ•œ ๋ฌธ์ž๋ฅผ ๋ณด๋‚ด Exception์ด ๋ฐœ์ƒํ–ˆ์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ›๊ณ , ํ•ด๋‹น ์ด์šฉ์ž๊ฐ€ ์–ด๋–ค ์š”์ฒญ์„ ๋ณด๋ƒˆ๊ธฐ์— ํ•ด๋‹น Exception์ด ํ„ฐ์กŒ๋Š”์ง€๋ฅผ ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์‹ถ์—ˆ์–ด์š”.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ฃผ๋‹ˆ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๋ถ„์„ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

 

 

 

    ๐Ÿ”ฝ ์˜์กด์„ฑ ์ฃผ์ž…

        ๐Ÿ“ฆ Gradle

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation group: 'org.springframework.boot',name:'spring-boot-starter-webflux',version:'2.7.3'

 

 

 

 

 

    ๐Ÿ”ฝ ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„

        ๐Ÿ“ฆ DiscordAppender.java

Java Code๋ฅผ ๋ณด๊ธฐ ์ „ ์ด ์ „ ๊ธ€์—์„œ ์ฃผ๋‹ˆ๋Š” Log back ๊ธฐ๋ณธ ์„ค์ •์„ ์œ„ํ•ด xml๊ณผ application.yml์„ ์„ค์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.

 

[Spring Boot][Total-Back-Office Project] Log Back์„ ์ด์šฉํ•œ Discord์— Exception ์ •๋ณด ๋ณด๋‚ด๊ธฐ ๋ฐ Data Base ์ €์žฅ feat.M

์Šคํ”„๋ง ๋ถ€ํŠธ 3 ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ : ์ž๋ฐ” ํŽธ COUPANG www.coupang.com "์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค." ๐Ÿ—‚ ๋ชฉ์ฐจ ๐Ÿง‘‍๐Ÿ’ป ์ฝ”๋”ฉ โœ… [Spring Boot][T

junyharang.tistory.com


์—ฌ๊ธฐ์„œ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ๋””์Šค์ฝ”๋“œ๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์„ค์ • ๋ถ€๊ฐ€ ์žˆ์—ˆ์–ด์š”.


์œ„์™€ ๊ฐ™์ด Log๊ฐ€ ์ž‘์„ฑ๋˜๋ฉด com.giggalpeople....DiscordAppender Class๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ด ์ฃผ์—ˆ๊ณ , ํ•ด๋‹น Class ๋ถ€ํ„ฐ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ„์„ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

 

DiscordAppender 27 ~ 46๋ฒˆ์งธ ์ค„


์ตœ์ดˆ ๋””์Šค์ฝ”๋“œ ์–ดํŽœ๋”๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ณ , ์ด ํด๋ž˜์Šค๋Š” Logback Library๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Log Event๋ฅผ ๋””์Šค์ฝ”๋“œ ์›นํ›…์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์š”.

@Setter๋ฅผ ํ†ตํ•ด discordWebhookUrl ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด Setter Method๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์–ด์š”.
@Slf4j๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค ๋‚ด Logging์„ ์œ„ํ•œ Logger ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ๊ณ , ์ด ํด๋ž˜์Šค์—์„œ๋Š” log๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ Logger ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.


์œ„ ํด๋ž˜์Šค๋Š” UnsynchronizedAppenderBase<ILoggingEvent>๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, Logback์˜ Appender ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Log Event๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”. ILoggingEvent๋Š” Logback์—์„œ ์‚ฌ์šฉ๋˜๋Š” Logging Event๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Interface์—์š”.

Field ๋ณ€์ˆ˜ ์ฆ‰, Member ๋ณ€์ˆ˜๋กœ๋Š” discordWebhookUrl์„ ์„ ์–ธํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ์ด๋Š” ๋””์Šค์ฝ”๋“œ ์›น ํ›… URL์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜์—์š”. ์ด ๋ณ€์ˆ˜์— ๋‹ด๊ธด URL์„ ํ†ตํ•ด Log Event๋ฅผ ๋””์Šค์ฝ”๋“œ๋กœ ๋ณด๋‚ด์ค„๊ฑฐ์—์š”.

getLevelColor()๋Š” Logging Event์˜ Log Level์— ๋”ฐ๋ผ ๋””์Šค์ฝ”๋“œ์— ํ‘œ์‹œ๋  ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” Static(์ •์ ) Method์—์š”. Logback Log Level์„ ILoggingEvent.getLevel()์„ ํ†ตํ•ด ๊ฐ€์ ธ์™€ ํ•ด๋‹น Log Level์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

์ด ๋•Œ, WARN Level์€ ๋…ธ๋ž€์ƒ‰, ERROR Level์€ ๋นจ๊ฐ„์ƒ‰, ๊ทธ ์™ธ์— ๋ชจ๋“  ๋‚ด์šฉ์€ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.



DiscordAppender.append() 48 ~ 59๋ฒˆ์งธ ์ค„


์‹ค์ œ ๋””์Šค์ฝ”๋“œ๋กœ ๋ณด๋‚ด๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” append ๋ฉ”์†Œ๋“œ์—์š”.


์œ„ ๋ฉ”์†Œ๋“œ๋Š” Logback์˜ Appender ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ๋””์Šค์ฝ”๋“œ ์›นํ›…์œผ๋กœ ์ „์†กํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”.
ILoggingEvent๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋ฐ, ์ด๋Š” Logback์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋กœ๊น… ์ด๋ฒคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์š”.
์œ„ ๋ฉ”์†Œ๋“œ๋Š” ๋””์Šค์ฝ”๋“œ ์›นํ›…์„ ์ƒ์„ฑํ•˜๊ณ , ๋””์Šค์ฝ”๋“œ์— ๋ณด๋‚ผ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ๋””์Šค์ฝ”๋“œ ์›นํ›…์œผ๋กœ ํ•ด๋‹น ๋กœ๊ทธ ์ •๋ณด๋ฅผ ์ „์†กํ•˜๊ณ  ์žˆ์–ด์š”.

์ตœ์ดˆ 50๋ฒˆ์งธ ์ค„์— ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง„ discordWebhookUrl์„ ํ†ตํ•ด DiscrodWebHook ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์–ด์š”.
DiscordWebHook ํด๋ž˜์Šค๋Š” ๋””์Šค์ฝ”๋“œ ์›นํ›…๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

51๋ฒˆ์งธ ์ค„์— DataBaseAppender ๊ฐ์ฒด๋Š” ์ฃผ๋‹ˆ๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ๊ฐ์ฒด์ธ๋ฐ, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด์—์š”.
52๋ฒˆ์งธ ์ค„์— ServerInfo ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ์ด๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ํด๋ž˜์Šค์—์š”.
53๋ฒˆ์งธ ์ค„์— ๋‚ด์šฉ์€ ๋กœ๊น… ์ด๋ฒคํŠธ์˜ Mappend Diagnostic Context(MDC) ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”. MDC๋Š” ๋กœ๊ทธ ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.

54๋ฒˆ์งธ ์ค„์—์„œ getLevelColor()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ILoggingEvent๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์ด๋Š” ํ•ด๋‹น ๊ฐ์ฒด ์•ˆ์— Log Level ์ •๋ณด๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น Level์— ๋”ฐ๋ฅธ ์ƒ‰๊น”์„ ์ •ํ•˜๊ธฐ ์œ„ํ•จ์ด์—์š”.
56๋ฒˆ์งธ ์ค„์—์„œ๋Š” ๋กœ๊น… ์ด๋ฒคํŠธ์˜ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.
57๋ฒˆ์งธ ์ค„์—๋Š” Exception ๋‚ด์šฉ ์ค‘ ๊ฐ„๋žต ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
58๋ฒˆ์งธ ์ค„์—๋Š” Exception ์ƒ์„ธ ๋‚ด์šฉ์„ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
59๋ฒˆ์งธ ์ค„์€ ๋กœ๊น… ์ด๋ฒคํŠธ์˜ ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.


DiscordAppender.append() 61 ~ 67๋ฒˆ์งธ ์ค„


59๋ฒˆ์งธ ์ค„์—์„œ ๊ฐ€์ ธ์˜จ ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ , 61๋ฒˆ์งธ ์ค„์—์„œ ์˜ˆ์™ธ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ์–ด์š”.
์˜ˆ์™ธ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ Exception ๋‚ด์šฉ์„ ๋ฌธ์ž์—ด๋กœ๊ฐ€์ ธ์™€ exceptionBrief ๋ณ€์ˆ˜์— ๋‹ด์•„ ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค 65๋ฒˆ์งธ ์ค„์—์„œ exceptionBrief ๋ณ€์ˆ˜๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜์— Exception ์ •๋ณด๊ฐ€ ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

DiscordAppender.append() 69๋ฒˆ์งธ ์ค„


์œ„ ๋‚ด์šฉ์€ Environment ๊ฐ์ฒด๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋Š”๋ฐ, ์ด ํด๋ž˜์Šค์—๋Š” ์„œ๋ฒ„์˜ ์ •๋ณด(์„œ๋ฒ„ ์ด๋ฆ„, IP, ์šด์˜์ฒด์ œ ์ •๋ณด ๋“ฑ)์„ ๋‹ด๊ณ  ์žˆ์–ด์š”. ์—ฌ๊ธฐ์„œ getServerInfo()๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ serverInfo ๊ฐ์ฒด์— ๋‹ด์•„ ์ฃผ์—ˆ์–ด์š”.

DiscordAppender.append() 71 ~ 111๋ฒˆ์งธ ์ค„

728x90


71๋ฒˆ์งธ ์ค„์€ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ์—ฌ๊ธฐ์„œ EmbedObject๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ ค๊ณ  ํ•ด์ฃผ์—ˆ์–ด์š”.
๋””์Šค์ฝ”๋“œ์—๋Š” Embed ํ˜•์‹์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— EmbedObject๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ์–ด์š”.

Discord Embed๋Š” ํƒ€์ดํ‹€, ์ƒ‰์ƒ, ์„ค๋ช… ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ์œ„ ์ฝ”๋“œ๋Š” ์˜ˆ์™ธ ๊ฐ„๋žต ๋‚ด์šฉ, ์˜ˆ์™ธ ์ƒ์„ธ ๋‚ด์šฉ, ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ๊ฐ, ์„œ๋ฒ„ ์ •๋ณด, MDC ์ •๋ณด  ๋“ฑ์„ Embed ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑํ•ด ์ฃผ์—ˆ์–ด์š”.

MDCUtil 15 ~ 35๋ฒˆ์งธ ์ค„


์œ„ ์œ ํ‹ธ ํด๋ž˜์Šค๋Š” Mappend Diagnostic Context(MDC)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ์ด๋ฒคํŠธ์— ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์š”. MDC๋Š” ๋กœ๊น… ์‹œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋กœ๊ทธ ์ด๋ฒคํŠธ์— ์ฒจ๋ถ€ํ•˜์—ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ์ •๋ณด๋ฅผ ๋” ๋งŽ์ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.

15๋ฒˆ์งธ ์ค„์€ Lombok์˜ ์–ด๋…ธํ…Œ์ด์…˜ ์ค‘ ํ•˜๋‚˜๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ๊ณ , PRIVATE ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์ง€์ •ํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.


์œ„์˜ ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋“ค์€ ๊ฐ’์— ๋‚˜์™€ ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ Key์˜ ์—ญํ• ์„ ํ•ด ์ฃผ๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ด์—์š”. 
๋กœ๊ทธ ์ด๋ฒคํŠธ์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฒจ๋ถ€ํ•  ๋•Œ, ์ด๋Ÿฌํ•œ Key๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ , ๋””์Šค์ฝ”๋“œ ์›นํ›…์— ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ด ์ฃผ๊ณ  ์žˆ์–ด์š”.

30๋ฒˆ์งธ ์ค„์€ Jackson Library๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ ,
์ดˆ๊ธฐํ™” ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

31๋ฒˆ์งธ ์ค„์€ Logback์—์„œ MDC๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์ด์—์š”.

33๋ฒˆ์งธ ์ค„ set()์€ mdc.put(key, json)์„ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, MDC์— JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํ‚ค๋กœ ์ถ”๊ฐ€ํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.
ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ MDC์— ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”.


MDCUtil 37 ~ 52๋ฒˆ์งธ ์ค„


์œ„ ๋ฉ”์†Œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ Key์™€ value๋กœ ๋ฐ›์•„ ์ฃผ๊ณ , value๊ฐ€ Null์ด ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ๊ฐ’์„ ๋ณด๊ธฐ ์ข‹์€ JSON ํƒ€์ž… ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด 40 ~ 41๋ฒˆ์งธ ์ค„์ด ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ณ , 42๋ฒˆ์งธ ์ค„์€ MDC์— JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ํ‚ค๋กœ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ MDC์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”.

JSON ํŒŒ์‹ฑ ์˜ค๋ฅ˜๋‚˜, JSON ์ƒ์„ฑ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด JsonProcessingException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.
์ด๋Š” Jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, Jackson์€ Java ๊ฐ์ฒด์™€ JSON ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ Java ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, Java ๊ฐ์ฒด๋ฅผ JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์ฃผ๊ณ  ์žˆ์–ด์š”.

์ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ try-catch๋ฌธ์„ ์žก์•„ ์ฃผ์—ˆ๊ณ , ์ด์— ๋Œ€ํ•œ ๋กœ๊ทธ ๊ธฐ๋ก์„ ๋˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

MDCUtil ํด๋ž˜์Šค์˜ setJsonValue()์—์„œ JsonProcessingException์ด ๋ฐœ์ƒํ•˜๋ฉด ErrorLogAppenderException์„ ๋˜์ง€๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”. ์ด๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ ์˜ˆ์™ธ๋ฅผ ์ƒ์œ„ ๋ฉ”์†Œ๋“œ๋กœ ์ „ํŒŒํ•˜์—ฌ ์ ์ ˆํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€ ๊ฑฐ์—์š”.



MDCUtil 37 ~ 52๋ฒˆ์งธ ์ค„


clear()๋Š” Logback์˜ MDC์—์„œ ์ €์žฅ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ง€์šฐ๋Š” ๋ฉ”์†Œ๋“œ์—์š”.
MDC ๊ฐ์ฒด๋Š” ๋กœ๊ทธ ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์œ ์ง€ํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”.

clear()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ MDC์— ์ €์žฅ๋œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ํ•ด๋‹น ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์Œ ๋กœ๊ทธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ์ด ์ „ ์ €์žฅ ์ •๋ณด๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๊น… ์ž‘์—…์ด ์™„๋ฃŒ ๋˜์—ˆ๊ฑฐ๋‚˜, ์Šค๋ ˆ๋“œ๊ฐ€ ์žฌ์‚ฌ์šฉ๋  ๋•Œ, MDC.clear()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ MDC๋ฅผ ํด๋ฆฌ์–ดํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์–ด์š”.

์ด๋ ‡๊ฒŒ ํ•˜์—ฌ MDC์— ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ์Œ“์ด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ •ํ™•ํ•˜๊ณ , ๊น”๋”ํ•œ ๋กœ๊น…์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋ž๋‹ˆ๋‹ค.


DiscordAppender.append() 71 ~ 111๋ฒˆ์งธ ์ค„


๋‹ค์‹œ ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด .addField()๋ฅผ ํ†ตํ•ด ๋””์Šค์ฝ”๋“œ ์›นํ›…์˜ EmbedObject์— ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
addField()๋Š” EmbedObjec์— ํŠน์ • ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€์˜ ์ž„๋ฒ ๋“œ์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด์š”.
์ด๋ฅผ ํ†ตํ•ด์„œ ์ฃผ๋‹ˆ๋Š” ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ๊ฐ, ์„œ๋ฒ„ ์ •๋ณด, ์š”์ฒญ ์ •๋ณด, ์ด์šฉ์ž IP ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.

MDC.Util.xxxx ๋ถ€๋ถ„์€ ์ถ”๊ฐ€ํ•  ํ•„๋“œ์˜ ์ œ๋ชฉ์„ ๋‚˜ํƒ€๋‚ด์ฃผ๊ณ  ์žˆ์–ด์š”. ์ด๋Š” MDC Key๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ํ•„๋“œ์— ํ‘œ์‹œํ•  ๊ฐ’์„ ๋„ฃ์–ด์ค€ ๋ถ€๋ถ„์ด์—์š”.

StringEscapeUtils.escapeJson()์„ ์‚ฌ์šฉํ•˜์—ฌ JSON ํ˜•์‹์œผ๋กœ ๊ฐ’์„ escapeํ•˜์—ฌ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ์—ˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠน์ˆ˜ ๋ฌธ์ž๋‚˜, ๋”ฐ์˜ดํ‘œ ๋“ฑ์„ JSON ํ˜•์‹์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•˜์—ฌ ๋””์Šค์ฝ”๋“œ์— ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

Objects.requireNonNull()์€ ๊ฐ ๊ฐ์ฒด์˜ ๊ฐ’์ด Null์ผ ๊ฒฝ์šฐ NPE(Null Point Exception)๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

์„ธ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜ inline ๋ถ€๋ถ„์€ ํ•„๋“œ๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ํ‘œ์‹œํ• ์ง€(true) ๋˜๋Š” ๋ธ”๋ก ํ˜•์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€(false)๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”. ์œ„์™€ ๊ฐ™์ด false๋กœ ์„ค์ •ํ•˜๋ฉด ํ•„๋“œ๊ฐ€ ๋ธ”๋ก ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ , true๋กœ ์„ค์ •ํ•˜๋ฉด ์ธ๋ผ์ธ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ต๋‹ˆ๋‹ค.


DiscordAppender.append() 126 ~ 128๋ฒˆ์งธ ์ค„

์œ„์˜ ๋‚ด์šฉ์€ ์š”์ฒญ ์ •๋ณด์˜ Body๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์ด์—์š”.

StringUtil.translateEscapes()๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์—์„œ ์ด์Šค์ผ€์ดํ”„๋œ ๋ฌธ์ž์—ด์„ ์›๋ž˜์˜ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์ด์—์š”. ์ด๋Š” ์ฃผ๋กœ JSON ํ˜•์‹์˜ ๋ฌธ์ž์—ด์—์„œ ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ์ด์Šค์ผ€์ดํ”„๋œ ๊ฒฝ์šฐ ์ด๋ฅผ ์›๋ž˜์˜ ๋ฌธ์ž๋กœ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์—์š”.

์ด๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์—์„œ ์ด์Šค์ผ€์ดํ”„๋œ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์›๋ž˜ ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด JSON ํ˜•์‹์˜ ๋ฌธ์ž์—ด์—์„œ๋Š” ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์—ญ์Šฌ๋ž˜์‹œ('\')๊ฐ€ ์‚ฌ์šฉ๋˜์š”. ๊ฐœํ–‰ ์ฒ˜๋ฆฌ ๊ฐ™์€ ๊ฒฝ์šฐ ('\n')๋กœ ํ‘œํ˜„๋˜๊ณ , ('\"')๋Š” ํฐ ๋”ฐ์˜ดํ‘œ๋ฅผ ์˜๋ฏธํ•ด์š”.

์ด๋ฅผ ํ†ตํ•ด HTTP ์š”์ฒญ์˜ Body ์ •๋ณด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋œ ๋ฌธ์ž์—ด์—์„œ ์ด์Šค์ผ€์ดํ”„๋œ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์›๋ž˜ ๋ฌธ์ž๋กœ ๋ณต์›ํ•˜์—ฌ ์›๋ณธ HTTP ์š”์ฒญ์˜ Body ๋‚ด์šฉ์„ ์ฝ๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ด์—์š”.

๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด JSON ๊ฐ’์ด ๋“ค์–ด์™”๋‹ค๋ฉด

"{ \"name\": \"John\", \"age\": 30, \"city\": \"New York\" }"


StringUtil.translateEscapes()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

{ "name": "John", "age": 30, "city": "New York" }

 

DiscordAppender.append() 131 ~ 140๋ฒˆ์งธ ์ค„


์œ„ ๋ฉ”์†Œ๋“œ๋Š” ์˜ˆ์™ธ ์ •๋ณด๋ฅผ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€์˜ ์ž„๋ฒ ๋“œ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์˜ˆ์™ธ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋””์Šค์ฝ”๋“œ ์›นํ›…์˜ ์ž…๋ฒ ๋“œ์— ์ถ”๊ฐ€๋˜๋„๋ก ํ•ด์ค€ ๋ถ€๋ถ„์ด์—์š”.

๋‹ค๋งŒ, ๋””์Šค์ฝ”๋“œ๋Š” ๋ฌด์ œํ•œ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—(๋ฌด๋ฃŒ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ) ์ตœ๋Œ€ 4,000์ž๊ฐ€ ๋„˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

131๋ฒˆ์งธ ์ค„์€ throwable ๋ณ€์ˆ˜๊ฐ€ Null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ๋‚ด์šฉ์ด ๋™์ž‘ํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

์ตœ์ดˆ ThrowableProxyUtil ํด๋ž˜์Šค๋Š” ์˜ˆ์™ธ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์ธ๋ฐ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ asString()์— throwable์„ ์ „๋‹ฌํ•˜์—ฌ throwable์— ํ•ด๋‹นํ•˜๋Š” ์˜ˆ์™ธ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

์ด ๋ฌธ์ž์—ด์—๋Š” ํด๋ž˜์Šค ์ด๋ฆ„, ๋ฉ”์‹œ์ง€, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์š”.

133๋ฒˆ์งธ ์ค„์€ ํ•ด๋‹น ์˜ˆ์™ธ ์ƒ์„ธ ์ •๋ณด๊ฐ€ 4000์ž๋ฅผ ๋„˜์„ ๊ฒฝ์šฐ 4000์ž๋งŒ ๋””์Šค์ฝ”๋“œ๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
subString()์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ 4000์ž๊นŒ์ง€์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ exception ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

134 ~ 139๋ฒˆ์งธ๋Š” discordWebhook ๊ฐ์ฒด์— ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€์˜ ์ž„๋ฒ ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค ์ž„๋ฒ ๋“œ์˜ ์ œ๋ชฉ์€ "[Exception ์ƒ์„ธ ๋‚ด์šฉ]" ์œผ๋กœ ํ•˜๊ณ , ์ž„๋ฒ ๋“œ์˜ ์ƒ‰์ƒ์€ messageColor ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ์ƒ‰์ƒ์œผ๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.

์ž„๋ฒ ๋“œ์˜ ์„ค๋ช…์€ exception ๋ณ€์ˆ˜๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ํ•ด ์ฃผ์—ˆ๊ณ , JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋œ ๋ฌธ์ž์—ด๋กœ ์ด์Šค์ผ€์ดํ”„ ๋˜์–ด ๋””์Šค์ฝ”๋“œ์— ์ „๋‹ฌ๋˜๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.


DiscordAppender.append() 142 ~ 149๋ฒˆ์งธ ์ค„

์ด ๋ถ€๋ถ„์€ ๋””์Šค์ฝ”๋“œ ์›นํ›…์˜ execute()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋กœ๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

๋งŒ์•ฝ ๋””์Šค์ฝ”๋“œ ๋ฉ”์‹œ์ง€ ์ „์†ก์— ์‹คํŒจํ•˜๋ฉด IOException์„ ํ„ฐํŠธ๋ฆฌ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ErrorLogAppenderException์œผ๋กœ ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ Exception์„ ๋˜์ง€๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

์ตœ์ดˆ execute()๋Š” discordWebhook ๊ฐ์ฒด์˜ execute()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋””์Šค์ฝ”๋“œ ์›นํ›…์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”. ์ด ๊ณณ์—์„œ ๋ฐ”๋กœ ๋””์Šค์ฝ”๋“œ์— ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

144๋ฒˆ์งธ ์ค„์—๋Š” inDBInsert()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
์ด ๋•Œ, ๋กœ๊ทธ ๋ ˆ๋ฒจ, ์˜ˆ์™ธ ๊ฐ„๋žต ์ •๋ณด, ์˜ˆ์™ธ ์ƒ์„ธ ์ •๋ณด, ์„œ๋ฒ„ ์ •๋ณด ๋ฐ MDC ์ •๋ณด๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.


๊ทธ๋ ‡๋‹ค๋ฉด ์ด์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜์˜€์„๊นŒ์š”?

์ด ๋ถ€๋ถ„์€ ์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐ ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

 

 

 

 

        ๐Ÿ“ฆ MDCFilter

์ฃผ๋‹ˆ๋Š” ์š”์ฒญ ์ •๋ณด๋ฅผ Filter๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

์ด์— ๋Œ€ํ•œ ์ •๋ฆฌ๋Š” ์ด ๊ณณ์— ํ•ด ๋‘์—ˆ์–ด์š”. ๋งŽ์€ ๊ด€์‹ฌ ๋ถ€ํƒ๋“œ๋ ค์š”.

 

[Spring Boot] OncePerRequestFilter๋ž€?

๐Ÿš€ OncePerRequestFilter ๐Ÿ”ฝ ๊ฐœ์š” ๐Ÿ“ฆ Filter์™€ OncePerRequestFilter ์ฐจ์ด Filter์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ ๋‚ด์šฉ์€ ์ด ๊ณณ์„ ํ†ตํ•ด ์ค€๋น„ํ•ด ๋‘์—ˆ์–ด์š”. OncePerRequestFilter Class๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ Http Request์˜ ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์—

junyharang.tistory.com

 

MDCFilter

๋ฐ˜์‘ํ˜•


์œ„ ํด๋ž˜์Šค๋Š” OncePerRequestFilter๋ฅผ ์ƒ์†ํ•˜๊ณ , HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณณ์ด์—์š”.
MDC(Mapped Diagnostic Context)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ๋กœ๊ทธ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

@Component๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง์˜ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง์˜ Bean(๋นˆ)์œผ๋กœ ๋“ฑ๋กํ•˜๋„๋ก ์ง€์ •ํ•ด ์ฃผ์—ˆ์–ด์š”. ์ฆ‰, ์Šคํ”„๋ง์ด ์ž๋™์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•˜์—ฌ ์ œ์–ด์˜ ์—ญ์ „(IoC)๋ฅผ ๊ตฌํ˜„ํ•ด ์Šคํ”„๋ง์—๊ฒŒ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ ๋ถ€๋ถ„์ด์—์š”.

doFilterInternal()์€ OncePerRequestFilter์—์„œ ์ƒ์†๋ฐ›์€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์—์š”.
HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง ๋กœ์ง ๊ตฌํ˜„ ๋ฉ”์†Œ๋“œ๋กœ ์ด ๋ฉ”์†Œ๋“œ๋Š” HttpServletRequest์™€ HttpservletResponse, FilterChain์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ  ์žˆ์–ด์š”.

36๋ฒˆ์งธ ์ค„์— WebUtils.getNativeRequest(request, HttpServletRequest.class)๋Š” ์Šคํ”„๋ง์˜ WebUtils๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HttpServletRequest ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•œ ๋ถ€๋ถ„์ด์—์š”.

38 ~ 45๋ฒˆ์งธ ์ค„์€ MDCUtil ํด๋ž˜์Šค์˜ ํŠน์ • ์ •๋ณด๋ฅผ MDC์— ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ์–ด์š”.
MDCUtils.setJsonValue()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ HTTP ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์„ MDC์— ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์–ด์š”.
์ด๋Š” ๋กœ๊ทธ ๊ธฐ๋ก ์‹œ ํ•ด๋‹น ์ •๋ณด๋“ค์ด ํ•จ๊ป˜ ๋กœ๊ทธ์— ๊ธฐ๋ก ๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด์—์š”.

๊ฐ ๋ฉ”์†Œ๋“œ๋“ค์„ HTTP ์š”์ฒญ์œผ๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ MDC์— ์ €์žฅํ•ด์ฃผ๊ณ  ์žˆ์–ด์š”.
์˜ˆ๋ฅผ ๋“ค์–ด MDCUtil.setJsonValue(MDCUtils.REQUEST_URI_MDC, HttpRequestUtil.getRequestUri()๋Š” HTTP ์š”์ฒญ์˜ URI ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ MDC์— "์ด์šฉ์ž ์š”์ฒญ URI ์ •๋ณด"๋ผ๋Š” ํ‚ค๋กœ ์ €์žฅ๋˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฑฐ์—์š”.

47๋ฒˆ์งธ ์ค„์€ ํ•„ํ„ฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด FilterChain์˜ doFilter()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์Œ ํ•„ํ„ฐ๋‚˜ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ œ์–ด๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น HTTP ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์„ MDC์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ๊ทธ์— ํ•จ๊ป˜ ๊ธฐ๋ก๋˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

์ด๋ฅผ ํ†ตํ•ด HTTP ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋“ค์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ ํ™•์ธ

        ๐Ÿ“ฆ ํ…Œ์ŠคํŠธ

 

์ด๋ ‡๊ฒŒ ์œ„์™€ ๊ฐ™์ด Exception์ด ๋ฐœ์ƒํ•˜๋ฉด Exception ๋‚ด์šฉ๊ณผ ํ•จ๊ป˜ ์„œ๋ฒ„ ์ •๋ณด, ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด์™€ ์š”์ฒญ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ํ•ด๋‹น ๋กœ๊ทธ ์ •๋ณด ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

 

 

 

 

์Šคํ”„๋ง ๋ถ€ํŠธ 3 ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ : ์ž๋ฐ” ํŽธ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•