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

Spring46

[Spring][JPA] @Entity๋ž€ ๋ฌด์—‡์ผ๊นŒ? ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ €์žฅ/์กฐํšŒํ•˜๋Š” ํด๋ž˜์Šค์—@Entity๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์คฌ๋‹ค.์™œ @Entity๋ฅผ ๋ถ™์—ฌ์•ผํ• ๊นŒ? @Entity@Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” JPA๊ฐ€ ๊ด€๋ฆฌํ•œ๋‹ค.๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ 1:1๋กœ ๋งคํ•‘๋˜๋Š” ์˜์† ํด๋ž˜์Šค์ž„์„ ์„ ์–ธํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค.์ด ํด๋ž˜์Šค๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋ฉฐ, Spring Data JPA๊ฐ€ ์กฐํšŒ/์ €์žฅ/์ˆ˜์ •/์‚ญ์ œ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜์ด๋‹ค. (JPA๊ฐ€ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉ) final ํด๋ž˜์Šค, enum, interface, inner class ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.์ €์žฅํ•  ํ•„๋“œ์— final ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๋‹ค. @Entity ์˜ˆ์‹œ ์ฝ”๋“œ@Entity@Getter@Setterpublic class Member { @I.. 2025. 9. 9.
[Spring] @Id์™€ @GeneratedValue์ด๋ž€? ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ/์กฐํšŒ ํด๋ž˜์Šค์—์„œ@Id์™€ @GeneratedValue๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.๊ณผ์—ฐ @Id์™€ @GeneratedValue๊ฐ€ ๋ญ˜๊นŒ? @Id@Id๋ฅผ ๋ถ™์—ฌ, JPA์—๊ฒŒ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์ด ํ…Œ์ด๋ธ”์—์„œ ๊ธฐ๋ณธ ํ‚ค(Primary Key)๋ฅผ ์•Œ๋ฆฐ๋‹ค.ํ•ด๋‹น ํ•„๋“œ๋Š” ๊ฐ์ฒด์˜ ๊ณ ์œ ๋ฒˆํ˜ธ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.JPA๋Š” ๊ธฐ๋ณธ ํ‚ค๋ฅผ ํ†ตํ•ด ์ €์žฅ/์กฐํšŒ/์ˆ˜์ •/์‚ญ์ œํ•  ๋•Œ ์ •ํ™•ํžˆ ์–ด๋–ค ํ–‰(row)์ธ์ง€ ๊ตฌ๋ณ„ํ•œ๋‹ค. @GeneratedValue@Id ํ•„๋“œ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์ง€ JPA์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.๊ธฐ๋ณธํ‚ค(PK)๋ฅผ ์ง์ ‘ ์„ธํŒ…ํ•˜์ง€ ์•Š๊ณ , ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ๋งŒ๋“ค๋„๋ก ํ•œ๋‹ค.@GeneratedValue๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  @Id ์–ดํ† ๋„ค์ด์…˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ง์ ‘ ํ• ๋‹นํ•ด์•ผํ•œ๋‹ค.๊ธฐ๋ณธํ‚ค(PK) ๊ฐ’์— ๋Œ€ํ•œ ์ƒ์„ฑ ์ „๋žต์„ ์ œ๊ณตํ•œ๋‹ค. Q. ํ”„๋กœ๋ฐ”์ด๋”๋ž€.. 2025. 9. 8.
[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.