๐Ÿ›๏ธ์•Œ๋ ‰์‚ฐ๋“œ๋ฆฌ์•„ ๋„์„œ๊ด€_dev๐Ÿ›๏ธ

Hello! 🖐

✏ Web Backend Developer happyhsryu


๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

๋‚ด์šฉ์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋„ˆ๋ฅธ ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Contact

✉ email : happyhsryu@gmail.com

LATEST
Spring

[Spring] @RequestBody JSON ๋ฐ”์ธ๋”ฉ ์›๋ฆฌ์™€ Jackson ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๊ณผ์ • (MappingJackson2HttpMessageConverter)

@RequestBody Json ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉFrontend์—์„œ Http Body์— Json ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ด๋ฉด, Spring Boot Controller์˜ @RequestBody๋กœ ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์•„๋ž˜์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐ”์ธ๋”ฉ ํ•œ๋‹ค.๊ธฐ๋ณธ ์ƒ์„ฑ์ž + Setter์ „์ฒด ํ•„๋“œ ์ƒ์„ฑ์ž + @JsonCreatorํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผHttpMessageConverterSpring์€ @RequestBody๊ฐ€ ๋ถ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ HttpMessageConverter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.HandlerMethodArgumentResolver โ†’ RequestResponseBodyMethodProcessor โ†’ HttpMessageConverter ์ˆœ์œผ๋กœ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.JSON String์€ ..

Java

[Java] Stream API์˜ ๋™์ž‘ ์ˆœ์„œ์™€ Lazy Evaluation

Java Stream APIJava์˜ Stream API๋Š” ์„ ์–ธ์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ํ•˜์ง€๋งŒ Stream์€ ๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—” ๋‹จ์ˆœํ•ด ๋ณด์—ฌ๋„, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” lazy evaluation(์ง€์—ฐ ํ‰๊ฐ€) ๊ธฐ๋ฐ˜์˜ ํ‰๊ฐ€ ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด, ์˜ˆ์ƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  lazy evaluation์„ ์•Œ์•„๋ณด๊ธฐ ์ „์—, Stream ๋™์ž‘ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•ด ๋ณด์ž. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝItem์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ, sout์„ ์ฐ์–ด์ฃผ๋Š” log(Item item) ๋ฉ”์„œ๋“œ๋กœ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณผ ๊ฒƒ์ด๋‹ค.@AllArgsConstructor@Getterstatic class Item{ private in..

JPA & QueryDSL

[JPA] fetchJoin์‹œ MultipleBagFetchException ๋ฐœ์ƒ(์นด๋ฅดํ…Œ์‹œ์•ˆ ๊ณฑ)

์นด๋ฅด์ผ€์‹œ์•ˆ ๊ณฑ(Cartesian Product) ๋ž€?Cartesian ๊ณฑ์€ 2๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ Join ํ•  ๋•Œ ๋ชจ๋“  ์กฐํ•ฉ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณฑ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค๋ฉด User๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” Order 3๊ฐœ, Payment 5๊ฐœ๊ฐ€ ์žˆ์„ ๋•Œ, ์ด 15๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.์•„๋ž˜(๋” ๋ณด๊ธฐ)๋Š” ์นด๋ฅดํ…Œ์‹œ์•ˆ ๊ณฑ์„ ์ฒ˜์Œ ๋ณด๋Š” ๋ถ„๋“ค์„ ์œ„ํ•œ ์ฟผ๋ฆฌ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.๋”๋ณด๊ธฐapp_userSELECT * FROM app_user uwhere id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';ordersSELECT * FROM orderswhere user_id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';paymentSELECT * FROM paymentwhere user_id ..

Spring

[Spring/Redis] Spring @Cacheable๊ณผ Redis๋ฅผ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ ์บ์‹ฑ

Spring์˜ Cache ์ถ”์ƒํ™”๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด, ๋™์ ์œผ๋กœ ๋ณ€ํ•˜์ง„ ์•Š๋Š”๋ฐ, ์ž์ฃผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์กฐํšŒํ•˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•  ์ผ์ด ์ข…์ข… ์žˆ๋‹ค.ย ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.Frontend์—์„œ select-box์˜ ๊ฐ’์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ data List ์กฐํšŒ์™ธ๋ถ€ API์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ, ์™ธ๋ถ€ API์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐฑ์‹  ์ฃผ๊ธฐ๊ฐ€ ๊ธธ ๋•Œ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ๋ฐ์ดํ„ฐ์ด์ง€๋งŒ, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฐ’์ด ์•„๋‹ ๋•ŒSpring์€ ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ , ์ดํ›„ ๋™์ผํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์บ์‹œ ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‘๋‹ต ์†๋„๋ฅผ ๋†’์ด๊ณ  ์‹œ์Šคํ…œ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ œ๊ณตํ•œ๋‹ค.์บ์‹œ ๊ตฌํ˜„์ฒด์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก @Cacheable, @CacheEvict, ..

JPA & QueryDSL

[JPA] JPA ๋ณตํ•ฉํ‚ค Entity Mapping @IdClass / @EmbeddedId

๋ณตํ•ฉํ‚ค(Composite key)๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ณตํ•ฉํ‚ค(Composite Key)๋ž€, ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ์กฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‹จ์ผ ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์„ ๋•Œ, ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.ย ์•„๋ž˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ, ์ฃผ๋ฌธ๋ฒˆํ˜ธ์™€ ์ƒํ’ˆ๋ฒˆํ˜ธ ๋‘๊ฐœ๋ฅผ ๋ฌถ์–ด์•ผ ํ•˜๋‚˜์˜ ๊ณ ์œ ํ•œ key๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.์ด๋Ÿฐ ๊ฒฝ์šฐ์— JPA์—์„œ ๋‹จ์ผํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ๋ณต์žกํ•˜๊ณ , ๊ท€์ฐฎ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.ย ๋ณตํ•ฉํ‚ค๊ฐ€ ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด, ๋‹จ์ผํ‚ค ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ,์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ์„๊ฒƒ์ด๋‹ค.๋ณตํ•ฉํ‚ค ๋งคํ•‘ ์‹œ ํŠน์ง•key class์— Serializable์„ ๊ตฌํ˜„ํ•ด์•ผ๋œ๋‹ค.key class์— equ..

Vue.js & Nuxt.js

[Nuxt3] Nuxt๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง€ ์ด๋™ ์ปดํฌ๋„ŒํŠธ

NuxtLink ๊ฐœ์š”๋Š” Vue Router์˜ ์™€ html์˜ ํƒœ๊ทธ๋ฅผ ๋ชจ๋‘ ๋Œ€์ฒดํ•˜๋Š” Nuxt3์˜ ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.๋‚ด๋ถ€ ๋งํฌ์™€ ์™ธ๋ถ€ ๋งํฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ , ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งํฌ๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.NuxtLink๋Š” ๋‚ด๋ถ€ ๋งํฌ์ธ์ง€ ์™ธ๋ถ€ ๋งํฌ์ธ์ง€ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.๋‚ด๋ถ€ ๋งํฌ (/mainย ๊ฐ™์€ ๊ฒฝ๋กœ)๋Š” Vue Router๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.์™ธ๋ถ€ ๋งํฌ (https://example.com)๋Š” ์ผ๋ฐ˜์ ์ธ ํƒœ๊ทธ๋กœ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.๋‚ด๋ถ€ ๋ผ์šฐํŒ…์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€ ๊ฒฝ๋กœ์˜ /main์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์—ฐ๊ฒฐํ•œ๋‹ค. Main Page ์™ธ๋ถ€ ๋ผ์šฐํŒ…์ด๋ ‡๊ฒŒ ์™ธ๋ถ€ ๊ฒฝ๋กœ url์ด ์„ค์ •๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ, ์™ธ๋ถ€ ์›น์‚ฌ์ดํŠธ์— ์—ฐ๊ฒฐํ•œ๋‹ค. Nuxt Doc..

Vue.js & Nuxt.js

[Nuxt3] ์‚ฌ์šฉ์ž ์ •์˜ ํŽ˜์ด์ง€ ๋ฉ”ํƒ€ ํ•จ์ˆ˜ definePageMeta()

definePageMeta()pages/ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋งคํฌ๋กœ ํ•จ์ˆ˜์ด๋‹ค.ย ์ฃผ์š” ์š”์†Œ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.definePageMeta๋กœ ์ •์˜ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ์ฃผ์š” ์š”์†Œ โ€ข alias์—ฌ๋Ÿฌ URL์„ ๋™์ผํ•œ ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ„์นญ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. โ€ข keepaliveํŽ˜์ด์ง€๋ฅผ ๋กœ ๊ฐ์‹ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. โ€ข key์˜ ๋ Œ๋”๋ง์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. โ€ข layoutํŽ˜์ด์ง€์— ์‚ฌ์šฉํ•  ๋ ˆ์ด์•„์›ƒ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. false๋กœ ์„ค์ •ํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€ข layoutTransition / pageTransitionํŽ˜์ด์ง€ ๋ฐ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ ์‹œ ์‚ฌ์šฉํ•  ์ „ํ™˜ ํšจ๊ณผ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. โ€ข middlewareํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ธฐ..

Vue.js & Nuxt.js

[Nuxt3] Props ์„ ์–ธ ๋ฐ ์‚ฌ์šฉ

1.ย  (๊ตฌ)Nuxt 2 Props ์„ ์–ธ props: { title: { type: String, default: '', }, seq: { type: Number, default: 1, }, },2. Nuxt3 Props ์„ ์–ธtitle ๋’ค์— ? ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.?๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ undefined๋„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ ,ย ?๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์˜ค์ง string๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.interface Props { title?: string; seq?: number;}defineProps();ย 3. default๊ฐ’ ์„ค์ •interface Props { title: string; seq: number;}withDefaults(defineProps(), ..

Vue.js & Nuxt.js

[Nuxt3] ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ Get started

Nuxt 3 ๊ณต์‹ ๋ฌธ์„œhttps://nuxt.com/docs/getting-started/installationย Installation ยท Get Started with NuxtGet started with Nuxt quickly with our online starters or start locally with your terminal.nuxt.com0. node version# node versionnvm install 20nvm use 20npm -v1. create nuxt๋นˆ ํด๋” ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ณ , ํ„ฐ๋ฏธ๋„์—์„œ pnpm์œผ๋กœ ์„ค์น˜ํ–ˆ๋‹ค.npx nuxi@latest init nuxt3_lectureย 2. package manager ์„ ํƒnpm ์„ ํƒย 3. package.json ์ˆ˜์ • (nuxi)nuxt3๋ถ€ํ„ฐ..

JPA & QueryDSL

[QueryDSL] BooleanExpression์„ ์ด์šฉํ•œ WHERE ์กฐ๊ฑด ํ‘œํ˜„์‹

QueryDSL์€ JPA์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ, ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ, Join ์ฟผ๋ฆฌ ๋“ฑ์„ ์ตœ์ ํ™”ํ•ด ์ค€๋‹ค.์ด์ค‘ BooleanExpression์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ where ์กฐ๊ฑด์ ˆ์„ ์„ธํŒ…ํ•œ๋‹ค.์ด ๊ธ€์€ Boolean expression์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ์ •๋ฆฌํ•˜๊ณ , BooleanExpression์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.Version# versionspring-boot: 3.4.3JPA: 3.1.0querydsl: 5.0.0# build.gradledependencies { implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta" annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annot..

HOT
Web & Network

[Network] ๋ฐฉํ™”๋ฒฝ - ์ธ๋ฐ”์šด๋“œ & ์•„์›ƒ๋ฐ”์šด๋“œ ๊ทœ์น™์ด๋ž€?

๋ฐฉํ™”๋ฒฝ์ด๋ž€?๋ฐฉํ™”๋ฒฝ(Firewall)์€ ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ์‹œ์Šคํ…œ์ด๋‹ค. ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ณด์•ˆ ๊ทœ์น™์— ๋”ฐ๋ผ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ์žฅ์น˜ ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๋‹ค. ๋ถˆ๋ฒ• ์ ‘๊ทผ, ์•…์˜์  ์ ‘๊ทผ, ํŠธ๋ž˜ํ”ฝ ๋‚ญ๋น„ ๋“ฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.ย ๋ฐฉํ™”๋ฒฝ์€ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง, ๋„คํŠธ์›Œํฌ ์„ธ๋ถ„ํ™”, ๊ฐ์‹œ ๋ฐ ๋กœ๊น…, ์ธ์ฆ, ํ”„๋ผ์ด๋ฒ„์‹œ ๋ณดํ˜ธ ๋“ฑ์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.์ด์ค‘ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™, ์•„์›ƒ๋ฐ”์šด๋“œ ๊ทœ์น™์€ ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์— ํฌํ•จ๋œ๋‹ค.ย ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง(์ ‘๊ทผ ์ œ์–ด)ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง์ด๋ž€ ๋ฐฉํ™”๋ฒฝ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.๋ฐฉํ™”๋ฒฝ์ด ํ—ˆ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ๋งŒ ๋„คํŠธ์›Œํฌ๋กœ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.ํŠธ๋ž˜ํ”ฝ ํ•„ํ„ฐ๋ง ๋ฐฉ์‹ ์ค‘ ํŒจํ‚ท ํ•„ํ„ฐ๋ง ๋ฐฉ์‹์€ย ๋ฐ์ดํ„ฐ ํŒจํ‚ท์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ํ—ˆ์šฉ/..

์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

[SonarQube] ์˜คํ”ˆ์†Œ์Šค ์ •์ ๋ถ„์„ Tool ์†Œ๋‚˜ํ๋ธŒ ์‚ฌ์šฉ๋ฒ•

์†Œ๋‚˜ํ๋ธŒ๋ž€?์†Œ๋‚˜ํ๋ธŒ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ฒ„๊ทธ, ์ฝ”๋“œ ์Šค๋ฉœ, ๋ณด์•ˆ ์ทจ์•ฝ์  ๋“ฑ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ํˆด์ด๋‹ค. ์„ค์น˜ / ์„ธํŒ…1. ์†Œ๋‚˜ํ๋ธŒ ์„ค์น˜https://www.sonarsource.com/products/sonarqube/downloads/ Download | SonarQubeGet the latest LTS and version of SonarQube the leading product for Code Quality and Security from the official download page.www.sonarsource.com 2. ์†Œ๋‚˜ํ๋ธŒ ์‹คํ–‰๋‹ค์šด๋กœ๋“œ ํŒŒ์ผ ์••์ถ• ํ’€๊ธฐ์†Œ๋‚˜ํ๋ธŒ ์‹คํ–‰Window: /bin/windows-x86-64/StartSonar.bat ์‹คํ–‰Linux: /bin/linu..

Spring

[Spring] ์นด์นด์˜ค ๋กœ๊ทธ์ธ API ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Kakao Developers์ด๋ฏธ์ง€ ์„ค๋ช…์— ๊ฐ ์ด๋ฏธ์ง€ ๋‚ด์šฉ์— ๋Œ€ํ•œ ์œ„์น˜(๊ฒฝ๋กœ) ์ ์–ด๋’€์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.ย 1. KakaoDevelopers ์ ‘์†https://developers.kakao.com/ย Kakao Developers์นด์นด์˜ค API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด์„ธ์š”. ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ, ์นœ๊ตฌ API, ์ธ๊ณต์ง€๋Šฅ API ๋“ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.developers.kakao.comย 2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐย 3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€ย 4.Rest API ํ‚ค ํ™•์ธย 5. Web ํ”Œ๋žซํผ ๋“ฑ๋กย 6. ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ ์„ค์ •ย 7. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ™œ์„ฑํ™”, Redirect URI ๋“ฑ๋กย 8. ๋™์˜ ํ•ญ๋ชฉ ์„ค์ •์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฐœ์ธ ์ •๋ณด ๋™์˜ ์„ค์ • ( email, nickname ์ •๋ณด )ย 9. (์ถ”๊ฐ€) ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„..

Database

[MyBatis] ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

MyBatis๋ž€?MyBatis๋Š” JdbcTemplate์ด ์ œ๊ณตํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ JdbcTemplate์˜ ๋ฌธ์ œ์  ์ค‘ ํ•˜๋‚˜์ธ ์—ฌ๋Ÿฌ ์ค„์˜ String ํ˜• sql์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ MyBatis๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.MyBatis๋Š” SQL์„ xml์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , xml ๋‚ด์—์„œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.ย JdbcTemplate์€ ์Šคํ”„๋ง์— ๋‚ด์žฅ๋œ ๊ธฐ๋Šฅ์ด๊ณ , ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, MyBatis๋Š” ์•ฝ๊ฐ„์˜ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ ์ฟผ๋ฆฌ์™€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” MyBatis๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋‹จ์ˆœํ•œ ์ฟผ๋ฆฌ๋“ค์ด ๋งŽ๋‹ค๋ฉด JdbcTemplate์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.ย ย 2024.07.31 ์ถ”๊ฐ€๋‹จ์ˆœํ•œ ๋„๋ฉ”์ธ ๊ด€๋ จ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”..

Web & Network

[Web] CSRF(ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ) ์•Œ์•„๋ณด๊ธฐ, Spring Security CSRF

CSRFCSRF(Cross Site Request Forgery, ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ)๋Š” ์›น ๋ณด์•ˆ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํŠน์ • ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ์œ ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.ย ์ œํ’ˆ ๊ตฌ์ž…, ์ž๊ธˆ ์ด์ฒด, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๊ธฐ๋ก ์‚ญ์ œ ๋“ฑ์˜ ์š”์ฒญ์„ ์•…์˜์ ์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.ย CSRF ๊ณต๊ฒฉ ์˜ˆ์ œCSRF ๊ณต๊ฒฉ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Spring Docs์— ์ข‹์€ ์˜ˆ์ œ๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€์ ธ์™”๋‹ค.https://docs.spring.io/spring-security/reference/features/exploits/csrf.html#csrf(์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ณด์•ˆ ์ œํ•œ์‚ฌํ•ญ์ด ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ๋Ÿฐ ๊ฒŒ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.)ย ์ •์ƒ์ ์ธ ์š”์ฒญ ์€ํ–‰ ์›น ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ณ„..

Trouble Shooting

[IntelliJ] ์ธ์ฝ”๋”ฉ(Encoding) ์„ค์ • / ํ•œ๊ธ€ ๊นจ์ง ๋ฌธ์ œ ํ•ด๊ฒฐ

IntelliJ๋กœ ์ž๋ฐ” ํ”„๋กœ์ ํŠธ ์ค‘, ํ•œ๊ธ€ ๊นจ์ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” VM, ์„œ๋ฒ„(Tomcat), ํŒŒ์ผ(JSP ๋“ฑ), DB ์—์„œ ๊ฐ๊ฐ ์‚ฌ์šฉํ•˜๋Š” ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์„œ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์˜ ์ธ์ฝ”๋”ฉ์„ ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์ธ UTF-8๋กœ ์ง์ ‘ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. IntelliJ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ VM, Tomcat, File์—์„œ UTF-8 ์ธ์ฝ”๋”ฉ ์„ค์ •์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. 1. IntelliJ VM Encoding ์„ค์ • 1) Help -> Edit Custom VM Options... 2) -Dfile.encoding=UTF-8 ์ถ”๊ฐ€ 2. Tomcat Encoding ์„ค์ • 1) Run -> Edit Configurations ... 2) VM options -> -Dfile.encoding=U..

์ž๋ฃŒ๊ตฌ์กฐ & ์•Œ๊ณ ๋ฆฌ์ฆ˜

[JAVA/์ž๋ฃŒ๊ตฌ์กฐ] ํž™(Heap), ์ตœ์†Œ ํž™(Min Heap), ์ตœ๋Œ€ ํž™(Max Heap)

ํž™(Heap) ํž™์€ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ์ตœ๋Œ€, ์ตœ์†Ÿ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๋Š”๋ฐ ์œ ์šฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํž™์€ ์ค‘๋ณต๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค. ๋ถ€๋ชจ-์ž์‹ ๊ฐ„ (๋ ˆ๋ฒจ ๋ณ„) ์ •๋ ฌ์€ ๋ณด์žฅํ•˜๊ณ , ํ˜•์ œ๊ฐ„์˜ ์ •๋ ฌ์€ ๋ณด์žฅํ•˜์ง€ ์•Š์•„์„œ ๋ฐ˜ ์ •๋ ฌ ์ƒํƒœ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํž™์€ ์ตœ์†Œ ํž™(Min Heap), ์ตœ๋Œ€ํž™(Max Heap) ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์ตœ์†Œ ํž™์€ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ์ตœ์†Ÿ๊ฐ’์ด ๋˜๊ณ , ๋ถ€๋ชจ๋…ธ๋“œ์˜ key๋Š” ์ž์‹๋…ธ๋“œ์˜ key๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค. ์ตœ๋Œ€ ํž™์€ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ์ตœ๋Œ“๊ฐ’์ด ๋˜๊ณ , ๋ถ€๋ชจ๋…ธ๋“œ์˜ key๊ฐ€ ์ž์‹ ๋…ธ๋“œ์˜ key๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค. ์™„์ „์ด์ง„ํŠธ๋ฆฌ๋Š” ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋“œ๋“ค์ด ๊ฐ€๋“ ์ฐจ ์žˆ๋Š” ํŠธ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. https://innovation123.tistory.com/107 [JAVA/์ž๋ฃŒ๊ตฌ์กฐ] ํŠธ๋ฆฌ(Tree), ์ด์ง„ํŠธ๋ฆฌ..

DevOps

[Spring / S3] SpringBoot ํ”„๋กœ์ ํŠธ - S3 ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

์ด์ „ ๊ธ€์—์„œ S3 bucket๊ณผ IAM์„ ์ƒ์„ฑํ•˜๊ณ  SpringBoot project์—์„œ S3 ์ ‘๊ทผ์— ์‚ฌ์šฉํ•  accessKey์™€ secretKey๋ฅผ ์–ป๋Š” ๊ฒƒ๊นŒ์ง€ ๋‹ค๋ค˜๋‹ค. 2024.01.21 - [DevOps] - [AWS/S3] Spring boot project ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด S3 ๋ฒ„์ผ“ ๋งŒ๋“ค๊ธฐ [AWS/S3] Spring boot project ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด S3 ๋ฒ„์ผ“ ๋งŒ๋“ค๊ธฐ Amazon S3 ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ IAM ๋งŒ๋“ค๊ธฐ ์ƒ์„ฑ ์™„๋ฃŒ IAM accessKey, secretKey ์–ป๊ธฐ IAM - ์‚ฌ์šฉ์ž - ๋ณด์•ˆ ์ž๊ฒฉ ์ฆ๋ช… ์•ก์„ธ์Šค ํ‚ค ๋งŒ๋“ค๊ธฐ CLI ์„ ํƒ accessKey, secretKey ์ €์žฅ ์ € ๋‘ ๊ฐ€์ง€ Key๋ฅผ ์ €์žฅํ•ด ๋’€๋‹ค๊ฐ€ spring properties์— ๋“ฑ innovation123.ti..

์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

[Apache POI] Java ์ฝ”๋“œ๋กœ ์—‘์…€(.xlsx) ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ - Java๋กœ Excel ๋‹ค๋ฃจ๊ธฐ

Apache POIApache POI๋Š” ์•„ํŒŒ์น˜ ์†Œํ”„ํŠธ์›จ์–ด ์žฌ๋‹จ์—์„œ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.MS Office ํŒŒ์ผ ํฌ๋งท์„ ์ˆœ์ˆ˜ Java ์–ธ์–ด๋กœ ์ฝ๊ณ  ์“ฐ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.https://poi.apache.org/ Apache POIโ„ข - the Java API for Microsoft Documents Project News 2 July 2024 - POI 5.3.0 available The Apache POI team is pleased" data-og-host="poi.apache.org" data-og-source-url="https://poi.apache.org/" data-og-url="https://poi.apache.org/" data-og-image="">ย Apache POIโ„ข - the..

Database

[SQL/MariaDB] ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ (INSERT, UPDATE, DELETE)

INSERT INTO : ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ id, name, loginId, password์˜ attribute๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” MEMBER table์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค. TABLE์— ์กด์žฌํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ constraints๋“ค์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผํ•œ๋‹ค. ๋ฐฉ๋ฒ• 1 : ๋ชจ๋“  ์†์„ฑ ์„ ํƒ table์— ์กด์žฌํ•˜๋Š” attribute์˜ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. table์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  attribute์— ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. (null์ด๋ผ๋„ ๋„ฃ์–ด์•ผํ•จ) insert into member values(3, 'Lee', 'Lee1', 'pwLee'); ๋ฐฉ๋ฒ• 2 : column ์ง€์ • ์•„๋ž˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, attribute ์ˆœ์„œ๋ฅผ ๋งž์ถ”์ง€ ์•Š์•„๋„ ๋œ๋‹ค. (์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.) ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  attribut..

HSRyuuu
HS_dev_log