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

๐Ÿš€ Backend16

[FastAPI] SQLModel 1. SQLModel์ด๋ž€?๊ธฐ์กด Python SQL ORM ๊ตฌํ˜„์ฒด์ธ SQLAlchemy์™€ ๊ฒ€์ฆ ํŒจํ‚ค์ง€ Pydantic์„ ๊ฒฐํ•ฉํ•œ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.SQLAlchemy์˜ ORM ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ Pydantic์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.  2. SQLAlchemy vs SQLModelSQLAlchemy๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” API ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•œ๋‹ค.SQLAlchemy Core: ์ €์ˆ˜์ค€ SQL ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์—ฌ SQL์„ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋จSQLAlchemy ORM: ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘(Object-Relational Mapping)์„ ํ†ตํ•ด Python ํด๋ž˜์Šค๋กœ DB ๋ชจ๋ธ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์ŒSQLModel์€ SQLAlchemy .. 2025. 3. 14.
[FastAPI] Best Practices - Project Structure Project StructureFastAPI ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์„ค๊ณ„ ํ• ๋•Œ ์ฐธ๊ณ ํ•˜๊ธฐ ์ข‹๋‹ค.Netflaix/Dipatch๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ˆ˜์ •ํ•œ ์ž๋ฃŒ์ด๋‹ค.fastapi-projectโ”œโ”€โ”€ alembic/โ”œโ”€โ”€ app # ์›๋ณธ์€ src ์ด์ง€๋งŒ ๋ณธ์ธ์€ app ์„ ํ˜ธํ•จ.โ”‚ โ”œโ”€โ”€ authโ”‚ โ”‚ โ”œโ”€โ”€ router.pyโ”‚ โ”‚ โ”œโ”€โ”€ schemas.py # pydantic modelsโ”‚ โ”‚ โ”œโ”€โ”€ models.py # db modelsโ”‚ โ”‚ โ”œโ”€โ”€ dependencies.pyโ”‚ โ”‚ โ”œโ”€โ”€ config.py # local configsโ”‚ โ”‚ โ”œโ”€โ”€ constants.pyโ”‚ โ”‚ โ”œโ”€โ”€ exceptions.pyโ”‚ โ”‚ โ”œโ”€โ”€ service.pyโ”‚ โ”‚ โ””โ”€โ”€ ut.. 2025. 2. 14.
[SQL] SELECT ๊ด€๋ จ ํ•จ์ˆ˜ ์ง‘๊ณ„ ํ•จ์ˆ˜ (Aggregate Functions)AVG(): ํ‰๊ท ๊ฐ’ ๊ณ„์‚ฐSUM(): ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐCOUNT(): ์ „์ฒด ํ–‰ ๊ฐœ์ˆ˜COUNT(*): ๋ชจ๋“  ํ–‰์˜ ๊ฐœ์ˆ˜COUNT(์ปฌ๋Ÿผ๋ช…): NULL์ด ์•„๋‹Œ ๊ฐ’์˜ ๊ฐœ์ˆ˜MAX() / MIN(): ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’GROUP_CONCAT(): ๋ฌธ์ž์—ด ํ•ฉ์น˜๊ธฐROUND() / CEIL() / FLOOR(): ๋ฐ˜์˜ฌ๋ฆผ, ์˜ฌ๋ฆผ, ๋‚ด๋ฆผ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์–ด๋Š ์ž๋ฆฌ๊นŒ์ง€ ํ‘œํ˜„ ์ •ํ•จTRUNCATE(): ์ง€์ •ํ•œ ์ž๋ฆฌ์ˆ˜๊นŒ์ง€ ๋ฒ„๋ฆผ์ƒ์œ„ N๊ฐœ ๋ฐ์ดํ„ฐ ์ถ”์ถœ (LIMIT)LIMIT N: ๊ฒฐ๊ณผ์—์„œ ์ƒ์œ„ N๊ฐœ๋งŒ ์ถœ๋ ฅ ๋‚ ์งœ ๋‹ค๋ฃจ๊ธฐ# ๋‚ ์งœ ๋ฒ”์œ„ ์กฐํšŒWHERE JOINED BETWEEN '2021-01-01' AND '2021-12-31'๋˜๋Š”WHERE YEAR(JOINED) = 2021 # ๋‚ ์งœ ํฌ๋งท ๋ณ€๊ฒฝDATE_F.. 2025. 2. 5.
[Security] ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ Spring Security์ธ์ฆ(Authentication), ๊ถŒํ•œ ๋ถ€์—ฌ(Authorize) ๋ฐ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ 2024. 2. 27.
[Spring Basic] ์Šคํ”„๋ง ์‹ฑ๊ธ€ํ†ค ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ 1๊ฐœ๋งŒ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด package hello.core.singleton; public class SingletonService { //1. static ์˜์—ญ์— ๊ฐ์ฒด๋ฅผ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑํ•ด๋‘”๋‹ค. private static final SingletonService instance = new SingletonService(); //2. public์œผ๋กœ ์—ด์–ด์„œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ด static ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์กฐํšŒํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค. public static SingletonService getInstance() { return instance; } //3. ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ์„ ์–ธํ•ด์„œ ์™ธ๋ถ€์—์„œ new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š”๋‹ค. pr.. 2024. 1. 18.
[Spring Basic] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ ๋นˆ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ /์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext ๊ฐ€ ๋ฐ”๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค ๊ณ ์ด๊ณ ์ด ์ •๋ณด๋ฅผ ๋ชจ์•„์„œ ์ด๋ฅผ ์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ ํ˜•ํƒœ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ํ”ํžˆ ๋งํ•˜๋Š” BeanFactory๋Š” ์ด๋Ÿฐ ApplicationContext์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์ฃผ๋กœ AnnotationConfig, ApplicationContext๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. locale, ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ, ๋” ๋‚˜์€ ๋ฆฌ์†Œ์Šค ์กฐํšŒ ๋“ฑ๋“ฑ... ์Šคํ”„๋ง ๋นˆ ๊ทธ๋ ‡๋‹ค๋ฉด Bean ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด์„œ .. 2024. 1. 18.