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

์ „์ฒด ๊ธ€101

[Python] F-string F-string์ด๋ญ˜๊นŒ?♣ F-string์ค‘๊ด„ํ˜ธ ์•ˆ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋‚˜ ํ‘œํ˜„์‹์„ ๋„ฃ์–ด ํ•ด๋‹น ๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.๋ฌธ์ž์—ด ๋งจ ์•ž์— f๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ , ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ง์ ‘ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด๋‚˜ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์„ ๋„ฃ๋Š”๋‹ค.๊ธฐ์กด์˜ ํฌ๋งทํŒ… ๋ฐฉ์‹๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ํ‘œํ˜„์‹๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ♣ F-string์„ ์–ด๋–ป๊ฒŒ ์“ธ๊นŒ?print(f"์ด๋ฆ„: ํ™๊ธธ๋™, ๋‚˜์ด: 28")Name = "ํ™๊ธธ๋™"Age = 28print(f"์ด๋ฆ„: {name}, ๋‚˜์ด: {age}")f๋ฅผ ๋ถ™์ด๊ณ  " " ์•ˆ์— ์ถœ๋ ฅํ•  ๋ณ€์ˆ˜์˜ ๊ฐ’์„ { } ๋„ฃ์–ด์ค€๋‹ค. ♣ F-string์˜ ๊ฐ„๋‹จํ•œ ํ‘œํ˜„์‹print(f”1 + 1 = {1 + 1}”) ♣ F-string์˜ ์†Œ์ˆ˜์  ์ง€์ •pi = 3.1415926535…print(f”ํŒŒ์ด.. 2025. 9. 5.
[Vue.js] props์™€ emit๋ฅผ ์ด์šฉํ•ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ. ์ฐธ๊ณ ๋กœ Vue.js์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.์•„๋ฌด๊ฑฐ๋‚˜ ๋ง‰ ํ•ด๋ณด๋Š” ์ค‘์ด๊ณ  ์˜ณ์€ ์ •๋ณด์ธ์ง€ ์ €๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค! props์™€ emit๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด๋ณด์ž. props๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.๋ช…์‹œ์ ์ธ props ์„ ์–ธ์ด ํ•„์š”ํ•˜๋‹ค. defineProps์˜ ์ฝ”๋“œ ์˜ˆ์‹œ _ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ์„ ์–ธ props์˜ ์ฝ”๋“œ ์˜ˆ์‹œ _ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ์„ ์–ธ(๊ถŒ์žฅ) emit$emit()๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒํ‚ค์…” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ•  ๋ฉ”์„œ๋“œ์ด๋‹ค.์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ปค์Šคํ…€ ์ด๋ฒคํŠธ๋ฅผ ์„ ์–ธํ•œ๋‹ค.๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค.๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๊ฐ ์†์„ฑ ํ‚ค๊ฐ€ ์ด๋ฒคํŠธ ์ด๋ฆ„์ด๊ณ  ๊ฐ’.. 2025. 9. 5.
[Vue.js] ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ, localStorage๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์•„์ด๋””๊ฐ€ ๋ฉ”์ธํ™”๋ฉด์— ๋ณด์ด๋„๋ก ์„ค์ •ํ•˜๊ธฐ! ๋กœ๊ทธ์ธ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋‹ค.์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๊ฒŒ๋˜๋ฉด๋ฉ”์ธํ™”๋ฉด์— ์‚ฌ์šฉ์ž ์•„์ด๋””๊ฐ€ ๋ณด์ด๋„๋ก์„ค์ •ํ•ด๋ณด์ž! [ ๋กœ๊ทธ์ธ ๋งŒ๋“ค๊ธฐ ]๋ธ”๋กœ๊ทธ์— ์ ์—ˆ๋˜ vue์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค [SpringBoot, Vue.js] ๋กœ๊ทธ์ธ ํ™”๋ฉด ๋งŒ๋“ค๊ธฐ, passwordEncoder.matches๋ฅผ ํ†ตํ•ด ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋น„๊ตํ•˜๊ธฐ.ํšŒ์›๊ฐ€์ž…๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋‹ค.์ด์ œ ํšŒ์›๊ฐ€์ž…ํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ๋กœ๊ทธ์ธ์„ ํ•ด๋ณด์ž! [ ํšŒ์›๊ฐ€์ž… 1ํŽธ + 2ํŽธ ] [SpringBoot] (IntelliJ, vue.js, H2) ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 1ํŽธ : dto ๋งŒ๋“ค๊ณ  ์ด๋ฆ„, ํŒจ์Šค์›Œ๋“œ, ์ „ํ™”post-this.tistory.com โ€ป์ด ์ฝ”๋“œ๋Š” ๊ทธ๋ƒฅ ์—ฐ์Šต์šฉ์œผ๋กœ ๊ฒ‰๋ชจ์Šต๋งŒ ๋กœ๊ทธ์ธ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค.๊ทธ๋ ‡๊ธฐ์— ์‹ค์ œ๋กœ ๋กœ๊ทธ์ธ๋œ ํ™”๋ฉด์ด๋ผ๊ณ  ๋ณด๊ธด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.๋งŒ์•ฝ ์ œ๋Œ€๋กœ.. 2025. 9. 2.
[SpringBoot, Vue.js] ๋กœ๊ทธ์ธ ํ™”๋ฉด ๋งŒ๋“ค๊ธฐ, passwordEncoder.matches๋ฅผ ํ†ตํ•ด ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋น„๊ตํ•˜๊ธฐ. ํšŒ์›๊ฐ€์ž…๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋‹ค.์ด์ œ ํšŒ์›๊ฐ€์ž…ํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ๋กœ๊ทธ์ธ์„ ํ•ด๋ณด์ž! [ ํšŒ์›๊ฐ€์ž… 1ํŽธ + 2ํŽธ ] [SpringBoot] (IntelliJ, vue.js, H2) ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 1ํŽธ : dto ๋งŒ๋“ค๊ณ  ์ด๋ฆ„, ํŒจ์Šค์›Œ๋“œ, ์ „ํ™”๋ฒˆํ˜ธ ํŒจ๋Œ€๋ถ€๋ถ„์˜ ์›น์‚ฌ์ดํŠธ๋Š”ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค.๊ทธ ์ค‘ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด์ž! 1. ํ™”๋ฉด ๋™์ž‘๊ณผ ์ „์ฒด์ฝ”๋“œํšŒ์›๊ฐ€์ž… ์˜์ƒ ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต ๋””๋ ‰ํ† ๋ฆฌ์™€ ํด๋ž˜์Šค Vue์™€ Spring์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” dtopost-this.tistory.com [SpringBoot] (IntelliJ, vue.js, H2) ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 2ํŽธ : ์•„์ด๋””, ์ด๋ฉ”์ผ ์ค‘๋ณต์ฒดํฌ ๋งŒ๋“ค๊ธฐ.์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ „ํ™”๋ฒˆํ˜ธ๋ฅผํŒจํ„ด ์ฒดํฌ๋ฅผ ํ–ˆ์—ˆ๋‹ค.์ด๋ฒˆ์—๋Š” ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์„์ค‘๋ณต ์ฒดํฌ ํ•ด๋ณด์ž! [ ํšŒ์›.. 2025. 8. 31.
[SpringSecurity] Vue์™€ Spring์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ.(CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ) vue์™€ spring์€์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์„ ๊ฐ€์ ธ ์ƒ๊ธฐ๋Š”CORS ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž. 1. ๋ฌธ์ œ ์‚ดํ”ผ๊ธฐ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” Vue๋กœ ํ”„๋ก ํŠธ๋ฅผ ๋งก๊ณ  ์žˆ๊ณ , Spring์œผ๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ๋งก๊ณ  ์žˆ๋‹ค. Vue์—์„œ ํšŒ์›๊ฐ€์ž…์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ Spring์—” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ๋„์ฐฉํ•˜์ง€ ์•Š์•˜๋‹ค. ์™œ ๊ทธ๋Ÿฐ๊ฑธ๊นŒ? Vue๋Š” http://localhost:5173/๋ฅผ ๊ธฐ๋ณธ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  Spring์€ http://localhost:8080/์„ ๊ธฐ๋ณธ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. Spring์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์˜จ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Vue์—์„œ ์˜จ ์š”์ฒญ์ด ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Spring ๋‚ด๋ถ€์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค. 2. ์ฝ”๋“œ ์‚ดํ”ผ๊ธฐ@CrossOrigin + http.c.. 2025. 8. 30.
[SpringSecurity] @EnableWebSecurity, SecurityFilterChain ๊ฐœ๋…๊ณผ ์˜ˆ์‹œ @EnableWebSecurity๋Š”์–ธ์ œ ์“ฐ๋Š”๊ฑธ๊นŒ? @EnableWebSecurity์–ด๋…ธํ…Œ์ด์…˜์„ ๋“ฑ๋กํ•˜์—ฌ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์›น ๋ณด์•ˆ ์„ค์ •์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.์ฆ‰, ๋“ฑ๋กํ•˜๋ฉด ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ๋นˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.@EnableWebSercurity๋Š” ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ์ฒด์ธ์„ ์ƒ์„ฑํ•˜๊ณ  ์›น ๋ณด์•ˆ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.๋ณดํ†ต @Configuration๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.์˜ˆ์ „์—๋Š” WebSecurityConfigurerAdapter์™€ @EnableWebSecurity ์กฐํ•ฉ์ด ๊ธฐ๋ณธ์ด์—ˆ๋‹ค.์ง€๊ธˆ์€ WebSecurityconfigurerAdapter๋ฅผ ์“ฐ์ง€ ์•Š๊ฒŒ๋˜๋ฉด์„œ SecurityFilterChain ๋นˆ์„ ์ง์ ‘ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ์‹์ด ํ‘œ์ค€์ด ๋˜์—ˆ๋‹ค. SecurityFilterChain์‹ค์ œ ๋ณด์•ˆ ๊ทœ์น™(์ธ๊ฐ€/.. 2025. 8. 28.