๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ „์ฒด ๊ธ€199

[์—๋Ÿฌ] For queries with named parameters you need to use provide names for method parameters ๋ฌธ์ œ ์ƒํ™ฉ Like column์˜ enum ํƒ€์ž… column์—์„œ ํ•ด๋‹น ์—๋Ÿฌ ๋ฐœ์ƒ ๋ฐœ์ƒ ์›์ธ ํ•ด๋‹น ์—๋Ÿฌ๋Š”@Param() ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ name ์ง€์ •์„ ํ•ด์ฃผ์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. (ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” update, delete ๋“ฑ์˜ query์˜ ๊ฒฝ์šฐ, ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ name์„ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.) ํ•˜์ง€๋งŒ ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ๋ช…์‹œํ•ด์ค€ ์ƒํƒœ์˜€๋Š”๋ฐ๋„ ์ž๊พธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• Java 8๋ฒ„์ „ ์ดํ›„๋ถ€ํ„ฐ๋Š” "Preferences(Command + ,) > Build, Execution, Deployment > Compiler > Java Compiler" ์—์„œ Additional command line parameters ๋ถ€๋ถ„์— -parameters ๋ฅผ .. 2023. 10. 5.
[์—๋Ÿฌ] MySQL Data truncated for column ๋ฌธ์ œ ์ƒํ™ฉ Like column์˜ enum ํƒ€์ž… column์—์„œ ํ•ด๋‹น ์—๋Ÿฌ ๋ฐœ์ƒ ๋ฐœ์ƒ ์›์ธ ํ•ด๋‹น ์—๋Ÿฌ๋Š” db์— ์žˆ๋Š” column๊ณผ ์ž๋ฃŒํ˜•์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค ํ•˜์ง€๋งŒ ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” db์™€ ์ฝ”๋“œ ๋ชจ๋‘ enum์œผ๋กœ ์ž˜ ์„ค์ •์ด ๋˜์–ด ์žˆ์—ˆ๋‹ค public class UserLikes { ... @Enumerated(EnumType.STRING) // Enum ํƒ€์ž…์œผ๋กœ ์ €์žฅ๋˜๋„๋ก ์„ค์ • @Column(nullable = false) private LikeEnum likeType; // Enum ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ ... } LikeEnum์˜ ๊ฐ’์ด ๋‹ฌ๋ผ์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด Enum์— company๋ฅผ ๋จผ์ € ์ถ”๊ฐ€ํ•ด์„œ ์˜ฌ๋ ธ๋Š”๋ฐ, DB์˜ enum์—๋Š” company๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ  ๋‚ด ๋กœ์ปฌ enumty.. 2023. 10. 4.
[Github Actions] PR open ์‹œ ๋ผ๋ฒจ ์ถ”๊ฐ€ํ•˜๊ณ  closed ์‹œ ์‚ญ์ œํ•˜๊ธฐ ํ˜„์žฌ ์ƒํ™ฉ PR ๋ฆฌ๋ทฐ ๊ด€๋ จ ๋ผ๋ฒจ์„ ๋งŒ๋“ค์–ด์„œ ๋ฆฌ๋ทฐ ์ƒํ™ฉ ๋ฐ ๋ฐ˜์˜ ์ƒํ™ฉ์„ ํŠธ๋ž˜ํ‚นํ•˜๊ณ  ์žˆ์—ˆ๋‹ค ํ๋ฆ„์€ ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™๋‹ค 1. PR open : ๋ฆฌ๋ทฐ ํ•„์š” ๋ผ๋ฒจ ์ถ”๊ฐ€ - ๋ฆฌ๋ทฐ์ค‘ : ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ฆฌ๋ทฐ ์ค‘์ธ ๊ฒฝ์šฐ - ๋‹ต๋ณ€ ํ•„์š” : ๋ฆฌ๋ทฐ ๊ณผ์ • ์ค‘์— ์งˆ๋ฌธ์ด ์ƒ๊ฒจ PR ๋‹ด๋‹น์ž์˜ ๋‹ต๋ณ€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ - ์ˆ˜์ • ์š”์ฒญ : request changes์ธ ๊ฒฝ์šฐ - ์ˆ˜์ • ๋ฐ˜์˜ ์ค‘ : ์š”์ฒญ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ - ๋จธ์ง€ ๊ฐ€๋Šฅ : ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ฆฌ๋ทฐ ์™„๋ฃŒํ•˜๊ณ  ๋ฌธ์ œ ์—†๋Š” ๊ฒฝ์šฐ 2. PR close : ๋จธ์ง€ ๊ฐ€๋Šฅ ๋ผ๋ฒจ ์‚ญ์ œ ํ•˜์ง€๋งŒ ๋งค๋ฒˆ PR์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ๋ผ๋ฒจ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ท€์ฐฎ์•˜๋‹ค ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์‹ซ์—ˆ๋˜ ๊ฒƒ์€ PR์„ ๋จธ์ง€ํ•œ ์ดํ›„์— ๋‚จ๋Š” ์ง„ํ–‰๊ณผ์ • ๋ผ๋ฒจ๋“ค์ด์—ˆ๋‹ค!! ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ˆ˜๋™์œผ๋กœ ๋จธ์ง€ ์‹œ ํ•ด๋‹น ๋ผ๋ฒจ์„ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ PR ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ.. 2023. 8. 15.
[์„ค๊ณ„] Image ์ „์†ก๊ณผ ๋ฐ์ดํ„ฐ ์ „์†ก API ๋ถ„๋ฆฌ ํ˜„์žฌ ์ƒํ™ฉ ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๋ฐ์ดํ„ฐ JSON๊ณผ ์ด๋ฏธ์ง€(form-data)๋ฅผ ํ•˜๋‚˜์˜ API๋ฅผ ํ†ตํ•ด ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์  ๋ณดํ†ต ์ด๋ฏธ์ง€์™€ JSON๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. API๋ฅผ ์ „์†กํ•  ๋•Œ๋Š” ๋ณดํ†ต content/type์„ application/json์œผ๋กœ ์ „์†กํ•˜๋Š”๋ฐ ์ด๊ฒƒ์€ multipart/formdata ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ด์— ๋”ฐ๋ผ, ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€ ์ธ๋ฐ ๋ถ„๋ฆฌํ•ด์„œ ์š”์ฒญํ•˜๊ธฐ ์„œ๋ฒ„๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ ์ด๋ฏธ์ง€์˜ id(๋˜๋Š” ํŒŒ์ผ๋ช…)๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ์ง€์˜ id์™€ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ application/json์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. base64 ์ธ์ฝ”๋”ฉ ์ด๋ฏธ์ง€๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉํ•ด์„œ application/json์œผ๋กœ ์ „์†กํ•  ๋ฐ์ดํ„ฐ์™€ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€๋ฅผ ํ•จ๊ป˜.. 2023. 8. 13.
[์˜ค๋ฅ˜] multipart์—์„œ PUT์ด ๋จนํžˆ์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ๋ฌธ์ œ ์ƒํ™ฉ PUT ๋ฐฉ์‹์œผ๋กœ multipart๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ, ๊ธฐ๋Šฅ ์ž์ฒด๋Š” ์ž˜ ๋Œ์•„๊ฐ”์œผ๋‚˜ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ž๊พธ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊น€ ๋ฐœ์ƒ ์›์ธ ๊ธฐ๋ณธ์ ์œผ๋กœ multipart ์š”์ฒญ์€ GET/POST๋งŒ ์ง€์›ํ•œ๋‹ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• POST๋กœ ์ˆ˜์ •ํ•˜์˜€๋”๋‹ˆ ๋Œ์•„๊ฐ”๋‹ค! ๋ฆฌํŒฉํ† ๋ง ์• ์ดˆ์— API ์„ค๊ณ„ ์›์น™์—๋„ ์กฐ๊ธˆ ์–ด๊ธ‹๋‚œ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฒธ์‚ฌ๊ฒธ์‚ฌ ์ˆ˜์ •ํ–ˆ๋‹ค PUT์€ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ multipart๋กœ ๋ณด๋‚ด๋ฉด ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ด๋ฏธ์ง€ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ PUT์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ด๋ฏธ์ง€๋“ฑ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค URI์— ๋ณ„๋„์˜ PUT ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๊ฐฑ์‹ ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ํผ์€ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ๋ผ๊พธ๋ผ๊พธ profileUpdate์—์„œ ํ•œ URI๋กœ PUT์„ ๋ณด๋‚ด์„œ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค(ํšŒ์› ์ •๋ณด + ์ด๋ฏธ์ง€)๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ PUT์ด ์ ํ•ฉ์น˜ .. 2023. 8. 13.
[์ถ”์ธก] ๊ธฐ์กด Spring Security๋ฅผ ์ ์šฉํ•œ ์ƒํ™ฉ์—์„œ OAuth2 ์ ์šฉ์ด ์•ˆ ๋จนํ˜”๋˜ ์ด์œ  ์ถ”์ธก ๋ฌธ์ œ ์ƒํ™ฉ ์ž์ฒด ํšŒ์›๊ฐ€์ž…์—์„œ jwt refresh & access token์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์ ์šฉํ•œ ์ƒํ™ฉ ์ด ์ƒํ™ฉ์—์„œ oAuth2 ์ ์šฉ ์‹œ๋„ํ•˜์˜€์œผ๋‚˜ ์‹คํŒจ ์˜ˆ์ƒ ์†Œ๋งˆ ๋ฉ˜ํ† ๋‹˜๊ป˜์„œ ์•Œ๋ ค์ฃผ์‹  ๊ฑด๋ฐ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋ž‘ ๋น„์Šทํ•œ ์ƒํ™ฉ์ธ ๊ฒƒ ๊ฐ™์•„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค ์ •์„์ ์ธ ๋ฐฉ๋ฒ•) jwk/jws๋Š” jwt์™€ ํ•จ๊ป˜ ์”€ ํ† ํฐ ํƒˆ์ทจํ•˜๋ฉด ๋งˆ์Œ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— signature ๋„ฃ์–ด์„œ ์•”ํ˜ธํ™” ํ›„ ๋น„๋Œ€์นญ์œผ๋กœ ๊ฒ€์ฆํ•จ (์ง„์งœ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ๊ฒƒ์ธ์ง€ ํ™•์ธ) ์†Œ์…œ๋กœ๊ทธ์ธ์ด๋ž‘ ๊ฐ™์ด ์“ธ ๋•Œ์˜ ๋ฌธ์ œ์  ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ ์‹œ spring์—์„œ ์“ฐ๋Š” token์ด๋ž‘ ์†Œ์…œ ๋กœ๊ทธ์ธ ์‹œ ๋‚˜์˜ค๋Š” token์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ ๊ทธ๋Ÿฌ๋‚˜ spring ์ž์ฒด์—์„œ ์ด 2๊ฐœ๋ฅผ ํ•˜๋‚˜์˜ token์œผ๋กœ ํ•ฉ์ณ์„œ clientํ•œํ…Œ ๋ณด๋‚ด์คŒ(๋‘˜์ด ์„œ๋กœ ๋‹ค๋ฅธ ์œ ์ €๋กœ ์žกํžˆ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•จ) ⇒ โœจ๊ทผ๋ฐ ๋‚ด.. 2023. 8. 13.
[์˜ค๋ฅ˜] WebMvcTest์—์„œ body๊ฐ’์ด empty์ธ ๊ฒฝ์šฐ ๋ฌธ์ œ ์ƒํ™ฉ ProfileUpdateController์—์„œ status๋Š” ํ™•์ธ๋˜๋Š”๋ฐ body์—์„œ ์ž๊พธ null๊ฐ’์ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ String์„ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ํ•˜๋ฉด ์ž˜ ๋˜๋Š”๋ฐ dto์˜ body์—์„œ๋งŒ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ๊ฐ™์ด ์—ฌ๋Ÿฌ๋ชจ๋กœ ๊ณ ๋ฏผํ–ˆ๋‹ค. Multipart๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด๋ผ multipart์˜ ๋ฌธ์ œ์ธ ์ค„ ์•Œ์•˜์œผ๋‚˜.... ๋ฐœ์ƒ ์›์ธ ProfileUpdateController๋กœ ์ „๋‹ฌ๋œ JSON์ด ๋งŒ๋“ค์–ด๋‚ธ Response ๊ฐ์ฒด๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค (Multipart๋ž‘ 1๋„ ์ƒ๊ด€์—†์—ˆ๋‹ค^^) https://velog.io/@devmizz/Spring-WebMvcTest%EC%97%90%EC%84%9C-Response-Body%EA%B0%80-Empty%EC%9D%BC-%EB%95%8C 2023. 8. 13.
[์„ค๊ณ„] File ํ…Œ์ด๋ธ” ๋‚ด์˜ item_id ์นผ๋Ÿผ ๋ฆฌํŒฉํ† ๋ง ํ˜„์žฌ ์ƒํ™ฉ ํ˜„์žฌ File ํ…Œ์ด๋ธ”์„ User, Portfolio, Item 3๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. User์™€ Portfolio๋Š” File๊ณผ 1๋Œ€1 ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— fk๋ฅผ ๊ฐ์ž์˜ ํ…Œ์ด๋ธ”์— ๋‘์ง€๋งŒ, Item์˜ ๊ฒฝ์šฐ 1๋Œ€๋‹ค ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— fk๋ฅผ File ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ์ ์€ ํ…Œ์ด๋ธ”์˜ ์ •ํ•ฉ์„ฑ์„ ํ•ด์น˜๊ณ , item_id๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” User ์™€ Portfolio ํ…Œ์ด๋ธ”์—์„œ๋„ item_id ์นผ๋Ÿผ ๊ฐ’์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐ€์ ธ null ๊ฐ’์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋ฐฉ์•ˆ ์ด์˜ ๊ฒฝ์šฐ 2๊ฐ€์ง€์˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์ž‡์Šต๋‹ˆ๋‹ค. ItemFile ํ…Œ์ด๋ธ”์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ธฐ์กด ํŒŒ์ผ๊ณผ ์ด๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. File ํ…Œ์ด๋ธ”์—์„œ Item_Id๊ฐ€ ์•„๋‹Œ OwnerId ๊ฐ’์„ ๋‘์–ด ์ด ๊ณณ์— item_id, .. 2023. 8. 13.
[์ง€์‹] yml ํ™˜๊ฒฝ๋ณ€์ˆ˜ env์— ๋“ฑ๋กํ•˜๊ธฐ ์ง€๊ธˆ๊นŒ์ง€ ๋งจ๋‚  commitํ•  ๋•Œ๋งˆ๋‹ค ๋กœ์ปฌ์—์„œ yml ๋ณต์‚ฌํ•˜๊ณ  ์ง€์šฐ๊ณ  commit ํ›„ ๋‹ค์‹œ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ํŒ€์›์ด ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค˜์„œ ์‹คํ–‰ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค! ๋ฐ”๋กœ env ํŒŒ์ผ์— yml์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์„ ๋“ฑ๋กํ•ด๋†“๋Š” ๋ฒ•์ด๋‹ค. ๋กœ์ปฌ resource/properties/env.properties ์ƒ์„ฑ ํ›„ ์•„๋ž˜ ๊ตฌ์กฐ๋กœ ์„ค์ •ํŒŒ์ผ ์ˆ˜์ • propertyConfig ํŒŒ์ผ ์ƒ์„ฑ package swmaestro.spaceodyssey.weddingmate.global.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.spr.. 2023. 8. 13.