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

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…7

[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] Elasticsearch ์ธ๋ฑ์Šค ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ์‹คํŒจ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ธฐ (์ธ๋ฑ์Šค, ๋งคํ•‘, ID ์ค‘๋ณต) Elasticsearch ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ • Elasticsearch์— CSV ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋˜์ง€ ์•Š์•„ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ํ•ด๊ฒฐํ–ˆ๋˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ดค๋‹ค.๋ฐœ์ƒํ•œ ๋ฌธ์ œ์™€ ์›์ธ ๋ถ„์„1.  ์ธ๋ฑ์Šค ๋„ค์ด๋ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฌธ์ œ ์ƒํ™ฉElasticsearch์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” "job-opening"์œผ๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” "job_opening"์œผ๋กœ ์กฐํšŒํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ–ˆ๋‹ค.Kibana์—์„œ ์กฐํšŒ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๋‹ค.ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ธ๋ฑ์Šค๋ช…์„ ์ƒ์ˆ˜(static final)๋กœ ์ •์˜ํ•˜์—ฌ, ์ƒ์„ฑ๊ณผ ์กฐํšŒ ์‹œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ๋‹ค.public static final String INDEX_NAME = "job-opening"; 2. ๋™์  ๋งคํ•‘(@Postconstr.. 2025. 2. 25.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] Elasticsearch keyword ํ•„๋“œ์˜ ์ค‘์š”์„ฑ (term ์ฟผ๋ฆฌ๊ฐ€ ์•ˆ๋  ๋•Œ) Elasticsearch์—์„œ term ์ฟผ๋ฆฌ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฌธ์ œ ์ƒํ™ฉ์ฑ„์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ Spring API์™€ Elasticsearch๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ์ž๊ฒฉ ์š”๊ฑด(requiredSkills)์„ term ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ๋งํ–ˆ๋”๋‹ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „ํ˜€ ์กฐํšŒ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.๊ธฐ์กด ์ฟผ๋ฆฌ// ์ž๊ฒฉ ์š”๊ฑด ํ•„ํ„ฐ๋งif (requestDto.getRequiredSkill() != null) { boolQueryBuilder.filter(f -> f .term(t -> t .field("requiredSkills") .value(requestDto.getRequiredSkill()) ) );}์›์ธ ๋ถ„์„๋จผ์ € Ela.. 2025. 2. 25.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] 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.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] 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.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…] ์ˆ™๋ จ CRUD ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ, ๊ฐœ์„  ๊ณผ์ œ ๊ณผ์ œ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ฌธ์ œ ์ƒํ™ฉFilter์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ GlobalExceptionHandler๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, Postman์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ 500 Internal Error๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.๋ฌธ์ œ ์›์ธ@RestControllerAdvice๋Š” Filter์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.Filter๋Š” Controller๋กœ ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, @RestController๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์˜์—ญ์ด๋‹ค.์ด๋กœ ์ธํ•ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ณ  500 Internal Error๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๋‹ค.ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•Filter ๋‚ด์—์„œ ์ง์ ‘ HTTP ์ƒํƒœ ์ฝ”๋“œ์™€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•ด์„œ ์‘๋‹ตํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.์ˆ˜์ •๋œ ์ฝ”๋“œif (session == null || session.getAttribute("loginM.. 2025. 1. 6.