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

2023. 7. 22. 23:07ใ†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

 

 

 

 

๐Ÿš€ ๋กœ๊ทธ ๋ฐ ์š”์ฒญ ์ด์šฉ์ž, ์š”์ฒญ ์ •๋ณด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ

    ๐Ÿ”ฝ ๊ฐœ์š”

        ๐Ÿ“ฆ ์†Œ๊ฐœ

์ง€๋‚œ ๊ธ€์—์„œ ์ฃผ๋‹ˆ๋Š” Exception ์ •๋ณด ๋ฐ ์š”์ฒญ ์ด์šฉ์ž, ์š”์ฒญ ์ •๋ณด๋ฅผ ๋””์Šค์ฝ”๋“œ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•ด ๋ณด์•˜์–ด์š”.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Exception ์ •๋ณด ๋ฐ ์š”์ฒญ ์ด์šฉ์ž, ์š”์ฒญ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•ด ๋ณด๋ ค๊ณ  ํ•ด์š”.

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

 

Logback-classic 1.2.8 DBAppender Missing

I'm trying to upgrade the logback-classic library from version 1.2.3 to 1.2.8. The patch notes say that all DB related code has been removed, so the main DBAppender class no longer exists in the new

stackoverflow.com


์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด๋‹ค๊ฐ€ ์ฃผ๋‹ˆ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ , ์ž‘์—…์„ ์ง„ํ–‰ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

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

        ๐Ÿ“ฆ DataBaseAppender.java

DataBaseAppender 14 ~ 40๋ฒˆ์งธ ์ค„


์œ„ ํด๋ž˜์Šค๋Š” Data Base์— Log ์ €์žฅ์„ ์œ„ํ•œ Appender๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

ํ•ด๋‹น ํด๋ž˜์Šค๋Š” DiscordAppender ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์€ ์ด ์ „ ๊ธ€์—์„œ ์ƒ์„ธํ•˜๊ฒŒ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”.

 

[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

 

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

์ตœ์ดˆ 31๋ฒˆ์งธ ์ค„์—์„œ ์œ„์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” DTO ๊ฐ์ฒด๋ฅผ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ์—ˆ์–ด์š”.

TotalErrorRecordSaveRequestDto


์œ„์™€ ๊ฐ™์ด ํ•ด๋‹น DTO๋Š” Exception ๋ฐœ์ƒ ์ผ์‹œ์™€ ๋กœ๊ทธ ๋ ˆ๋ฒจ, ์„œ๋ฒ„ ์ •๋ณด, ์ด์šฉ์ž ์ •๋ณด์™€ ์š”์ฒญ ์ •๋ณด ๊ทธ๋ฆฌ๊ณ , Exception ๋‚ด์šฉ ๋“ฑ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์—์š”.

DataBaseAppender 14 ~ 40๋ฒˆ์งธ ์ค„

728x90


๊ทธ๋Ÿฐ ๋’ค ํ•ด๋‹น DTO์— ๊ฐ๊ฐ์˜ ๋‚ด์šฉ๋“ค์„ ๋‹ด์•„ ์ฃผ์—ˆ์–ด์š”.

DataBaseAppender 42 ~ 71๋ฒˆ์งธ ์ค„


์ด์šฉ์ž ์ •๋ณด์™€ ์š”์ฒญ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด mdcPropertyMap์„ Key์™€ Value๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ์—ˆ์–ด์š”.
์ด๋ฅผ ํ†ตํ•ด 43 ~ 44๋ฒˆ์งธ ์ค„์— ๊ฐ๊ฐ์˜ Key์™€ Value ์ •๋ณด๋ฅผ ๋‹ด์•„ ์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋’ค ๋ถ„๊ธฐ๋ฌธ์„ ํ†ตํ•ด key๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , tottalErrorRecordSaveRequestDTO ๊ฐ์ฒด์— Setter๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ฐ’์ด ์•Œ๋งž๊ฒŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ ํ•ด ์ฃผ์—ˆ์–ด์š”.

60 ~ 66๋ฒˆ์งธ ์ค„์€ ์—๋Ÿฌ ๊ฐ„๋žต ๋‚ด์šฉ๊ณผ ์—๋Ÿฌ ์ƒ์„ธ ๋‚ด์šฉ์ด ๋‹ด๊ฒผ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ๋‹ด๊ฒจ ์žˆ๋‹ค๋ฉด ๊ฐ์ฒด์— ๋‹ด์„ ์ˆ˜ ์žˆ๋„๋ก ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์„ ๋ชจ๋‘ ๋Œ๊ณ , 69๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ฐ’์ด ๊ฐ์ฒด์— ์•Œ๋งž๊ฒŒ ๋‹ด๊ธฐ๋ฉด ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ์„ ์œ„ํ•œ ์—ฌ์ •์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

 

 

 

        ๐Ÿ“ฆ BackOfficeAPICaller.logSaveAPICall()

BackOfficeAPICaller.logSaveApiCall()


์ตœ์ดˆ ์œ„ ๋ฉ”์†Œ๋“œ 280๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด APIUriInfo.LOG ๊ธฐ๋ฐ˜์œผ๋กœ StringBuilder ๊ฐ์ฒด์ธ suffixURL ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด ์ฃผ์—ˆ์–ด์š”. APIUriInfo.Log๋Š” API ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ๋˜๋Š” URL์˜ ์ผ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ,

APIUrlInfo.java


31๋ฒˆ์งธ ์ค„์— LOG ์ƒ์ˆ˜ ๋ณ€์ˆ˜์— ์„ ์–ธ๋œ ๋ฌธ์ž์—ด ๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ API ํ˜ธ์ถœ์„ ์ค€๋น„ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

281๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด ApiCallUtil ํด๋ž˜์Šค์˜ callDiscordBotPostAPI()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ HTTP Method Post๋ฅผ ์ด์šฉํ•˜์—ฌ API๋ฅผ ํ˜ธ์ถœํ•ด ์ฃผ์—ˆ์–ด์š”. ์ด ๋•Œ, ํ˜ธ์ถœ ๋Œ€์ƒ URL๊ณผ ์ €์žฅํ•  ๊ฐ’์„ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ํ•จ๊ป˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ด ์ฃผ์—ˆ์–ด์š”.

 

 

        ๐Ÿ“ฆ APICallUtil.callDiscordBotPostAPI()

APICallUtil.callDiscordBotPostAPI() 67 ~ 98๋ฒˆ์งธ ์ค„

๋ฐ˜์‘ํ˜•


์œ„ ๋ฉ”์†Œ๋“œ๋Š” ๋ณธ๊ฒฉ์ ์œผ๋กœ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.

ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” suffixUrl๊ณผ object๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ , ํ•ด๋‹น URL๋กœ obecjt ๋ณ€์ˆ˜๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ POST ์š”์ฒญ์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.

์ตœ์ดˆ 76๋ฒˆ์งธ ์ค„์€ ๊ธฐ๋ณธ API ํ˜ธ์ถœ URL์˜ prefix ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.


Environment.initPrefixAPIURL()


์—ฌ๊ธฐ์„œ URL์˜ prefix๋ฅผ ์ •์˜ํ•ด ์ฃผ๋Š”๋ฐ, 39๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ๊ตฌ๋™ ํ™˜๊ฒฝ (local, dev, prod) ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด ์ค€ ๋’ค ํ•ด๋‹น ๊ตฌ๋™ ํ™˜๊ฒฝ์ด ์–ด๋–ค ๊ฒƒ์ด๋ƒ์˜ ๋”ฐ๋ผ URL์„ ๋‹ค๋ฅด๊ฒŒ ์ •์˜ํ•˜๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค 49๋ฒˆ์งธ ์ค„์— initCommonAPIURL()์„ ํ˜ธ์ถœํ•ด ์ค๋‹ˆ๋‹ค.


Environment.initCommonAPIURL()


ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” URL์— ๊ณตํ†ต์ ์œผ๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š” ๋‚ด์šฉ์„ ์ฒจ๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• ์„ ํ•ด ์ฃผ๊ณ  ์žˆ์–ด์š”.





APIUriInfo


๋ฐ”๋กœ ์œ„์™€ ๊ฐ™์ด ๊ตฌ๋™ Port ๋ฒˆํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ URL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ๋™ ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ๊ธฐ๋ณธ ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•˜๋Š” URL์„ ๋งŒ๋“ค์–ด ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

APICallUtil.callDiscordBotPostAPI() 67 ~ 98๋ฒˆ์งธ ์ค„


๋‹ค์‹œ ์ด ๋ถ€๋ถ„์„ ๋ณด๋ฉด 77๋ฒˆ์งธ ์ค„์— suffixUrl์„ defaultApiCallUrlInfo์— ์ถ”๊ฐ€ํ•˜์—ฌ ์™„์ „ํ•œ API ํ˜ธ์ถœ URL์„ ๊ตฌ์„ฑํ•ด ์ฃผ์—ˆ์–ด์š”.

defaultApiCallUrl์€ URL ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ์„ ์œ„ํ•œ API์˜ ์—”๋“œํฌ์ธํŠธ URL๋ฅผ ๋‚˜ํƒ€๋‚ด์š”.

78๋ฒˆ์งธ ์ค„์€ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ์™€ Java ๊ฐ์ฒด ์‚ฌ์ด์˜ ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” Jackson Library์˜ ObjectMapper ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

79๋ฒˆ์งธ ์ค„์€ POST ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ผ JSON ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

81๋ฒˆ์งธ ์ค„์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ object ๊ฐ์ฒด ์ฆ‰, DTO ๊ฐ์ฒด๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ์ „์— DTO ๊ฐ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ๋“ค์–ด์™”๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ด์—์š”.

์ œ๋Œ€๋กœ ๋“ค์–ด์™”๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ JSON ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ requestBodyJsonData์— ์ €์žฅํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.
์ด๋ฅผ ์œ„ํ•ด objectMapper.writeValueAsString()์„ ์ด์šฉํ•˜์—ฌ object ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

85๋ฒˆ์งธ ์ค„์€ defaultApiCallUrl๋กœ ๋ถ€ํ„ฐ HttpURLConnection์„ ์—ด์–ด API ํ˜ธ์ถœ์— ์‚ฌ์šฉํ•  ์—ฐ๊ฒฐ (connection)์„ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค 86 ~ 90๋ฒˆ์งธ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์•„์š”.

โˆ™ connection.setRequestMethod("POST"): HTTP ์š”์ฒญ ๋ฐฉ์‹์„ POST๋กœ ์„ค์ •.
โˆ™ connection.setConnectTimeout(5000): ์—ฐ๊ฒฐ ํƒ€์ž„์•„์›ƒ์„ 5000ms(5์ดˆ)๋กœ ์„ค์ •.
โˆ™ connection.setRequestProperty("Content-Type", "application/json"): POST ์š”์ฒญ์˜ Content-Type์„
    Application/json์œผ๋กœ ์„ค์ •. ์ด๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์ด JSON ํ˜•์‹์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•จ.
โˆ™ connection.setRequestProperty("Accept", "application/json"): Server๋กœ ๋ถ€ํ„ฐ ๋ฐ›์„ Data์˜ Content-Type์„ 
   application/json์œผ๋กœ ์„ค์ •. ์ด๋Š” Server์—๊ฒŒ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๋ถ€๋ถ„.
โˆ™ connection.setDoOutPut(true): ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ „์†กํ•  ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋ƒ„.

92๋ฒˆ์งธ ์ค„์€ connection.getOutputStream()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.
93 ~ 94๋ฒˆ์งธ ์ค„์€ requestBodyJsonData ๋ณ€์ˆ˜์˜ ๋ฌธ์ž์—ด์„ Byte Array(๋ฐ”์ดํŠธ ๋ฐฐ์—ด)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ๊ธฐ๋กํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.
๊ทธ๋Ÿฐ ๋’ค 95๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์•„ ์ค๋‹ˆ๋‹ค.

๋งŒ์•ฝ IO Exception์ด ๋ฐœ์ƒํ•˜๋ฉด ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ APICallException ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋œ callPostApi()๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ํ•ด๋‹น ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSON ๋ฐ์ดํ„ฐ๋ฅผ POST ๋ฐฉ์‹์œผ๋กœ ์ „์†กํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์–ด์š”. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— JSON ํ˜•ํƒœ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜์—ฌ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ณ , ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ „์†ก ์ค‘ IO Exception์ด ํ„ฐ์ง€๊ฒŒ ๋˜๋ฉด ์ด ์˜ˆ์™ธ๋Š” APICallException์œผ๋กœ ๋˜์ ธ์ง€๋ฉฐ, ์ด๋ฅผ ์ƒ์œ„ ์ฝ”๋“œ์—์„œ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

 

APICallUtil.callDiscordBotPostAPI() 100 ~ 114๋ฒˆ์งธ ์ค„


์œ„ ๋‚ด์šฉ์€ HTTP ์š”์ฒญ ๋’ค ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.
API ํ˜ธ์ถœ์˜ ์‘๋‹ต์ด HTTP ์ƒํƒœ ์ฝ”๋“œ 201(Created)์ธ ๊ฒฝ์šฐ์—๋งŒ Logic์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.


์ด ๊ฒฝ์šฐ์—๋Š” HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์–ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋กœ๊ทธ ๋“ฑ์ด ์ €์žฅ๋œ ๊ฒƒ์ด์—์š”.

๋งŒ์•ฝ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๋ฉด? ๋นˆ JSONObject๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.

์ข€ ๋” ์ž์„ธํžˆ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด 100๋ฒˆ์งธ ์ค„์€ connection.getResponseCode()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•ด ์ฃผ๊ณ , ์ด ๊ฐ’์ด 201์ธ ๊ฒฝ์šฐ์—๋งŒ ์ด ๋ธ”๋ก์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.
์ด๋Š” HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ด์š”.

try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { ... } catch (IOException ioException) { ... }

์œ„ ๋‚ด์šฉ์—์„œ connection.getInputStream()์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ InputStream์„ ๊ฐ€์ ธ์™€ ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค BufferedReader.readLine()์„ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ’์ด Null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์–ด์˜ค๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.
์ฝ์€ ๋ฐ์ดํ„ฐ๋Š” 104๋ฒˆ์งธ์— ์„ ์–ธํ•œ line๋ณ€์ˆ˜์— ์ €์žฅํ•ด ์ค๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ฝ์„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๊ฐ ์ค„์˜ ๋ฐ์ดํ„ฐ๋ฅผ line ๋ณ€์ˆ˜์— ์ €์žฅํ•ด ์ค๋‹ˆ๋‹ค.

107๋ฒˆ์งธ ์ค„์€ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ jsonObject์— ์ €์žฅํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”. line ๋ณ€์ˆ˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” JSON ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— JSONObject์˜ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์‹ฑํ•˜๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด jsonObject์— ์ตœ์ข…์ ์œผ๋กœ JSON ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋  ๊ฑฐ์—์š”. ๋”ฐ๋ผ์„œ ์ดํ›„์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.

109 ~ 111๋ฒˆ์งธ ์ค„์€ JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •์—์„œ IO Exception์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ถ€๋ถ„์ธ๋ฐ, ์ด ๊ฒฝ์šฐ log.error()๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊ทธ๋กœ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

๋งˆ์ง€๋ง‰ 113๋ฒˆ์งธ ์ค„์€ ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 201์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋˜๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๋นˆ JSONObject๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜, HTTP ์š”์ฒญ์ด ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•  ๊ฒƒ์ด์—์š”.

์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ jsonObject๋กœ ํŒŒ์‹ฑํ•˜๊ณ , HTTP ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 201์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์ด ํ›„ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API ์‘๋‹ต์„ ํ™œ์šฉํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

ํ•˜์ง€๋งŒ, HTTP ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 201์ด ์•„๋‹ˆ๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋นˆ JSONObject๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋˜๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ API ์ฝ”๋“œ ๋ถ„์„

        ๐Ÿ“ฆ ErrorRecordManagementController.java

ErrorRecordManagementController.logSave()


์œ„ ๋ถ€๋ถ„์ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” API ๋ถ€๋ถ„์ด์—์š”.

@ExcutionTimeCheck๋Š” ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ด ๋‚ด์šฉ์€ ์ด ๊ณณ์—์„œ ํ™•์ธ ํ•˜์‹ค ์ˆ˜ ์žˆ์–ด์š”.

 

[Spring Boot][Total-Back-Office Project] AOP, Annotation์„ ์ด์šฉํ•œ API ๋™์ž‘ ์‹œ๊ฐ„ ์ธก์ •

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

junyharang.tistory.com

 

์œ„ ๋ฉ”์†Œ๋“œ๋Š” TottalErrorRecordSaveRequestDto ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ณ , ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ๋’ค errorRecordService์˜ save()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ DefaultResponse ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ค€ ๋ถ€๋ถ„์ด์—์š”.


        ๐Ÿ“ฆ ErrorRecordServiceImpl.java

ErrorRecordServiceImpl 58 ~ 62๋ฒˆ์งธ ์ค„


์œ„ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด๋Š” ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•  DAO, ๋กœ๊ทธ ๋ฐœ์ƒ ๋“ฑ์— ์ผ์‹œ ๋“ฑ์„ ์ €์žฅํ•  DAO, ์ด์šฉ์ž ์ •๋ณด DAO, Error Log ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•  DAO๋ฅผ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ๊ณ , final ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด @RequiredArgsConstructor๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฃผ์ž…ํ•˜์—ฌ ์ฃผ์—ˆ์–ด์š”.

 

ErrorRecordServiceImpl 71 ~ 111๋ฒˆ์งธ ์ค„


์ตœ์ดˆ 81๋ฒˆ์งธ ์ค„์— checkNotNull()์„ ํ˜ธ์ถœํ•˜์—ฌ TottalErrorRecordSaveRequestDto ๊ฐ์ฒด๊ฐ€ Null์ธ์ง€๋ฅผ ํ™•์ธํ•ด ์ฃผ์—ˆ์–ด์š”.
๋งŒ์•ฝ Null์ด๋ผ๋ฉด ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ ErrorRecordException์ด ํ„ฐ์ง€๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

ErrorRecordServiceImpl.checkNotNull()



87๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ TottalErrorRecordSaveRequestDto ๊ฐ์ฒด์— ๋“ค์–ด์žˆ๋Š” ์ผ์ž์™€ ์‹œ๊ฐ„๊ฐ’์„ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด dateTimeSplit()์„ ํ˜ธ์ถœํ•ด ์ค๋‹ˆ๋‹ค.

StringUtil.dateTimeSplit()


์œ„ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด TottalErrorRecordSaveRequestDTO ๊ฐ์ฒด์— CreatedAt()์„ ํ†ตํ•ด Log ๋ฐœ์ƒ ์ผ์‹œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ, ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด splitCreateDateTime ๋ฌธ์ž์—ด ๋ฐฐ์—ด์— ๋‹ด์•„ ์ฃผ๊ณ  ์žˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค ๋‹ค์‹œ TottalErrorRecordSaveRequestDto์— setter๋ฅผ ์ด์šฉํ•ด์„œ 0๋ฒˆ ๋ฐฐ์—ด์— ๊ฐ’์€ Date ๋ณ€์ˆ˜์— 1๋ฒˆ ๋ฐฐ์—ด์˜ ๊ฐ’์€ Time ๋ณ€์ˆ˜์— ๋‹ด์•„์ง€๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

์ด์ œ 89๋ฒˆ์งธ ๋ถ€ํ„ฐ 96๋ฒˆ์งธ๊นŒ์ง€ ๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์„œ๋ฒ„ ์ •๋ณด, ๋กœ๊ทธ ๋ฐœ์ƒ ์ผ์‹œ ์ •๋ณด, ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด, ์ด์šฉ์ž ์š”์ฒญ ์ •๋ณด, Error Log ์ •๋ณด๋ฅผ ๊ฐ๊ฐ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

์œ„ ๋‚ด์šฉ ์ค‘ Error Log ์ €์žฅ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋‚ด์šฉ์€ ์ด ์ „์— ์ž‘์„ฑํ•œ
[Spring Boot][Total-Back-Office Project] AOP, Annotation์„ ์ด์šฉํ•œ API ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ feat.MyBatis & Test Code(JUnit 5) ์ด ๊ณณ์— ConnectedUserInfoService.java ๋ถ€๋ถ„์—์„œ ์ƒ์„ธํžˆ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋‘์—ˆ์–ด์š”.

 

[Spring Boot][Total-Back-Office Project] AOP, Annotation์„ ์ด์šฉํ•œ API ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ feat.MyBatis & Te

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

junyharang.tistory.com

 



๊ทธ๋ฆฌ๊ณ , 98๋ฒˆ์งธ ์ค„์„ ํ†ตํ•ด errorLogProcessNullCheck()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜๋œ PK ๊ฐ’์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด resultMap์— ๋‹ด์•„ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

ErrorRecordServiceImpl.errorLogProcessNullCheck()


์ด๋ ‡๊ฒŒ Null์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ Null์ด๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ชจ๋‘ Null์ด ์•„๋‹ˆ๋ผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

ErrorRecordServiceImpl.processErrorLogInfoSave()


๊ทธ๋Ÿผ ์ด๋ฒˆ์— Error Log๋ฅผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์‚ดํŽด ๋ณผ๊ฒŒ์š”.

์ตœ์ดˆ ์œ„ ๋ฉ”์†Œ๋“œ๋Š” TotalErrorRecordSaveRequestDto ๊ฐ์ฒด์™€ ์ด ์ „์— ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ๋ฐ˜ํ™˜๋œ PK ๊ฐ’ (๋‚ด๋ถ€ ์„œ๋ฒ„ ์ •๋ณด, Log ๋ฐœ์ƒ ์ผ์‹œ ์ •๋ณด, ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด, ์ด์šฉ์ž ์š”์ฒญ ์ •๋ณด)๋“ค์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ฒŒ ๋˜์š”.

๊ทธ๋Ÿฐ ๋’ค 341๋ฒˆ์งธ ์ค„ ~ 355๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ Null์ธ์ง€ ํ™•์ธํ•˜๊ณ , Null์ด๋ผ๋ฉด ๊ฐ๊ฐ์˜ ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ Exception์ด ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.

Null์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ €์žฅ ์—ฌ์ •์ด ์‹œ์ž‘๋˜์š”.

358๋ฒˆ์งธ ์ค„์— errorRecordManagementDao.findByErrorLogLevel()์„ ํ˜ธ์ถœํ•˜์—ฌ TotalErrorRecordSaveRequestDto์— ๋‹ด๊ธด Error Level์„ ํ†ตํ•ด ํ•ด๋‹น Log์— ํ•ด๋‹นํ•˜๋Š” Log Level์ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์—ˆ์–ด์š”.

ErrorRecordManagementDaoImpl.findByErrorLogLevel()

 

ErrorRecordManagementMapper.findByErrorLogLevel()


์œ„์™€ ๊ฐ™์ด log_level Table์—์„œ level์„ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ, ์ด ๋•Œ Log Level ID๋งŒ ์กฐํšŒ๋˜๊ฒŒ ํ•˜์—ฌ Long Type์œผ๋กœ ๋ฐ˜ํ™˜๋˜๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.


ErrorRecordServiceImpl.processErrorLogInfoSave()


๋‹ค์‹œ ์ด ๊ณณ์œผ๋กœ ๋Œ์•„์™€์„œ 361๋ฒˆ์งธ ์ค„์— ํ•ด๋‹น ID๊ฐ€ Null์ด๋ฉด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋…ผ Error Log ์ •๋ณด๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์ด๋Š” ์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด์™”๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด ์ฃผ๋‹ˆ๊ฐ€ ๋งŒ๋“  Exception์ด ํ„ฐ์ง€๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.


schema.sql log_level Table ์ •๋ณด

 

data.sql


์œ„์™€ ๊ฐ™์ด Error Log Level๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋„ฃ์–ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ’์ด ์•„๋‹ˆ๋ผ๋ฉด Exception์ด ํ„ฐ์ง€๋Š” ๊ฒƒ์ด์—์š”.


ErrorRecordServiceImpl.processErrorLogInfoSave()


์ด์ œ ์œ„์— ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Dao์˜ save()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š”๋ฐ, ์ด ๋•Œ, ์š”์ฒญ DTO์— builder()๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์„œ๋ฒ„ ์ •๋ณด์˜ PK, ๋กœ๊ทธ ๋ฐœ์ƒ ์ผ์‹œ์˜ PK, ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด์˜ ID, ์ด์šฉ์ž ์š”์ฒญ ์ •๋ณด์˜ ID, Log Level, Exception ๊ฐ„๋žต ๋‚ด์šฉ, Exception ์ƒ์„ธ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ VO๋กœ Mappingํ•˜๊ธฐ ์œ„ํ•ด toVO()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Mappingํ•œ ๋’ค ์ „๋‹ฌํ•ด ์ฃผ์—ˆ์–ด์š”. 


ErrorRecordManagementDaoImpl.save()

 

ErrorRecordManagementMapper.save()



ErrorRecordManagementMapper.xml


์œ„์™€ ๊ฐ™์ด SQL ๋ฌธ์ด ์ž‘์„ฑ๋˜๋„๋ก ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, log Table์— ์™ธ๋ถ€ํ‚ค๋กœ LOG, ๋‚ด๋ถ€ ์„œ๋ฒ„ ์ •๋ณด, ์ƒ์„ฑ ์ผ์‹œ, ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด, ์ด์šฉ์ž ์š”์ฒญ ์ •๋ณด, Log Level ์ •๋ณด๋ฅผ ๋‹ด์€ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ๊ฐ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ , ํ•ด๋‹น PK ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๊ฒŒ ํ•ด ์ฃผ์—ˆ๊ณ , Exception ๊ฐ„๋žต ์ •๋ณด์™€ Exception ์ƒ์„ธ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.


 

 

 

    ๐Ÿ”ฝ ํ™•์ธ

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

๊ทธ๋Ÿผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ž˜ ์ €์žฅ๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณผ๊ฒŒ์š”.

select * from server_info;



select * from data_created_date_time;

 

select * from connected_user;

 

select * from connected_user_request_info;

 

select * from log_level;

 

select * from log;

 

select * from log;


์œ„์™€ ๊ฐ™์ด Exception ์ด ํ„ฐ์ง€๋ฉด ์ฃผ๋‹ˆ๊ฐ€ ์ €์žฅํ•˜๊ณ ์ž ํ–ˆ๋˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ž˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ–ˆ๋‹ค๋ฉด View๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ธ๋ฐ, ์ฃผ๋‹ˆ๋Š” ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ์—ˆ์–ด์š”.

์œ„์˜ ๊ตฌํ˜„ ์ฝ”๋“œ์™€๋Š” ๋‹ค๋ฅด์ง€๋งŒ, ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ๋งŒ๋“ค์—ˆ๋˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ตฌํ˜„ํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ๊ณ , ์ฃผ๋‹ˆ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”.

 

[Spring Boot] Discord Bot(๋””์Šค์ฝ”๋“œ ๋ด‡) ๋งŒ๋“ค๊ธฐ

์ „์ž์ •๋ถ€ ํ‘œ์ค€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์–‘๋Œ€ ํ•ต์‹ฌ ๊ธฐ์ˆ  ์„ธํŠธ : ์Šคํ”„๋ง + ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค COUPANG www.coupang.com "์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค." ๐Ÿ—‚ ๋ชฉ์ฐจ

junyharang.tistory.com

 

 

 

        ๐Ÿ“ฆ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

ํ•ด๋‹น ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—ญ์‹œ ์ด ์ „์— ์ž‘์„ฑํ•œ ๊ธ€ [Spring Boot][Total-Back-Office Project] AOP, Annotation์„ ์ด์šฉํ•œ API ์š”์ฒญ ์ด์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ feat.MyBatis & Test Code(JUnit 5)์™€ ํฐ ์ฐจ์ด๊ฐ€ ์—†๊ณ , ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„์€ Controller Test ๋ถ€ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณผ๊ฒŒ์š”.

ErrorRecordManagementControllerTest 77 ~ 103๋ฒˆ์งธ ์ค„


์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” @WebMvcTest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ErrorRecordManagementController ํด๋ž˜์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ฉฐ, Mockito๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ErrorRecordService๋ฅผ Mock์œผ๋กœ ๋Œ€์ฒดํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

77๋ฒˆ์งธ ์ค„์€ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ ์‹คํ–‰์ˆœ์„œ๋ฅผ
MethodOrderer.OrderAnnotaion ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”. ์ฆ‰, @Order๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

78๋ฒˆ์งธ ์ค„์€ Mockito ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ™•์žฅ ํด๋ž˜์Šค MockitoExtension์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

79๋ฒˆ์งธ ์ค„์€ ErrorRecordManagementController ํด๋ž˜์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ @WebMvcTest๋ฅผ ์„ ์–ธํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์›น ๊ณ„์ธต ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ Bean(๋นˆ)๋“ค๋งŒ Load(๋กœ๋“œ)ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์ค€ ๊ฒƒ์ด์—์š”.

82 ~ 83๋ฒˆ์งธ ์ค„์€ MockMvc ๊ฐ์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์ž… ๋ฐ›์•„ ์ฃผ์—ˆ์–ด์š”.

85 ~ 86๋ฒˆ์งธ ์ค„์€ ErrorRecordService์˜ Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›์•„ ์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”.
์ด๋Š” ErrorRecordService์˜ ์‹ค์ œ ๊ตฌํ˜„์„ ๋Œ€์ฒดํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ์—์„œ ๋ชฉ์ ์— ๋งž๋Š” ๋™์ž‘์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„์—์š”.

๊ทธ๋ฆฌ๊ณ , 88 ~ 103๋ฒˆ์งธ ์ค„๊นŒ์ง€์˜ ๋ฉค๋ฒ„(ํ•„๋“œ) ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค์„ ์„ ์–ธํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

์ด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋Š” ์›น ๊ณ„์ธต์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋ถ€๋ถ„์ด๊ณ , ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ์ฃผ์ž…๋œ MockMvc ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ErrorRecordManagementController ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์˜ˆ์ƒ๋˜๋Š” ์‘๋‹ต ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์š”.


ErrorRecordManagementControllerTest 156 ~ 178๋ฒˆ์งธ ์ค„


์œ„์˜ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ”๋กœ Log ์ €์žฅ์„ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•œ ์ปจํŠธ๋กค๋Ÿฌ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์—์š”.

์—ฌ๊ธฐ์„œ @Test๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถ€๋ถ„์ด๊ณ , @Order(0)์€ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ด ์ค€ ๋ถ€๋ถ„์œผ๋กœ ์ˆœ์„œ๋ฅผ 0๋ฒˆ์งธ๋กœ ์ง€์ •ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

@DisplayName()์€ ํ•ด๋‹น ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์˜ ํ…Œ์ŠคํŠธ ์ถœ๋ ฅ ์‹œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.

์ตœ์ดˆ 161 ~ 166๋ฒˆ์งธ๊นŒ์ง€ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ resultMap์„ ์„ ์–ธํ•˜๊ณ , ๊ฐ๊ฐ์˜ ๊ฐ’์„ ๋‹ด์•„ ์ฃผ์—ˆ์–ด์š”.

168 ~ 169๋ฒˆ์งธ ์ค„์€ errorRecordService.save()๋ฅผ Mock ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•˜์—ฌ, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ฃผ์–ด์ง„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ง€์ •ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”.
given(...).willReturn(...)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.

172๋ฒˆ์งธ ์ค„ MockMvc.perform(...) ๋ถ€๋ถ„์€ mockMvc ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LogSave()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.
์ด ๋•Œ, post ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP POST ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๊ณ , contentType(MediaType.APPLICATION_JSON)์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์˜ Content-Type์„ JSON ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.
content(...)๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์„ ์„ค์ •ํ•˜๋Š” ๊ณณ์œผ๋กœ initalizedMockModels()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์š”์ฒญ ๋ณธ๋ฌธ์— ์ถ”๊ฐ€ํ•ด ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์ด์—์š”.


ErrorRecordManagementControllerTest.initializedMockModles()


์œ„ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด Mock TotalErrorRecordSaveRequestDto ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ์–ด์š”.


ErrorRecordManagementControllerTest 156 ~ 178๋ฒˆ์งธ ์ค„


๋‹ค์‹œ ์ด ๊ณณ์„ ๋ณด๋ฉด 174๋ฒˆ์งธ ์ค„์— .andDo(print())๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ ๊ณผ์ •์—์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋„๋ก ํ•ด ์ค€ ๋ถ€๋ถ„์ด์—์š”. ์ด๋Š” ๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ต๋‹ˆ๋‹ค.

175 ~ 177๋ฒˆ์งธ ์ค„์€ ์˜ˆ์ƒ๋˜๋Š” ์‘๋‹ต์„ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ, 175๋ฒˆ์งธ ์ค„์€ HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 200(OK)์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด๊ณ , 176๋ฒˆ์งธ ์ค„์€ JSON ์‘๋‹ต ๋ณธ๋ฌธ์—์„œ statusCode ํ•„๋“œ ๊ฐ’์ด CREATE.getStatusCode()์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.


177๋ฒˆ์งธ ์ค„์€ JSON ์‘๋‹ต ๋ณธ๋ฌธ์—์„œ message ํ•„๋“œ ๊ฐ’์ด CREATE.getMessage()์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.

์œ„ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋Š” logSave()๊ฐ€ ์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์†Œ๋“œ์—์š”.
๊ทธ๋ฆฌ๊ณ , ์‘๋‹ต ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ƒํ•œ๋Œ€๋กœ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์–ด์š”. errorRecordService.save()๋Š” Mock ๊ฐ์ฒด๋กœ ๋Œ€์ฒด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋™์ž‘์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•„์š”. ๋Œ€์‹  given(...).willReturn(...)์„ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์‹œ์— ๋ฐ˜ํ™˜ํ•  ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ์ง€์ •ํ•ด ์ฃผ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌ ์‹œ์ผœ ์‹ค์ œ ์„œ๋น„์Šค์™€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ , ๋กœ์ง์˜ ๋™์ž‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.





 

 

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

COUPANG

www.coupang.com

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

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•