‡๐Ÿ‘ฉ‍๐Ÿ’ป ‡ 65

[Database] ํŠธ๋ฆฌ๊ฑฐ(Trigger)

ํŠธ๋ฆฌ๊ฑฐ(Trigger)ํŠธ๋ฆฌ๊ฑฐ(Trigger)๋Š” ์ด์˜ ๋ฐฉ์•„์‡ ๋ฅผ ๋œปํ•œ๋‹ค. ์ด์˜ ๋ฐฉ์•„์‡ ๋ฅผ ๋‹น๊ธฐ๋ฉด ์ด์•Œ์ด ๋ฐœ์‚ฌ๋˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Database์—์„œ์˜ ํŠธ๋ฆฌ๊ฑฐ๋„ ์–ด๋А ํŠน์ • ๋™์ž‘์— ๋ฐ˜์‘ํ•ด์„œ ์ž๋™์ ์œผ๋กœ ํ•„์š”ํ•œ ๋™์ž‘์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.  ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์˜ ํŠธ๋ฆฌ๊ฑฐ์˜ ์˜๋ฏธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.  ํŠธ๋ฆฌ๊ฑฐ(Trigger): ์–ด๋–ค ํŠธ๋žœ์žญ์…˜์ด ์ผ์–ด๋‚˜๋ฉด ๊ฑฐ๊ธฐ์— ๋ฐ˜์‘ํ•ด์„œ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ   ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋” ์ž์„ธํžˆ ์–˜๊ธฐํ•˜์ž๋ฉด, ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ(INSERT, DELETE, UPDATE) ๋ฌธ์ด ์‹คํ–‰ ๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ๋งํ•œ๋‹ค.  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋ฌธINSERTDELETEUPDATE ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ๋ณดํ†ต ํŠธ๋ฆฌ๊ฑฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ๋ฌธ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ์„ธ ๊ฐ€์ง€ ์‹œ์ (์‹คํ–‰ ์ „, ๋Œ€์‹ ํ•˜์—ฌ..

[Database] ์Šคํ‚ค๋งˆ(Schema)

์Šคํ‚ค๋งˆ๋ž€?๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ(database schema)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database) ์ „์ฒด ๋˜๋Š” ์ผ๋ถ€์˜ ๋…ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๊ตฌ์กฐ๋กœ ์ €์žฅ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.   ๐Ÿ’ก์Šคํ‚ค๋งˆ vs ERD๊ฐ„๋žตํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ERD๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋„์ด๊ณ , ์Šคํ‚ค๋งˆ๋Š” ๊ตฌํ˜„์ฒด์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์—๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ERD๋ผ๋Š” ์„ค๊ณ„๋„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ค๊ณ„๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ERD๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด DBMS์—์„œ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์Šคํ‚ค๋งˆ์ด๋‹ค.   ์Šคํ‚ค๋งˆ 3๊ณ„์ธต์Šคํ‚ค๋งˆ๋Š” ์‚ฌ์šฉ์ž์˜ ๊ด€์ ์— ๋”ฐ๋ผ ์™ธ๋ถ€ ์Šคํ‚ค๋งˆ, ๊ฐœ๋…์Šคํ‚ค๋งˆ, ๋‚ด๋ถ€ ์Šคํ‚ค๋งˆ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.  ์™ธ๋ถ€ ์Šคํ‚ค๋งˆ (External Schema) = ์‚ฌ์šฉ์ž ๋ทฐ = ์„œ๋ธŒ ์Šคํ‚ค๋งˆ์‚ฌ์šฉ์ž๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ฐœ์ธ์˜ ์ž…์žฅ์—์„œ ํ•„์š”ํ•œ ๋ฐ..

[Database] ์กฐ์ธ(Join)์ด๋ž€?

์กฐ์ธ(Join)์ด๋ž€?๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ ํŠน์ • ํ‚ค๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์กฐ์ธ(Join)์ด๋ผ๊ณ  ํ•œ๋‹ค.  ์กฐ์ธ ์ˆ˜ํ–‰์‹œ ์–‘์ชฝ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์—ฐ๊ฒฐ ์กฐ๊ฑด์„ ์ •ํ™•ํžˆ ํ•˜์ง€ ์•Š์œผ๋ฉด M*N ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋งค์šฐ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.  ์กฐ์ธ์˜ ์ข…๋ฅ˜  ๋™๋“ฑ ์กฐ์ธ (๋‚ด๋ถ€ ์กฐ์ธ)์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ๊ณต๋™ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ™์€ ํ–‰๋“ค์„ ์—ฐ๊ฒฐ ์ž์—ฐ์กฐ์ธ (๋‚ด๋ถ€ ์กฐ์ธ)์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ฐ ์ปฌ๋Ÿผ๋ช…์— ๊ฐ™์€ ๊ฐ’์ด ์กด์žฌํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋™๋“ฑ ์กฐ์ธ์„ ์ˆ˜ํ–‰ ๋น„๋™๋“ฑ ์กฐ์ธ์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ๊ณตํ†ต ์นผ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ๋™๋“ฑ์ด ์•„๋‹Œ ์กฐ๊ฑด์œผ๋กœ ์—ฐ๊ฒฐ ์…€ํ”„ ์กฐ์ธ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ๊ณตํ†ต๋œ ์นผ๋Ÿผ์ด ๋‘ ๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ๋™๋“ฑ ์กฐ์ธ ์™ธ๋ถ€ ์กฐ..

[Database] ์ธ๋ฑ์Šค(Index)๋ž€?

DBMS๋Š” Database์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Database์—๋Š” ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๋Š” ๊ฑธ๊นŒ? Database์˜ ๋ฌผ๋ฆฌ์  ์ €์žฅ์›Œ๋“œ์—์„œ ์ž‘์„ฑํ•œ ๋ฌธ์„œ๋Š” ํŒŒ์ผ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋“ฏ์ด, DBMS๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ DBMS๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.  MySQL์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ MySQL Workbench์™€ ๊ฐ™์€ SQL ์ž‘์—… ๋„๊ตฌ Tool์„ ํ†ตํ•ด SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด, DBMS๋กœ ์š”์ฒญ์ด ๊ฐ„๋‹ค. DBMS๋„ ์šด์˜์ฒด์ œ์—์„œ ์‹คํ–‰๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ €์žฅ ์ž‘์—…๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์šด์˜์ฒด์ œ๋ฅผ ํ†ตํ•ด ๊ฐ ์žฅ์น˜์— ๋ช…๋ น์ด ๋‚ด๋ ค์ ธ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์šด์˜์ฒด์ œ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ข…์†์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ๋กœ ์ €์žฅ์ด ๋œ๋‹ค.  ์ด๋•Œ, ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์€ ..

[Database] ํŠธ๋žœ์žญ์…˜๊ณผ ACID

ํŠธ๋žœ์žญ์…˜ํŠธ๋žœ์žญ์…˜์ด๋ž€ DBMS๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…(ํ”„๋กœ๊ทธ๋žจ)์˜ ๋‹จ์œ„์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์žฅ์• ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค. ๋˜, ์—ฌ๋Ÿฌ ์ž‘์—…์ด ํ•œ๋ฒˆ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ์ž‘์—…๋“ค์„ ์„œ๋กœ ๋ถ„๋ฆฌํ•ด์ฃผ๋Š” ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.  ํŠธ๋žœ์žญ์…˜์€ ์ „์ฒด๊ฐ€ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ๋˜๋Š” ์ „ํ˜€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A๊ฐ€ B์—๊ฒŒ 10000์›์„ ์ด์ฒดํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.START TRANSACTION 1. A์—์„œ 10000์›์„ ์ธ์ถœํ•˜๋Š” SQL UPDATE๋ฌธ 2. B์—์„œ 10000์›์„ ์ž…๊ธˆํ•˜๋Š” SQL UPDATE๋ฌธCOMMIT ์ด๋•Œ, COMMIT์€ ํŠธ๋žœ์žญ์…˜์˜ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š” SQL๋ฌธ์ด๋‹ค. ์œ„ ์ƒํ™ฉ์„ ๋” ์ž์„ธํžˆ ..

[๋„คํŠธ์›Œํฌ] Cookie & Session

๐Ÿ“ HTTP ํ”„๋กœํ† ์ฝœ์˜ ํŠน์ง•  Connectionless; ๋น„์—ฐ๊ฒฐ์„ฑ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ํ•œ ํ›„ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ๊ทธ ์—ฐ๊ฒฐ์„ ๋Š์–ด ๋ฒ„๋ฆฌ๋Š” ํŠน์ง•  ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์ง€ ์•Š์•„ ์„œ๋ฒ„์˜ ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP ํ”„๋กœํ† ์ฝœ์ด ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์ด๋ผ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.    Stateless; ๋ฌด์ƒํƒœ์„ฑ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹ ์„ ํ•  ๋•Œ, ์ด์ „ ํ†ต์‹ ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๋ฌด์ƒํƒœ์„ฑ์€ HTTP ํ”„๋กœํ† ์ฝœ์ด ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์—ฐํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์š”์ฒญ๋งˆ๋‹ค ๋‹ค์‹œ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ์„œ๋ฒ„๋Š” ๋ณ„๋„์˜ ๋ณ€๊ฒฝ ์—†์ด ์š”์ฒญ์„ ์ฒ˜..

[ํ•ด๊ฒฐ] ๋ฐฐํฌ ํ›„, ๋„๋ฉ”์ธ์„ url์— ์ง์ ‘ ์ž…๋ ฅํ•˜๋ฉด ๋ผ์šฐํŒ…์ด ์•ˆ๋๋˜ ๋ฌธ์ œ

๋ฌธ์ œ router.jsconst router = createRouter({ history: createWebHistory('/'), routes : [ { path: '/', component: MainPage }, { path: '/verify', component: VerifyPage }, { path: '/member/login', component: LoginPage }, { path: '/seller/login', component: SellerLoginPage }, { path: '/member/signup', component: SignUpPage }, { path: '/seller/signup', comp..

[Error] Docker Mysql ์ ‘์† ์—๋Ÿฌ - Access denied for user 'root'@'localhost' (using password: YES)

Docker๋กœ Mysql ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„์„œ ํ”„๋กœ์ ํŠธ DB๋กœ ์‚ฌ์šฉ ์ค‘์ด์—ˆ๋Š” ๋ฐ, docker hub๋ฅผ ๊ป๋‹ค๊ฐ€ ์žฌ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์•„๋ž˜์™€ ๊ฐ™์€ Workbench ์ ‘์† ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ์ •๋ฆฌํ•œ๋‹ค.    Docker Error   (HTTP code 500) server error - Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1. cmd๋ฅผ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰  taskkill์„ ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ์ž ..

[Postman] form-data๋กœ Multipart๋ž‘ JSON ๋™์‹œ์— ๋ณด๋‚ด๊ธฐ

์œ„์™€ ๊ฐ™์ด Postman์„ ์‚ฌ์šฉํ•ด์„œ  form-data๋กœ Multipart๋ž‘ JSON ๋™์‹œ์— ๋ณด๋‚ด์•ผํ•  ๋•Œ!  ๊ธฐ์กด์— json๋งŒ ๋ณด๋‚ด๋ฉด ๋ฐ‘์—์ฒ˜๋Ÿผ raw๋กœ ๋ณด๋‚ด๋ฉด ๋˜๋Š”๋ฐ file์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด form-data๋กœ ๋ณด๋‚ด์•ผํ•œ๋‹ค. form-data๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€์ˆ˜๋ช…, Value์— raw์— ๋„ฃ์„ json์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์ฃผ๊ณ ,Content-Type์„ ์ถ”๊ฐ€ํ•ด application/json์„ ๊ธฐ์ž…ํ•ด์ฃผ๋ฉด ๋!

[Error] Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]

[์—๋Ÿฌ][์›์ธ]์‘๋‹ต์„ ๋ณด๋‚ด์ฃผ๋Š” DTO์— Getter๊ฐ€ ์—†์–ด์„œ ๋ณด๋‚ด์ฃผ์ง€ ๋ชปํ•ด ์ƒ๊ธฐ๋Š” ์—๋Ÿฌ์˜€๋‹ค. [ํ•ด๊ฒฐ] @Getter ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.[์ฐธ๊ณ ]https://chea-young.tistory.com/41