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

๐Ÿš€ Backend21

[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.
[Spring Basic] IoC์™€ DI IoC - ์ œ์–ด์˜ ์—ญ์ „ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ๊ฐœ๋ฐœ์ž์˜ ์˜์ง€์— ๋”ฐ๋ผ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜๊ณ  ์‹คํ–‰ํ–ˆ๋‹ค. ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์กฐ์ข…ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์—์„  ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์—ฐ๊ฒฐ, ์‹คํ–‰์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง์ด ๋‹ด๋‹นํ•œ๋‹ค. ํ”„๋ ˆ์ž„ ์›Œํฌ vs ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๋Œ€์‹  ์‹คํ–‰ํ•˜๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ œ์–ด์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋‚˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋ธŒ์ ํŠธ(๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด)์™€ Configuration ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์Šคํ”„๋ง ์ด๋ฆฌ์ €๋ฆฌ ์งฌ๋ฝ•ํ•ด์„œ ์Šคํ”„๋ง ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. DI - ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ์Šคํ”„๋ง์ด DI๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋„ค ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. โญ๏ธ ์ƒ์„ฑ์ž ์ฃผ์ž… โญ๏ธ Setter ์ฃผ์ž… ํ•„๋“œ ์ฃผ์ž… ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž… ์ƒ์„ฑ์ž ์ฃผ์ž… ์ƒ์„ฑ.. 2024. 1. 18.