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

๐Ÿ’ป ํ”„๋กœ์ ํŠธ15

[ ํŒ€ KPT ํšŒ๊ณ  ] ํ”Œ๋Ÿฌ์Šค ํ”„๋กœ์ ํŠธ ํ”Œ๋Ÿฌ์Šค ํ”„๋กœ์ ํŠธ Keep: ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์ง€ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ถ€๋ถ„๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๊ฐ์ž ๋งก์€ ์ผ์„ ๋๊นŒ์ง€ ์ฑ…์ž„๊ฐ ์žˆ๊ฒŒ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋˜์—ˆ๋‹ค.CI/CD ํ™œ์šฉ์ž๋™ํ™”๋œ ๋ฐฐํฌ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๋ฐฐํฌ ๊ณผ์ •์ด ์›ํ™œํ–ˆ๋‹ค.๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ง€์†์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.์—๋Ÿฌ ์ฒ˜๋ฆฌ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋•๋ถ„์— ์—๋Ÿฌ ํ™•์ธ์ด ์‰ฌ์› ๊ณ , ๋””๋ฒ„๊น… ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜์—ˆ๋‹ค.์ฒด๊ณ„์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ์•ˆ์ •์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.์›ํ™œํ•œ ์˜์‚ฌ์†Œํ†ตํŒ€์› ๊ฐ„ ์˜๊ฒฌ์„ ์ž˜ ๋“ฃ๊ณ  ์กด์ค‘ํ•˜๋Š” ๋ถ„์œ„๊ธฐ๊ฐ€ ํ˜•์„ฑ๋˜์–ด ํ˜‘์—…์ด ์ˆ˜์›”ํ–ˆ๋‹ค.๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ ๊ทน์ ์ธ ์˜๊ฒฌ ๊ตํ™˜์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค. Problem: ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ถ€์กฑ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜์ง€ ์•Š์•„ ๊ฐ ํŒ€์›์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ •๊ธฐ์ .. 2025. 2. 10.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] SQLSyntaxErrorException - @SQLDelete ์‚ฌ์šฉ ์‹œ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ๋ช… ๋ถˆ์ผ์น˜ ๋ฌธ์ œ Soft Delete๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Hibernate์˜ @Where ๋ฐ @SQLDelete ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ–ˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ SQLSyntaxErrorException์ด ๋ฐœ์ƒํ–ˆ๋‹ค.๋ฌธ์ œ ์ƒํ™ฉSQLSyntaxErrorException: Unknown column 'member_id' in 'where clause'์ฝ”๋“œ ์ž‘์„ฑ ๊ณผ์ •@Where(clause = "is_deleted = false")@SQLDelete(sql = "UPDATE member SET is_deleted = true WHERE member_id = ?")@Where๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ is_deleted๊ฐ€ false์ธ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.@SQLDelete๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ญ์ œ ์š”์ฒญ ์‹œ Soft Delete๋˜๋„๋ก SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.. 2025. 2. 4.
[ KPT ํšŒ๊ณ  ] ํ”Œ๋Ÿฌ์Šค ์ฃผ์ฐจ ๊ฐœ์ธ ๊ณผ์ œ ํ”Œ๋Ÿฌ์Šค ์ฃผ์ฐจ ๊ฐœ์ธ ๊ณผ์ œ Keep : ์ด๋ฒˆ ๊ณผ์ œ์—์„œ ์œ ์ง€ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ถ€๋ถ„๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •์—์„œ์˜ ์‚ฌ๊ณ ๋ ฅ ๊ฐ•ํ™”๊ฐ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค '์™œ ์ด๊ฑธ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?'๋ฅผ ๊ณ ๋ฏผํ•˜๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.๊ฐœ๋… ์ดํ•ด์™€ ํ™œ์šฉ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋‹จ์ˆœํžˆ ์ ์šฉํ•˜๋Š”๋ฐ ๊ทธ์น˜์ง€ ์•Š๊ณ , ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค.๋ณต์Šต์„ ํ†ตํ•œ ๊ฐœ๋… ์ •๋ฆฌ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์ด๋ผ๊ณ  ํ•ด๋„ ํ•œ๋ฒˆ ๋” ๋ณต์Šตํ•˜๋ฉด์„œ ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋‹ค. Problem : ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์‹œ๊ฐ„ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ์•ˆ์— ๊ณ„ํšํ–ˆ๋˜ ์ž‘์—…์„ ๋ชจ๋‘ ๋๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค.๋ถˆ์™„์ „ํ•œ ์ง€์‹ ํ™•์ธ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๋‚ด์šฉ๋“ค์ด ์กด์žฌํ–ˆ๋‹ค.์ƒˆ๋กœ์šด ๊ฐœ๋… ์ ์šฉ์˜ ์–ด๋ ค์›€์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ์ตํžˆ๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์ง€๋งŒ, ์ ์šฉ์—์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์†Œ์š”๋˜์—ˆ.. 2025. 1. 27.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] 403 Forbidden ์—๋Ÿฌ์™€ SecurityContextHolder ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ Spring Security๋ฅผ ์ด์šฉํ•ด์„œ ๊ถŒํ•œ๋ณ„ URL ์ ‘๊ทผ์„ ์„ค์ •ํ•˜๋˜ ์ค‘, 403 Forbidden ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ–ˆ๋‹ค.๋ฌธ์ œ ์ƒํ™ฉ๋‹ค์Œ๊ณผ ๊ฐ™์ด /admin/** ์™€ /users/** ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•œ ์ƒํƒœ์—์„œ ADMIN ๊ณ„์ •์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ 403 Forbidden ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค..requestMatchers("/admin/**").hasRole("ADMIN").requestMatchers("/users/**").hasRole("USER")๋ฌธ์ œ ์›์ธ ๋ถ„์„JwtFilter์—์„œ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.Spring Security๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ SecurityContextHolder๋ฅผ ์ด์šฉํ•ด ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, JwtFilter์—์„œ Secu.. 2025. 1. 27.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] The bean 'jwtFilter' could not be registered ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ Spring ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋งˆ์ฃผํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.The bean 'jwtFilter', defined in class path resource [org/example/expert/config/FilterConfig.class], could not be registered. A bean with that name has already been defined in file [/Users/t2023-m0071/IdeaProjects/spring-plus/build/classes/java/main/org/example/expert/config/JwtFilter.class] and overriding is disabled.๋ฌธ์ œ ์ƒํ™ฉ์œ„ ์—๋Ÿฌ๋Š” JwtFilter.class์—์„œ ์ด๋ฏธ Bean์œผ.. 2025. 1. 27.
[ ํŒ€ KPT ํšŒ๊ณ  ] ์•„์›ƒ์†Œ์‹ฑ ํ”„๋กœ์ ํŠธ ์•„์›ƒ์†Œ์‹ฑ ํ”„๋กœ์ ํŠธ Keep: ์ด๋ฒˆ ๊ณผ์ œ์—์„œ ์œ ์ง€ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ถ€๋ถ„์†Œํ†ต ๊ด€๋ จํŒ€์› ๊ฐ„์˜ ์›ํ™œํ•œ ์†Œํ†ต ๋•๋ถ„์— ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆœ์กฐ๋กญ๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ํŽธ์•ˆํ•ด์„œ ์˜๊ฒฌ์„ ์ œ์•ˆํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์˜๊ฒฌ์„ ์ˆ˜์šฉํ•˜๋Š” ๊ณผ์ •์ด ๋งค์šฐ ๊ธ์ •์ ์ด์—ˆ๋‹ค.ํ”„๋กœ์ ํŠธ ์ ๊ทน์„ฑ๋ชจ๋‘๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•˜๋ฉฐ ์ฑ…์ž„๊ฐ์„ ๋ณด์—ฌ์ฃผ์—ˆ๋‹ค.GitHubFork๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ž Repository์—์„œ ์ž‘์—…ํ•œ ๋’ค Pull Request๋กœ ํ•ฉ์น˜๋Š” ์ „๋žต์ด ํ˜‘์—…์— ํšจ๊ณผ์ ์ด์—ˆ๋‹ค.์ฝ”๋“œ ์ปจ๋ฒค์…˜์ •ํ•ด์ง„ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ์ดํ•ด๊ฐ€ ์ˆ˜์›”ํ–ˆ๋‹ค. Problem: ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋ฌธ์ œ์ : API ์ˆ˜์ •์ฒ˜์Œ ์„ค๊ณ„ํ–ˆ๋˜ API๋ฅผ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๊ณ , ์ด๋กœ ์ธํ•ด ๊ฐœ๋ฐœ ์ผ์ •์— ์˜ํ–ฅ์„ ๋ฐ›์•˜๋‹ค.๋ฌธ์ œ์ : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ…Œ.. 2025. 1. 13.