Loading...
2022. 5. 14. 20:21

[Spring] AOP (Aspect-Oriented Programming) ๊ธฐ๋ณธ๊ณผ ๊ฐœ๋…

Spring์—๋Š” AOP(Aspect-Oriented Programming, ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์ด๋ผ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Œ? OOP(๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ผ๋Š” ๊ฒƒ์€ ๋“ค์–ด๋ดค๋Š”๋ฐ, AOP๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? AOP vs OOP ? ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(AOP)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ๋‹ค๋ฅธ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง๋“ค์„ ๋ณ„๋„์˜ ๊ด€์‹ฌ์‚ฌ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํšŒ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ์ด๋Ÿฌํ•œ ๋กœ์ง์„ ๋งŒ๋‚ฌ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ์˜์กด์„ฑ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๋ฐ, AOP๋Š” ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ์—†์ด๋„ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ logging ์ฝ”๋“œ๋“ค์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด AOP์™€ OOP๋Š” ์„œ๋กœ ๊ฒฝ์Ÿํ•˜๋Š” ๊ด€๊ณ„์ธ๊ฐ€์š”? ๊ทธ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” OOP๋งŒ์„ ๊ฐ€์ง€๊ณ  ..

2022. 5. 5. 20:30

[Spring Data] @Transactional ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ณด๋Š” Spring์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ

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

2022. 4. 24. 17:49

[FastAPI] 14. SQLAlchemy์˜ One-to-Many, Many-to-Many, Self referential relationship

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋‹จ์ˆœ Column ๋ฐ์ดํ„ฐ์™€ ๊ทธ๋ฆฌ๊ณ , ๋‹จ์ผ ์™ธ๋ž˜ํ‚ค ํ•˜๋‚˜์˜ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ Pydantic์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ Serialize/Deserialize ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Many-to-Many, One-to-Many ํ˜•ํƒœ์˜ Foreign Key๊ฐ€ ๊ฑธ๋ ค ์žˆ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ Joinํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ๋–„ ์–ด๋–ป๊ฒŒ Pydantic ๋ชจ๋ธ๊ณผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. DB์—์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ์ ‘๊ทผ ์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•œ ERD๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Category์™€ Post๊ฐ€ ์žˆ๊ณ , Post๋Š” category_id๋ฅผ ์™ธ๋ž˜ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ category ํ…Œ์ด๋ธ”์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฑด๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์ด ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ..

2022. 4. 16. 18:06

[Algorithm] 1์ผ 1์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ 1์ผ 1์ปค๋ฐ‹์— ๋„์ „ํ•˜๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๊ณ„์‹œ๊ฑฐ๋‚˜, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€ํšŒ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๊ณ„์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด 1์ผ 1์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์–ด์ƒ‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, 1์ผ 1์ปค๋ฐ‹์„ ๋„์ „ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด, ๋‚˜๋Š” ์˜ค๋Š˜ ๋ฌด์—‡์œผ๋กœ ์ปค๋ฐ‹์„ ํ•ด์•ผํ• ๊นŒ? ๋ผ๋Š” ๊ณ ๋ฏผ์„ ํ•˜์‹œ๊ฒŒ ๋ ํ…๋ฐ์š”. ๋งค์ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๋Š” ์–ด๋ ต๋”๋ผ๋„ ๊ฐ€๋” ์˜ค๋Š˜ ์ปค๋ฐ‹์€ ๋ญํ•˜์ง€? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค ๋•Œ๊ฐ€ ์žˆ๋‹ค๋ฉด 1์ผ 1์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๋ฅผ ํ•ด๋ณด์‹œ๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ํ’€ ๋•Œ๋งˆ๋‹ค ์ผ์ผ์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ Git์— ์˜ฌ๋ฆฌ๋Š”๊ฑด ๊ท€์ฐฎ์•„... ์˜ˆ์ „์— ์ €๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ(ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค, ๊ตฌ๋ฆ„, ๋ฐฑ์ค€ ๋“ฑ)์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณธ ํ›„, ๋งž์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ์ปค๋ฐ‹์„ ํ–ˆ๋˜์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ• ๋งŒํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋ฌธ์ œ๋ฅผ ์ ๊ณ , ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋Š”์ง€๋ฅผ ์ผ์ผ์ด ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ๋Š˜ ๊ท€์ฐฎ์€ ์ผ์ด์—ˆ๊ณ , ๊ฒฐ๊ตญ ์–ธ์ œ..

2022. 3. 8. 16:20

[Java] String, StringBuffer, StringBuilder ์ด์ •๋ฆฌ

์˜ค๋Š˜์€ Java์˜ String์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Java์—๋Š” ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. String StringBuffer StringBuilder 3๊ฐœ ๋ชจ๋‘ String์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ด์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์งš์–ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋Š”๋ฐ์š”. ์ด 3๊ฐ€์ง€๋Š” ๋ชจ๋‘ ๋ฌธ์ž์—ด์„ ํ‘œ๊ธฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ ๊ฐ์ž ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์ „ํ˜€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ž…๋‹ˆ๋‹ค. See Java Reference ์ž๋ฐ” ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ์— ๋‚˜์™€ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€์˜ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค String Strings are constant; their values cannot be changed after they are created. String์€ ์ƒ์ˆ˜์ด๋ฉฐ, ๊ฐ’์„ ๋งŒ๋“  ๋’ค์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค (Immutable..

2022. 2. 25. 15:43

[Python] Python Database API - Python์—์„œ๋Š” ์–ด๋–ป๊ฒŒ DB์™€ ์—ฐ๊ฒฐํ• ๊นŒ?

์˜ค๋Š˜์€ ๊ธฐ์ดˆ์ ์ธ ์ง€์‹์„ ๋Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.โ€‹ ์šฐ๋ฆฌ๊ฐ€ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์ž์—ฐ์Šค๋ ˆ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Database์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋„๋Œ€์ฒด ๋ฌด์—‡์ผ๊นŒ์š”? What is Database ? ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํ˜„๋Œ€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(?)์„ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋ฉด ์ž์—ฐ์Šค๋ ˆ ๋“ฑ์žฅํ•˜๋Š” ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€, ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ ์ „์ž์ ์œผ๋กœ ์ €์žฅ๋˜๊ณ  ์•ก์„ธ์Šค๋˜๋Š” ์กฐ์งํ™” ๋œ ๋ฐ์ดํ„ฐ ๋ชจ์Œ์„ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ํ˜„์‹ค ์„ธ๊ณ„์— ์กด์žฌํ•˜๋Š” ์ˆซ์ž, ๋ฌธ์ž ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ž์ ์œผ๋กœ(๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ) ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ์กฐ์งํ™”ํ•˜์—ฌ ์•ก์„ธ์Šค ํ•˜๋Š” ๊ฒƒ์ด์ฃ . ๊ทธ๋Ÿผ DBMS๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? DBMS๋Š” Database Management..

2022. 2. 21. 22:35

[Spring boot] Axon Framework๋กœ ์‹œ์ž‘ํ•˜๋Š” CQRS ๊ธฐ์ดˆ

๋งŽ์ด ๋ฏธ๋ฃจ์–ด์ง„ Axon Framework์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ „์— ์•„์ฃผ ์˜ค๋žœ ์‹œ๊ฐ„ ์ „, MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ ์ค‘ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์„ ๋จผ์ € ์ˆ™์ง€ํ•˜์‹  ๋‹ค์Œ ์ง„ํ–‰ํ•ด๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. 2021.03.21 - [Architecture/MSA] - [MSA] 7. MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 3 - ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS [MSA] 7. MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 3 - ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์ฒ˜์Œ ์ ‘ํ•˜๊ฒŒ ๋œ ๊ฒƒ์€ 2017 SpringCamp์—์„œ์˜€์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ์—๋Š” MSA๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€๋„ ๋ชปํ–ˆ๊ณ , MSA๋Š” ๋Œ€๊ธฐ์—…์—์„œ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๊ณ , ์ ์šฉ๊ฐ€๋Šฅํ•œ ์—„์ฒญ๋‚˜๊ฒŒ ํฐ ์•„ํ‚คํ…์ฒ˜์˜€๋‹ค. ๋ผ๊ณ ๋งŒ ์ธ blog.neonkid.xyz Ax..

2022. 1. 9. 14:18

[Python] anyio - ํ•œ ์ธต ๋” ๊ฐ•ํ™”๋œ ๋น„๋™๊ธฐ ํŒจ๋Ÿฌ๋‹ค์ž„

์–ด๋Š๋ง ์‹ค๋ฌด์—์„œ Python ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋กœ ๋ณด๋‚ธ์ง€ 1๋…„์ด ์กฐ๊ธˆ ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ณ ๋ฏผ๊ณผ ๊ณ ๋‚œ, ๊ทธ๋ฆฌ๊ณ  ์ด ์ž๋ฆฌ์— ์˜ค๊ธฐ๊นŒ์ง€ ์ˆ˜๋งŽ์€ ๋ฐ˜์„ฑ๊ณผ ๋…ธ๋ ฅ์œผ๋กœ ํŒŒ์ด์ฌ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋กœ์จ์˜ ์ž๋ฆฌ๋ฅผ ์žก์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ด์•ผ๊ธฐ๋ฅผ ์œ„ํ•ด ๋‹จ๋„์ง์ž…์ ์œผ๋กœ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด Python์€ Java์˜ Spring๊ณผ ๋‹ฌ๋ฆฌ ๋™๊ธฐ ์ฒ˜๋ฆฌ๋ณด๋‹ค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋‚˜์€ ๋น›์˜ ์„ฑ๋Šฅ์„ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒŒ์ด์ฌ์˜ ๋น„๋™๊ธฐ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ๊ทธ ์—ญ์‚ฌ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์ˆ˜๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ๊ทธ ๋งˆ์ €๋„ ์“ฐ๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์— ์†ํ•ฉ๋‹ˆ๋‹ค. Coroutine๊ณผ asyncio Python์˜ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋Š” Thread, Process์™€ ๊ฐ™์ด ๋™๊ธฐ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Process๋ฅผ ์ด์šฉํ•œ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋Š” Context swi..

2022. 1. 8. 22:55

[Spring Data] Spring Data JDBC๋ฅผ ์ด์šฉํ•œ ๋‹ค์–‘ํ•œ ID ์ „๋žต๊ณผ ์ˆ˜๋™ ID ์ „๋žต ๊ตฌํ˜„์‹œ ์ฃผ์˜์ 

์ตœ๊ทผ Kotlin + Spring Boot + Spring Data JDBC ์กฐํ•ฉ์œผ๋กœ ํ•ด๋‹น ๊ธฐ์ˆ  ์Šคํƒ์„ ์ด์šฉํ•ด DDD ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์— ๋Œ€ํ•ด ๋ณต์Šตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์—…์—์„œ Python์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ Spring์— ๋Œ€ํ•œ ์ง€์‹์ด ๋งŽ์ด ๋–จ์–ด์กŒ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋Š”๋ฐ์š”. ํ‰์†Œ Spring Data JPA๋ผ๋Š” ORM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์—ˆ์—ˆ๋Š”๋ฐ, DDD๋ฅผ ์ ‘ํ•˜๊ฒŒ ๋˜๋ฉด์„œ Command์™€ Query ๋ถ„๋ฆฌ์— ๋Œ€ํ•œ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ซ๊ณ  ORM์ด ์•„๋‹Œ ๊ฐ€๊ธ‰์  JDBC์™€ ๊ฐ™์€ DB API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žฆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ JPA๊ฐ€ ์•„๋‹Œ Spring Data JDBC๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™ ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ๊ฐ Row์— ํ•ด๋‹นํ•˜๋Š” ๊ณ ์œ ๊ฐ’์ธ ID๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ..

2021. 11. 9. 10:48

[FastAPI] 13. SQLAlchemy์™€ Pydantic์„ ์ด์šฉํ•œ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ ๋งคํ•‘

SQLAlchemy๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์›ํ•˜์ง€ ์•Š์„ ๋•Œ API์—์„œ ๋ชจ๋“  ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์ตœ์ ํ™” ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค API์—์„œ๋Š” ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํ˜น์€ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ชจ๋‘ ๋‚˜์˜ค๊ฒŒ ๋˜์–ด ์˜คํžˆ๋ ค API ๋กœ๋”ฉ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜์— ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. SQLAlchemy ORM์˜ relationship SQLAlchemy ORM์—์„œ๋Š” ๊ด€๊ณ„๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด relationship์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋กœ๊ทธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋ ค๋Š”๋ฐ, ์–ด๋–ค ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€์ธ์ง€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๊ณ„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ํ•˜์œ„ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ํ•˜๋‚˜์˜ ์ปจํ…์ธ ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ผ๊ณ  ํ–ˆ์„ ..

2021. 10. 30. 22:24

[FastAPI] 12. Pytest / UnitTest๋ฅผ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Pytest์™€ Unit Test๋ฅผ ์ด์šฉํ•˜์—ฌ FastAPI์—์„œ ์ž‘์„ฑํ•œ API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Pytest Python ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” Pytest๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Pytest๋Š” Python์—์„œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์‹ฌํ”Œํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋ฉฐ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ณ  ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ํŠน์ง•์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‹คํ–‰์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ž์„ธํ•œ ์ •๋ณด ํ‘œ์‹œ ์ง€์› ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ ๋ฐ ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ ์ง€์› Session๊ณผ ๊ฐ™์€ ์ˆ˜๋ช…์ด ๊ธด ๋ฆฌ์†Œ์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํ•ด์ฃผ๊ณ , ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜ ์ œ๊ณต unitte..

2021. 9. 26. 11:47

[FastAPI] 11. Dependency Injector๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฒŒ ๋˜์–ด ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€ํ‘œ์ ์ธ ์•„ํ‚คํ…์ฒ˜์ธ Layered Architecture๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Layered Architecture๋Š” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ˜„๋Œ€ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, Application, Domain, Infrastructure์˜ 3๊ฐœ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋“ค์„ ์ „๋ถ€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ๊ฐ์˜ ์˜์กด์„ฑ์ด ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ๊ทธ ๋กœ์ง์ด ์ปค์ง€๋ฉด ์ด ์—ญ์‹œ ๊ด€๋ฆฌ๊ฐ€ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค. Python์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ DI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘์—์„œ๋„ Dependency Injector๋ฅผ ์‚ฌ์šฉ ํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. Dependency I..

2021. 6. 19. 22:35

[Spring Data] Spring Data JDBC๋ฅผ ์ด์šฉํ•œ DB ์—ฐ๋™ (์‘์šฉํŽธ)

์ง€๋‚œ ๊ธ€์—์„œ ์šฐ๋ฆฌ๋Š” Spring Data JDBC๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ด๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๋งŒ๋“œ๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ดค์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ์„œ๋กœ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ์— ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Entity ์ด๋ฒˆ ๊ธ€์—์„œ ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํฌ์ŠคํŠธ์™€ ์ฝ”๋ฉ˜ํŠธ์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ์— ๋ธ”๋กœ๊ทธ์˜ ๊ฒŒ์‹œ๊ธ€์ด ๋‹ฌ๋ฆฌ๋ฉด ๊ทธ ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ํ•˜๋‚˜์˜ ๊ธ€์„ ์กฐํšŒํ–ˆ์„ ๋•Œ ๋Œ“๊ธ€์„ ๊ฐ™์ด ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ๋ฅผ ๋‹ด์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. SQL script flyway์— ์•„๋ž˜์˜ SQL script๋ฅผ ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค. ์ง€๋‚œ ๊ธ€์—์„œ์™€๋Š” ๋‹ฌ๋ฆฌ PRIMARY KEY์˜ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ์กฐ๊ธˆ ๋‹ค๋ฅธ๋ฐ, CONSTRAINT ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž์‹ ์ด ์ง์ ‘ ํ•ด๋‹น ํ‚ค..

2021. 6. 5. 22:36

[Spring Data] Spring Data JDBC๋ฅผ ์ด์šฉํ•œ DB ์—ฐ๋™ (๊ธฐ๋ณธํŽธ)

Spring Data JDBC๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” Spring JDBC์™€๋Š” ์กฐ๊ธˆ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JDBC ํ…œํ”Œ๋ฆฟ์€ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ด๋“ค์˜ ํ•จ์ˆ˜ ํ˜•ํƒœ๋ฅผ ์ง์ ‘ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์ด ๋งŽ์ด ๊ฐ‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค์„ Spring Data Commons๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Spring Data JDBC ์ž…๋‹ˆ๋‹ค. Background of Spring Data JDBC ์šฐ๋ฆฌ๋Š” ์ด์ „ ๊ธ€์—์„œ Spring Data Commons๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” CRUD์˜ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“  ๊ฒƒ์ด ๋ฐ”๋กœ Spring Data Commons ์ธ๋ฐ์š”. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ JPA๋ฅผ ๋„ฃ์€ ๊ฒƒ์ด ๋ฐ”๋กœ Spring Data JPA์ž…๋‹ˆ๋‹ค. ..

2021. 5. 29. 20:13

[Spring Data] Spring Data module

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ด๋Ÿฐ ์˜๋ฌธ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. JPA๋Š” JPA์ธ๋ฐ, Spring Data JPA๋Š” ๋ฌด์—‡์ด๋ฉฐ, JDBC๋Š” JDBC์ธ๋ฐ, Spring Data JDBC๋Š” ๋ฌด์—‡์ธ๊ฐ€? JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ชฉ์š”์—ฐํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด Spring Data JPA๋ฅผ ๋ชฐ๋ผ๋„ JPA๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐ ํฐ ์ง€์žฅ์€ ์—†์ง€๋งŒ JPA๋ฅผ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ Spring Data JPA๋กœ ๋„˜์–ด์˜ค๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์ด๋ก  ์—†์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ Spring Data๊ฐ€ ์•ž์— ๋ถ€ํŠผ ๋””ํŽœ๋˜์‹œ๋“ค์€ ๋ฌด์–ธ๊ฐ€ Spring์— ์ตœ์ ํ™” ๋˜์–ด ์žˆ๋Š” ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Spring์—์„œ ์ œ๊ณตํ•˜๋Š” Spring Data Pattern์€ ์–ด๋–ค ๊ฒƒ์ผ๊นŒ์š”? Spring Data Spri..

2021. 5. 16. 12:01

[Web] Dropbox / Adobe Photoshop API๋กœ ์ด๋ฏธ์ง€ ๋ฐฐ๊ฒฝ ์ง€์šฐ๊ธฐ

๊ฐœ๋ฐœ ๋ฒˆ์™ธ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๊ฑด ์ง€๊ทนํžˆ ์˜ค๋žœ๋งŒ์ธ ๊ฑฐ ๊ฐ™๋„ค์š”. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ํ˜„์žฌ Beta๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ๋Š” Adobe Photoshop API๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€์˜ ๋ฐฐ๊ฒฝ์„ ์ง€์šฐ๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Adobe Photoshop API https://github.com/AdobeDocs/photoshop-api-docs AdobeDocs/photoshop-api-docs Adobe Photoshop API. Contribute to AdobeDocs/photoshop-api-docs development by creating an account on GitHub. github.com Adobe API๋Š” ํ˜„์žฌ ๊ณต๊ฐœ ๋ฒ ํƒ€์™€ ๋น„๊ณต๊ฐœ ๋ฒ ํƒ€ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์„œ ์ง„ํ–‰ ์ค‘์— ์žˆ์œผ๋ฉฐ Photostop ..

2021. 5. 16. 10:25

[Spring boot] Spring ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๊ณผ @SpringBootTest

์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ์š”? ์ œ๊ฐ€ ์ฒ˜์Œ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  ๋‚˜์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ๊ฐ€์žฅ ํฐ ์˜๋ฌธ์ ์ด ๋“ค์—ˆ๋˜ ์œ ํ˜•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ๋Š” Unit Test์™€ Instrument Test ๋‘ ๊ฐ€์ง€๋ฅผ ์ง„ํ–‰ํ–ˆ๊ณ , ๊ฐ๊ฐ DB I/O ํ…Œ์ŠคํŠธ์™€ UI/UX ๋™์ž‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์–ด๋–จ๊นŒ์š”? ๋Œ€ํ‘œ์ ์ธ Spring boot๋ฅผ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ค„๋ณผํ…๋ฐ, Spring boot์—์„œ๋Š” JUnit ์ด๋ผ๋Š” ํ…Œ์ŠคํŠธ ๋„๊ตฌ์™€ Mockito๋ผ๋Š” Mock ๊ฐ์ฒด ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ 3๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Spring boot์˜ ํ…Œ์ŠคํŠธ ๋ถ„๋ฅ˜ https:..

2021. 5. 2. 19:38

[FastAPI] 10. Middleware๋ฅผ ์ด์šฉํ•œ ์ „ํ›„ ์ฒ˜๋ฆฌ

API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์–ด๋Š ์ •๋„ ์†Œ๋ชจ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ ๋ฐ›์€ EndPoint์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? Middleware Spring์—์„œ๋Š” Intercepter, Filter์™€ ๊ฐ™์€ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด, Flask์—์„œ๋Š” App Context ์ค‘ after_request๋‚˜ before_request ๋“ฑ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. FastAPI์—๋Š” Middleware ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Middleware ํŒจํ„ด์€ API ํ˜ธ์ถœ ์ „ํ›„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚œ ๋’ค, API Router๋กœ ์š”์ฒญ์„ ๋„˜๊ธฐ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์ด ์š”์ฒญ์€ ๋จผ์ € Middleware์—์„œ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ..