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

SpringBoot43

[Spring][JPA] ์ตœ๋Œ€ํ•œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ณด๋Š” @EntityGraph์˜ ๊ฐœ๋… ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” DB๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐํ•œ์ชฝ์— @EntityGraph๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.@EntityGraph์˜ ์—ญํ• ์ด ๋ญ๊ธธ๋ž˜ ์—ฐ๊ด€๊ด€๊ณ„ ํ…Œ์ด๋ธ”์— ํ•„์š”ํ• ๊นŒ? ๋ฏธ๋ฆฌ ์•Œ์•„์•ผํ•  ๊ฐœ๋… ์„ค๋ช…@EntityGraph๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ, ํ”„๋ก์‹œ(Proxy)์™€ Lazy(์ง€์—ฐ๋กœ๋”ฉ), Eager(์ฆ‰์‹œ๋กœ๋”ฉ)์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผํ•œ๋‹ค.์•„๋งˆ @EntityGraph์˜ ๊ฐœ๋…์ด ๊ถ๊ธˆํ•œ ์ด์œ ๋Š”, ์ฝ”๋“œ์— @ManyToOne๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.์ด๋•Œ @ManyToOne์— fetch = FetchType.Lazy๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ @EntityGraph๊ฐ€ ํ•„์š”ํ•˜๋‹ค. → ์ด ์กฐํ•ฉ์„ ๋งŽ์ด ์“ด๋‹ค๋Š” ๊ฑธ ์•Œ๊ณ  ์ผ๋‹จ์€ ๋„˜์–ด๊ฐ€์ž. ์™œ ์ด ์กฐํ•ฉ์„ ๋งŽ์ด ์“ฐ๋Š”์ง€ ๋’ค์— ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.JPA๊ฐ€ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‹น์žฅ ํ•„์š” ์—†๋Š” ์—ฐ๊ด€ ๋ฐ์ดํ„ฐ๋Š” ์ง„์งœ ๊ฐ์ฒด ๋Œ€์‹  ๊ฐ€์งœ .. 2026. 4. 3.
[Spring][JPA] ์ž๋ฐ”์˜ ๊ฐ์ฒด ์ง€ํ–ฅ์„ ๋” ์ž˜ ์‚ด๋ฆฌ๋Š” @ManyToOne๊ณผ @OneToMany ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž๊ฐ€์—ฌ๋Ÿฌ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๋•Œ@ManyToOne์„ ๋ถ™์˜€๋‹ค.๊ทธ๋ ‡๋‹ค๋ฉด @ManyToOne์ด ๋ญ˜๊นŒ?? @ManyToOne๋‹ค๋Œ€์ผ ๊ด€๊ณ„ ๋งคํ•‘์ผ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.์˜ˆ์‹œ) ์‚ฌ์›A, ์‚ฌ์›B, ์‚ฌ์›C๋Š” ๋ชจ๋‘ ๊ฐœ๋ฐœํŒ€ ์†Œ์†์ด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ช…(Many)์˜ ์‚ฌ์›์ด ํ•˜๋‚˜(One)์˜ ๋ถ€์„œ์— ์†ํ•ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.์™ธ๋ž˜ํ‚ค๋Š” ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„์ƒ Many ์ชฝ์— ์†ํ•ด์žˆ๋‹ค.JPA์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. @OneToManyํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.์ผ๋Œ€๋‹ค ๋‹จ๋… ๋งคํ•‘๋ณด๋‹ค๋Š” ๋ณดํ†ต ManyToOne๊ณผ ํ•จ๊ป˜ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์„ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.์˜ˆ์‹œ) ๊ฐœ๋ฐœํŒ€์—๋Š” ์‚ฌ์›A, ์‚ฌ์›B, ์‚ฌ์›C๊ฐ€ ์†ํ•ด์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ํ•˜๋‚˜(One)์˜ ๋ถ€์„œ์— .. 2026. 4. 2.
[Spring][JPA] @Column์€ ์ •์˜, ์†์„ฑ, ์˜ˆ์‹œ ์ฝ”๋“œ + int์™€ Integer๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด,ํ•„๋“œ์— @Column์„ ๋ถ™์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒŒ ๋œ๋‹ค.๋ˆˆ์น˜๋กœ ๋Œ€์ถฉ ์–ด๋–ค ๋А๋‚Œ์ธ์ง€ ์•Œ์ง€๋งŒ๊ทธ๋ž˜๋„ ์ •ํ™•ํžˆ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€๋ณด์ž. @Column๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘ํ• ์ง€ ์ •์˜ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.์ž๋ฐ” ๋ณ€์ˆ˜๋ช…๊ณผ DB ์ปฌ๋Ÿผ๋ช…์ด ๋‹ค๋ฅผ ๋•Œ, ์ปฌ๋Ÿผ์— ์ œ์•ฝ์กฐ๊ฑด(๊ธธ์ด, NULL ์—ฌ๋ถ€ ๋“ฑ)์„ ๊ฑธ๊ณ  ์‹ถ์„ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. @Column์˜ ์†์„ฑname: ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.nullable: false๋กœ ์„ค์ •ํ•˜๋ฉด DDL ์ƒ์„ฑ ์‹œ NOT NULL ์ œ์•ฝ์กฐ๊ฑด์ด ๋ถ™๋Š”๋‹ค. unique: ํ•œ ์ปฌ๋Ÿผ์— ๊ฐ„๋‹จํžˆ ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฑธ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.length: ๋ฌธ์ž์—ด(String) ํƒ€์ž…์˜ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•œ๋‹ค. (Varchar์˜ ๊ธธ์ด)insertable: false๋กœ ์„ค์ •ํ•˜๋ฉด ์—”.. 2026. 3. 28.
[Spring][JAP] ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์— ์“ฐ์ด๋Š” @Table๋ž€ ๋ฌด์—‡์ผ๊นŒ? Entity๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œDB์˜ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด@Table์„ ์‚ฌ์šฉํ–ˆ๋‹ค.@Table์ด ์ •ํ™•ํžˆ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”๊ฑธ๊นŒ? @Table์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์–ด๋–ค ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜๋Š”์ง€๋ฅผ ๋ช…์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.→ ์˜ˆ์‹œ) @Table์ด ์ฝ”๋“œ์— ์—†๊ณ  @Entity(name = "abc")๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, @Entity์˜ name ์†์„ฑ์— ์˜ํ•ด Entity์™€ Table ์ด๋ฆ„์ด ๋ชจ๋‘ ๊ฒฐ์ •๋œ๋‹ค. @Table์˜ ์†์„ฑname : ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.uniqueConstraints: ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ์œ ๋‹ˆํฌ(Unique) ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•œ๋‹ค.indexes: ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.ca.. 2026. 3. 27.
[Spring, React] Keycloak์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ ์ „ ์•Œ์•„์•ผํ•  ๊ฐœ๋… ์ •๋ฆฌ ๊ตฌ์ธ๊ตฌ์ง์„ ์‚ดํŽด๋ณด๋ฉด,๋ณดํŽธ์ ์œผ๋กœ ๊ฒฝ๋ ฅ์ง ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘ ๊ณตํ†ต์ ์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š”๊ฒŒ Keycloak์ด์—ˆ๋‹ค.๋„๋Œ€์ฒด Keycloak์ด ๋ญ๊ธธ๋ž˜ ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•˜๋Š”๊ฑธ๊นŒ?Keycloak์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. 1. Keycloak์˜ ๊ธฐ๋Šฅ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ์ธ ์–‘์‹์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†์ด Keycloak์„ ํ†ตํ•ด ์ธ์ฆํ•œ๋‹ค.Single Sign-On : Keycloak์— ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธํ•˜๋ฉด ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘์†ํ•  ๋•Œ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์— ๊ฐ๊ฐ ๋กœ๊ทธ์ธ ํ•  ํ•„์š”๊ฐ€ ์—†์ด ํ•œ ๋ฒˆ์˜ ์ธ์ฆ์ด๋ฉด ๋ชจ๋“  ์—ฐ๊ฒฐ๋œ ์•ฑ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ธฐ๋Šฅ์€ ๋กœ๊ทธ์•„์›ƒ๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค.Identity Brokering and Social L.. 2026. 3. 19.
[Spring, React] jsx์™€ css ํŒŒ์ผ ์—ฐ๊ฒฐ, ์—ฐ๊ฒฐ๋œ css๊ฐ€ ์•„๋‹ˆ์–ด๋„ jsx ํŽ˜์ด์ง€์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ ๊ณ ๊ฐ ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ๊ด€๋ฆฌ์ž ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค.๋ถ„๋ช… ๊ฐ ํŽ˜์ด์ง€์— css ํŒŒ์ผ์„ ๋‹ค๋ฅด๊ฒŒ ์—ฐ๊ฒฐ์‹œ์ผฐ๋Š”๋ฐ,์™œ ์ˆ˜์ •์ด ๋™์‹œ์— ๋˜๋Š”๊ฑธ๊นŒ? 1. ํ™”๋ฉด์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์•„๋ž˜ ํŽ˜์ด์ง€๋Š” ๊ด€๋ฆฌ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŽ˜์ด์ง€ ์ค‘ ๊ฒ€์ƒ‰์ฐฝ ํ™”๋ฉด์ด๋‹ค. ์ด ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ์ „์— ๋ฏธ๋ฆฌ ๋งŒ๋“ค์—ˆ๋˜ ๊ณ ๊ฐ ๊ด€๋ฆฌ ํŽ˜์ด์ง€์˜ ๊ฒ€์ƒ‰์ฐฝ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™”๋‹ค. 2. ๋ฌธ์ œ์™€ ์›์ธ๋ฌธ์ œ๊ณ ๊ฐ ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ์ค‘ ๊ฒ€์ƒ‰์„ ๋‹ด๋‹นํ•˜๋Š” jsx๋Š” CustomerAdd.jsx์ด๋‹ค. ์ด jsx๋Š” CustomerTable.css์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ด€๋ฆฌ์ž ๊ด€๋ฆฌ ํŽ˜์ด์ง€ ์ค‘ ๊ฒ€์ƒ‰์„ ๋‹ด๋‹นํ•˜๋Š” jsx๋Š” AdminAdd.jsx์ด๋‹ค. ์ด jsx๋Š” PermissionSetting.css์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค.๊ทธ๋Ÿฐ๋ฐ PermissionSetting.css๋ฅผ.. 2026. 3. 17.