TIL๐Ÿ”ฅ

์˜ค๋Š˜์˜ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ์–ด์ œ๋ถ€ํ„ฐ ํ”„๋ก ํŠธ ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ํ† ์Šค ๊ฒฐ์ œ API ์—ฐ๋™ ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐ”๋‹ค. ๊ทผ๋ฐ ๋ฌธ์ œ์  1. 401 Unauthorized tossPayments = TossPayments(key); ํ•ด์ฃผ๋Š” ๊ณผ์ •์—์„œ, ํ‚ค ๊ฐ’์ด ๊ถŒํ•œ์ด ์—†๋Š” ๊ฑฐ๋‹ค๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ฃผ๊ตฌ์žฅ์ฐฝ .......... ๋ถ„๋ช… ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋ฐ›์€ ๊ฐ’์„ ์ž˜๋„ฃ์–ด์คฌ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ๊ณ„์†ํ•ด์„œ ๋‹ค๋ฅธ ๊ฐ’๋„ ๋„ฃ์–ด์ฃผ๊ณ  ๋‹ค์‹œ ๋„ฃ์–ด์ฃผ๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ˆ ๋๋‹ค.... ์™œ ๋์ง€???? ๋ญ”๊ฐ€ ๋’ค์— ๊ณต๋ฐฑ์ด๋ผ๋˜๊ฐ€ .... ์ด๋Ÿฐ๊ฒŒ ๋“ค์–ด๊ฐ„๊ฑฐ ๊ฐ™๋‹ค.... ๋์œผ๋‹ˆ๋ญ 2. ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ ํ›„, ํ—ค๋”์— ํ‘œ์‹œ๋˜๋Š” ๋ฉ”๋‰ด๊ฐ€ ๋‹ฌ๋ผ์ ธ์•ผํ•˜๋Š”๋ฐ function checkLoginStatus() { var token = Cookies.get('Authorization'); // ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ A..
TCP (Transmission Control Protocol): ์—ฐ๊ฒฐ ์ง€ํ–ฅ์„ฑ (Connection-Oriented): TCP๋Š” ์—ฐ๊ฒฐ์„ ์„ฑ๋ฆฝํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ ํ›„์—๋Š” ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹ ๋ขฐ์„ฑ ์žˆ๊ณ  ์ •ํ™•ํ•œ ์ „์†ก์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹ ๋ขฐ์„ฑ ๋ฐ ํ๋ฆ„ ์ œ์–ด: TCP๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ „์†กํ•˜๊ณ , ์ˆ˜์‹ ์ธก์—์„œ๋Š” ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์žฌ์กฐ๋ฆฝํ•˜์—ฌ ์ƒ์œ„ ๊ณ„์ธต์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ๋ฆ„ ์ œ์–ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ˆ˜์‹ ์ธก์˜ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ๊ณผ๋„ํ•œ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ ๋ณด์žฅ: TCP๋Š” ๋ฐ์ดํ„ฐ์˜ ์ „์†ก ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์—ฌ ์ˆ˜์‹ ์ธก์—์„œ๋Š” ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ ์ˆœ์„œ๋กœ ์žฌ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ๋†’์€ ์‹ ๋ขฐ์„ฑ: ์˜ค๋ฅ˜ ๋ณต๊ตฌ ๊ธฐ๋Šฅ๊ณผ ์žฌ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ: ์›น ๋ธŒ๋ผ์šฐ์ €์˜ HTTP ํ†ต์‹ , ..
์˜ค๋Š˜์˜ ํ—›์ง“๊ฑฐ๋ฆฌ โš ๏ธ ํ† ํฐ ๊ฒ€์ฆ,์ธ๊ฐ€ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ์ตœ์ƒ์œ„ ํ•„ํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์—ˆ๋”ฐ. ๋น ๋ฅด๊ฒŒ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฒดํ‚น์„ ํ•˜๊ณ  ๋„˜์–ด๊ฐ”๋Š”๋ฐ, ์ดํ›„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ์—๋Ÿฌ์˜ ํ–ฅ์—ฐ... ๋„๋Œ€์ฒด ์–ด๋””์„œ ๋‚˜๋Š” ๊ฒƒ์ธ๊ฐ€ ๋ณด๋‹ˆ, ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„์— ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•„ํ„ฐ์˜ ์ˆœ์„œ(?) ์„ค์ •์ด ๋ฌธ์ œ์ธ๊ฐ€ํ•ด์„œ, addFilterBefore()์„ ์ด๊ฒƒ์ €๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ดค๋‹ค. .addFilterBefore(exceptionHandlerFilter(), JwtAuthenticationFilter.class) ๊ธฐ์กด -> ์˜ˆ์™ธ๋Š” ์›ํ•˜๋Š” ๋ฐ”๊ฐ€ ๋‚˜์˜ค์ง€๋งŒ, ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ, ์ด์ƒํ•œ ์—๋Ÿฌ๊ฐ€ ๋œธ .addFilterBefore(exceptionHandlerFilter(), JwtAuthoriza..
์˜ค๋Š˜์€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ํ–‡๋‹ค 1. ๊ธฐ์กด ) ์–ด๋“œ๋ฏผ ์œ ์ € ํšŒ์› ๊ฐ€์ž…(์–ด๋“œ๋ฏผ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ ) -> ๋ณ€๊ฒฝ ) ์ดˆ๊ธฐ ์–ด๋“œ๋ฏผ์„ data.sql๋กœ ์ง์ ‘ ๋„ฃ์–ด์ฃผ๊ณ , ์ดํ›„ ์ถ”๊ฐ€๋˜๋Š” ๊ด€๋ฆฌ์ž๋“ค์€ ๊ธฐ์กด ๊ด€๋ฆฌ์ž๋“ค์ด ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ฐฉ์‹ (โœ… ๊ตฌํ˜„ํ•ด์•ผํ•จ) 2. ๊ด€๋ฆฌ์ž API๋Š” ๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก 3. ๊ธฐ์กด) JWT Token ๊ฒ€์ฆ ์‹คํŒจ ์‹œ, log.error ๋กœ ๋กœ๊ทธ๋งŒ ์ฐ์–ด์คฌ๋Š”๋ฐ, ๋ณ€๊ฒฝ ) ApiException์„ ๋˜์ ธ์„œ Response๋ฅผ ์ฃผ๋„๋ก ์ˆ˜์ • - ์ถ”๊ฐ€ ์ˆ™์ œ โš ๏ธ, ์ตœ์ƒ์œ„ Filter๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ๊ธฐ์„œ ํ•˜๋„๋ก ํ•ด์ฃผ๊ธฐ โš ๏ธ 4. ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ SMS ์ธ์ฆ ๊ธฐ๋Šฅ 50% ๊ตฌํ˜„ ์™„๋ฃŒ (..... ์ „์†ก๊นŒ์ง„ ๋๊ณ , ์ด์ œ ์ •๋ฆฌ์™€ redis์— ์ €์žฅํ•˜๊ณ , ํšŒ์› ๊ฐ€์ž… ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ™•์ธ๊นŒ์ง€ ใ„ฑใ„ฑ)
๊นจ๋‹ฌ์€ ์  ๋‚˜๋Š” ๋‹ค๋ฅธ ํŒ€์›๋“ค๋ณด๋‹ค ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ๋‹ค... ๋งŽ์ด ๋ฐฐ์›Œ๊ฐ€์Ÿˆ! ํ™”์ดํŒ…! ๊ทธ๋ฆฌ๊ณ  ํŒ€์˜ ๋ง‰๋‚ด๋กœ์„œ(๋งž๋‚˜..?) ์„œ๊ธฐ๋ฅผ ๋งก๊ณ  ์žˆ๋Š”๋ฐ ์ดํ›„์— ๋ณด๋‹ˆ ๋„ˆ๋ฌด ์ค‘๊ตฌ๋‚œ๋ฐฉ ์ •๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์—ˆ๋‹ค. ์ •๋ฆฌ๋ฅผ ๋” ์ž˜ ํ•˜์ž! 01/06 ์ž ๊ฐœ๋ฐœ ์ผ์ง€ ์•ˆ๊ฑด1 : ๊ฐ์ฒด์ง€ํ–ฅ์˜ 5๊ฐ€์ง€ ์›์น™์ค‘ ์˜์กด ์—ญ์ „ ์›์น™ ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ถ”๊ฐ€ ์„ค์ •ํ•จ! User of(String email, String password…), User of(UserCreateRequest) entity๋Š” request์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๊ทธ ์ž์ฒด๋กœ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•จ Request.toEntity(User) → User of(String email, String password…) ์ด ๋ถ€๋ถ„์˜ ์ดํ›„ ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌ, Sequence ๊ฐ™์€ ๊ฒฝ์šฐ request๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๋ฐ..
์ตœ์ข… ํ”„๋กœ์ ํŠธ์— ๋“ค์–ด๊ฐ”๋‹ค. ๊ธฐ์กด ํŒ€๋“ค๊ณผ ๋‹ฌ๋ฆฌ S.A ๋ถ€ํ„ฐ ์—„์ฒญ ์„ธ์„ธํ•˜๊ฒŒ ์งฐ๋Š”๋ฐ, ์–ด๋ ต๋‹ค... ๊ธฐ๋Šฅ ๋ชฉ๋ก์„ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  → ์•„ํ‚คํ…์ณ ๊ทธ๋ฆฌ๊ณ  → ์™€์ด์–ด ํ”„๋ ˆ์ž„ → ERD → API ๋ช…์„ธ์„œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ์‚ฌ์‹ค API ๋ช…์„ธ์„œ ์ž‘์„ฑ์— ์–ด๋ ค์›€์ด ๋งŽ์•„์„œ ์ค‘๊ฐ„ ์ค‘๊ฐ„์— ๊ทธ๋งŒ๋‘๊ณ  ์™€์ด์–ด ํ”„๋ ˆ์ž„์„ ๊ทธ๋ฆฌ๊ณ , ERD๋ฅผ ์„ค๊ณ„ํ•œ ํ›„์— ์ง„ํ–‰ํ–ˆ๋‹ค. ERD๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๊ฐ€์žฅ ์–ด๋ ค์› ๋‹ค. ๊ณต์—ฐ์žฅ๊ณผ ์ขŒ์„์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ขŒ์„ ์•ˆ์— ์ด ์ขŒ์„์ด ๊ฒฝ๋งค์„์ธ์ง€ ์„ ์ฐฉ์„์ธ์ง€๋ฅผ ํ‘œ๊ธฐํ•˜๋Š” ์ปฌ๋Ÿผ๊ณผ ๊ฐ€๊ฒฉ ์ปฌ๋Ÿผ์ด ๋“ค์–ด์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐ์„ ๊ณฐ๊ณฐํžˆ ํ•ด๋ณด๋‹ˆ(๋‹ค๋ฅธ ํŒ€์›๋ถ„์ด ใ…Ž) ์ขŒ์„์˜ ๊ฐ€๊ฒฉ, ํŒ๋งค ํƒ€์ž…์€ ๊ณต์—ฐ์žฅ์ด ์•„๋‹ˆ๋ผ ๊ณต์—ฐ์— ๋”ฐ๋ผ ๋ณ€๋™๋˜๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์—ฐ๊ณผ ์ขŒ์„์˜ ๋ณตํ•ฉํ‚ค๋กœ ๊ตฌ์„ฑ๋œ ๊ณต์—ฐ ๋ณ„ ์ขŒ์„ ๊ฐ€๊ฒฉ ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ€๊ฒฉ๊ณผ ํŒ..
๋ฐœํ‘œ ํ”ผ๋“œ๋ฐฑ์—์„œ GitHub Action Redis TTL ์•„ํ‚คํ…์ณ ์— ๋Œ€ํ•ด ๋“ค์—ˆ๋‹ค. ๊ณต๋ถ€ํ•˜์ž ใ…Ž ๋‚ด์ผ....
CardService ํด๋ž˜์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๋ฐ, ์›Œ๋‚™ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„ Mockito๋ฅผ ํ™œ์šฉํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์›Ÿ๋‹ค... given-willReturn ์ด ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ , ์ƒ์œ„ ์—”ํ‹ฐํ‹ฐ์˜ id๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ์ฐจ๋ผ๋ฆฌ H2๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ ๊ฐ’์„ ๋„ฃ๋„๋ก ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ Never ์—†์—ˆ๋‹ค. ํ•˜์ง€๋งŒ!! โš ๏ธ ํ•œ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ์ง€์›Œ์ค˜์•ผ ํ–ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์˜ repository๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, service ๋‹จ์„ ๊ฑฐ์ณ์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— deleteAll ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ mockito ๋ฅผ ์ ์šฉํ•ด๋ณด๋ คํ•˜๋‹ค ์žฅ๋ ฌํžˆ ์‹คํŒจ....... ๋‹ค์‹œ ๊ธฐ์กด์œผ๋กœ ๋Œ์•„์™€์„œ ์—ฌ๋Ÿฌ ์„œ์น˜๋ฅผ ํ•ด๋ณธ ๊ฒฐ๊ณผ Databas..
KIMHYEYUN
'TIL๐Ÿ”ฅ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก