728x90
๋ฐ˜์‘ํ˜•

(ํ™”์š”์ผ)

- github ์ด์Šˆ ์ƒ์„ฑํ•ด์„œ jira๋ž‘ ์—ฐ๋™ ์‹ค์Šตํ•˜๊ธฐ(?)

- README.md ํŒŒ์ผ์—์„œ md๋ž€...? markdown ํŒŒ์ผ์ด๋ผ๋Š” ๋œป (์›น ํŽ˜์ด์ง€ ๊ธ€์˜ฌ๋ฆด ๋•Œ ์“ฐ์ž„) 

Github Project์—์„œ Board๋Š” ์• ์ž์ผ ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค!! ์š”์ฆ˜ ์ œ์ผ ๋งŽ์ด ์‚ฌ์šฉ

 

Todo : ์ด์Šˆ ์ง„ํ–‰ ์ „ ์ƒํƒœ

In Progress : ๋‹ด๋‹น์ž๊ฐ€ ์ด์Šˆ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ง„ํ–‰์ค‘์ธ ์ƒํƒœ

In Review : ๊ฒ€ํ† ๋ฅผ ์š”์ฒญ/์ง„ํ–‰ ์ค‘์ธ ์ƒํƒœ(์ค‘๊ฐ„์— ๊ฒ€ํ†  ๋‹จ๊ณ„๋ฅผ ๋„ฃ๋Š”๊ฒŒ ์š”์ฆ˜ ๊ทผํ™ฉ)  

Done : ์™„๋ฃŒ ๋ฐ ์ข…๋ฃŒ๋œ ์ƒํƒœ

 

๊ธฐ๋ณธ ์„ธํŒ… ์™„๋ฃŒ!!

 

issue๋ž‘ project ์—ฐ๊ฒฐ

 

 

 

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ : ์ •ํ•ด์ง„ ๋น„์šฉ๊ณผ ๊ธฐ๊ฐ„๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ’ˆ์งˆ์„ ๋†’์ด๋ฉด์„œ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊ฑด์ง€...

 

- R&R : Role & Responsibility (pm์ด๋ผ๋ฉด ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฑ…์ž„)

 

ํ•™์ƒ / ํ•™์ƒ ๋“ฑ๋ก / ํ•™์ƒ ๋“ฑ๋ก ์ˆ˜์ • ์ด์ฒ˜๋Ÿผ... ์„ธ๋ถ„ํ™”ํ•˜๋Š” ๊ตฌ์กฐํ™”ํ•˜๋Š” ํ™œ๋™ WBS / Level 3~4 ์ •๋„๋กœ ์ชผ๊ฐœ๋Š”๊ฒƒ์ด ์ข‹๋‹ค (2-3์ฃผ ๋‹จ์œ„๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„๋Ÿ‰)

 

- wbs ์‹ค์Šต์€ ๋‚ด์ผ!!

 

- ์œ„ํ—˜๊ณผ ์ด์Šˆ์˜ ์ฐจ์ด : ์œ„ํ—˜(potential problem)์€ ์•„์ง ์ž ์žฌ์  ๋ฌธ์ œ๋กœ ์•„์ง ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ์ด๊ณ  ์ด์Šˆ๋Š” ์ผ์–ด๋‚œ ๋ฌธ์ œ๋กœ ์‹ค์ œ๋กœ ์ผ์–ด๋‚  ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ํ—˜์„ ๋ฐฉ์ง€ํ•ด์•ผํ•œ๋‹ค!

- ์œ„ํ—˜๊ณผ ๊ด€๋ จ๋œ์šฉ์–ด : ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๋ฐœ์ƒํ–ˆ์„๋•Œ์˜ ์‹ฌ๊ฐ๋„(์œ„ํ—˜๋„)๋ฅผ ๊ณฑํ•œ๊ฒƒ์ด ์œ„ํ—˜๋„.. ๋†’์€๊ฒƒ์ด ์šฐ์„ ์ˆœ์œ„๋กœ ์ •ํ•ด์ง€๊ณ  ์ด๋ฅผ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ์ฒ ์ €ํ•˜๊ฒŒ ๊ณ„ํš์„ ์„ธ์›Œ์•ผํ•œ๋‹ค

 

 

 

(์ˆ˜์š”์ผ)

- wbs ๋งŒ๋“ค๊ธฐ 

 

ํ•™์ƒ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ WBS ๋งŒ๋“ค๊ธฐ

 

 

 

๋ฒ ์ด์Šค ๋ผ์ธ : ํŠน์ • ์‹œ์ ์—์„œ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„์ •ํ™•ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ž‘์—…..

 - ์–ด๋–ค ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ์ธ๊ฑด์ง€๋ฅผ ์•Œ๊ธฐ ์• ๋งคํ•˜๋ฏ€๋กœ ์–ด๋–ค ์‚ฐ์ถœ๋ฌผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ฐœํ•œ๊ฑด์ง€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์ ์–ด ๋†“์€๊ฒƒ์ด baseline..

- ์–ด๋–ค ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ์™€ ์„ค๊ณ„์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐœ๋ฐœํ• ๊ฑด์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐœ๋ฐœํ•ด์•ผํ•œ๋‹ค!

- ์†Œํ”„ํŠธ์›จ์–ด ํ˜•์ƒ ํ†ต์ œ : ํ˜•์ƒํ†ต์ œ์œ„์›ํšŒ์—์„œ ๋ณ€๊ฒฝ ์š”์ฒญ์„ ์ˆ˜์šฉํ•  ๊ฒƒ์ธ์ง€ ํ‰๊ฐ€ํ•˜๊ณ  ํ˜‘์˜ํ•˜๋Š” ๊ณผ์ •(CCBํ•œํ…Œ ํ†ต๊ณผ ๋ฐ›์•„์•ผ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ)

 

 

์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ(SW Requirement Specification) : ๋ฌด์—‡์„ ๊ฐœ๋ฐœํ• ๊ฑด์ง€์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค! (์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ• ๊ฒƒ์ธ์ง€, ์–ด๋–ค ํ’ˆ์งˆ๋กœ / ์–ด๋–ป๊ฒŒ๋Š” ์„ค๊ณ„์„œ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค..)

- ์‹œ์Šคํ…œ(SYSRS)

- ์†Œํ”„ํŠธ์›จ์–ด(SWRS)

- ํ•˜๋“œ์›จ์–ด(HWRS)

 

๊ธฐ๋Šฅ vs ๋น„๊ธฐ๋Šฅ 

- ๊ธฐ๋Šฅ :  ์ฐ ๊ธฐ๋Šฅ

- ๋น„๊ธฐ๋Šฅ : ํ’ˆ์งˆ, ์„ฑ๋Šฅ, ์ œ์•ฝ์‚ฌํ•ญ

 

๋น„๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ์˜ˆ์‹œ

 

๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š”์ง€... (๋„์ถœ, ๋ถ„์„, ๋ช…์„ธ, ํ™•์ธ...)

- ์ข‹์€ ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ๋ผ๋ฉด ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ค ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€...(ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์š”๊ตฌ์‚ฌํ•ญ์ด ๊ต‰์žฅํžˆ ๋””ํ…Œ์ผ ํ•˜๋‹ค๋Š”๊ฒƒ!! / ์•„๋‹ˆ๋ผ๋ฉด ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ํ•ด๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒํ•˜๊ธฐ!!)

- ์ถ”์ ์„ฑ : ์šฐ๋ฆฌ์˜ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์„ค๊ณ„์„œ, ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์„œ, ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋‚˜์™”๋Š”์ง€ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•œ์ง€... / ์šฐ๋ฆฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค๊ฑธ ์ˆ˜์ •ํ•ด์•ผํ• ์ง€ ์ฐพ๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆผ, ๋ˆ„๋ฝ ๊ฐ€๋Šฅํ•˜๋‹ค

 

- ๋ณ€๊ฒฝ ์šฉ์ด์„ฑ : ๋‹ค๋ฅธ๊ฒƒ๊ณผ ์ตœ๋Œ€ํ•œ ๋…๋ฆฝ์„ฑ์„ ๋„์šฐ๋Š”๊ฒƒ์ด ์ข‹๋‹ค(์˜์กด์ ์ด๋ฉด ๋ณ€๊ฒฝํ•˜๊ธฐ ํž˜๋“ฆ) 

-  uml ๊ทธ๋ฆฌ๊ธฐ ์‹ค์Šต์€ ๋‚ด์ผ..

 

 

<๋ชฉ์š”์ผ)

- UML : ์‹œ์Šคํ…œ ์„ค๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ†ตํ•ฉ๋œ ๋ชจ๋ธ๋ง์–ธ์–ด

 

MBD : MODEL BASED DEVELOPMENT / ๋ชจ๋ธ๋ง๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐœ๋ฐœํ•ด์คŒ... / ๊ฐœ๋ฐœ์ž๋Š” ์—†์–ด์ ธ๋„... ์„ค๊ณ„์ž๋Š” ์•ˆ ์—†์–ด์ง„๋‹ค

 

USECASE DIAGRAM ๊ตฌ์„ฑ์š”์†Œ

- user actor :  ์‹œ์Šคํ…œ์˜ ์™ธ๋ถ€์— ์žˆ์œผ๋ฉด์„œ ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ๋“ค... ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ํ˜น์€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ

- system actor : ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ ๋ฒ”์œ„์—๋Š” ์†ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ์ฃผ๊ณ ๋ฐ›๋Š” ๋“ฑ ์„œ๋กœ ์—ฐ๋™๋˜๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ 
                          ex) ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๋Š” ๊ธฐ์ƒ์ฒญ ์‹œ์Šคํ…œ   

- usecase : ์‹œ์Šคํ…œ์ด ์•กํ„ฐ์—๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์ง‘ํ•ฉ / ๋™์‚ฌ+๋ช…์‚ฌ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ(์„ฑ์ ๋“ฑ๋ก, ์„ฑ์ ์กฐํšŒ)

- relationship : ์•กํ„ฐ์™€ ์œ ์Šค์ผ€์ด์Šค / ์œ ์Šค์ผ€์ด์Šค์™€ ์œ ์Šค์ผ€์ด์Šค ์‚ฌ์ด์˜ ์—ฐ๊ด€ ๊ด€๊ณ„!!! (๊ด€๊ณ„ ์ข…๋ฅ˜.....)

 

 

# USECASE DIAGRAM ๊ทธ๋ฆฌ๊ธฐ

https://app.diagrams.net/

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit d

app.diagrams.net

 

 

# ์„ค๊ณ„

- ๊ด€์  : HOW(์–ด๋–ป๊ฒŒ)

- ํŠน์ง• : ์‚ฌ์šฉ ํ™˜๊ฒฝ์„ ๋ฐ˜์˜ํ•ด ๊ตฌ์ฒด์ 

- ์ƒ์œ„ ์„ค๊ณ„์„œ, ์ƒ์„ธ ์„ค๊ณ„์„œ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰จ

 

 

(๊ธˆ์š”์ผ)

https://velog.io/@hongjunland/Clean-Architecture

 

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜(Clean Architecture)

DDD์ฑ…์„ ์ •๋…ํ•ด๋ณด๊ณ  ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ค‘์— ํ•˜๋‚˜์ธ ํฌํŠธ์™€ ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์ž ๊น ๊ณต๋ถ€ํ•ด๋ณธ ์ ์ด์žˆ๋‹ค. ํ”ํžˆ ๋งํ•˜๋Š” ํด๋ฆฐ์•„ํ‚คํ…์ฒ˜์™€ ๊ฑฐ์˜ ๊ฐ™์€๋ง๋กœ ์•Œ๋ ค์ ธ์žˆ๋Š”๋ฐ, ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋‚˜์™€์žˆ

velog.io

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ํ•„๋…์„œ...

 

# ์„ค๊ณ„!!!

 

## ์ถ”์ƒํ™” : ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ์ œํ’ˆ์˜ ๊ตฌํ˜„์„ ์ƒ๊ฐํ•ด๋ด„!!

 

https://wealthymindset.tistory.com/entry/%EC%82%AC%EC%97%85%EC%B6%94%EC%A7%84-%ED%98%95%ED%83%9C%EC%9D%98-%EB%91%90%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95-%ED%83%91%EB%8B%A4%EC%9A%B4Top-down%ED%95%98%ED%96%A5%EC%8B%9D-%EB%B0%94%ED%85%80%EC%97%85Bottom-up%EC%83%81%ED%96%A5%EC%8B%9D-%EB%B0%A9%EC%8B%9D

 

์‚ฌ์—…์ถ”์ง„ ํ˜•ํƒœ์˜ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•, ํƒ‘๋‹ค์šด(Top-down,ํ•˜ํ–ฅ์‹) & ๋ฐ”ํ…€์—…(Bottom-up,์ƒํ–ฅ์‹) ๋ฐฉ์‹

Top-down๊ณผ Bottom-up์€ ๋ฌธ์ œ ํ•ด๊ฒฐ์ด๋‚˜ ์˜์‚ฌ ๊ฒฐ์ •์„ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Top-down ์ ‘๊ทผ ๋ฐฉ์‹์€ ํฐ ๊ทธ๋ฆผ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ž‘์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, Bottom-up ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘์€

wealthymindset.tistory.com

Top-down(ํ•˜ํ–ฅ์‹)๊ณผ Bottom-up(์ƒํ–ฅ์‹)์˜ ์ฐจ์ด..

 

comfile ๊ณผ์ • : .java ํŒŒ์ผ์„ ์ปดํ“จํ„ฐ๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ฑฐ์ณ์„œ .class ํŒŒ์ผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •

 

 

## ๋ถ„ํ• ๊ณผ ์ •๋ณต(Divide Conquer)

 

- Component : ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ / ํด ์ˆ˜๋„ ์ž‘์„ ์ˆ˜๋„ ์–ด๋–ป๊ฒŒ ์ชผ๊ฐœ์ง€๋Š”์ง€๋Š” ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค  

- Unit : ๋”์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” atomicํ•œ ์š”์†Œ

 

๋ถ„ํ• ๊ณผ ์ •๋ณต์˜ ์˜๋ฏธ...

- ํ•˜๋‚˜๋กœ ํ•˜์ง€ ๋ง๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ชผ๊ฐœ๊ณ  ํ•˜๋‚˜ํ•˜๋‚˜ ์ž‘์€ ๋‹จ์œ„๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ•˜๊ณ  ํ•ฉ์ณ์„œ ์ƒํ–ฅ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•ด ๋‚˜๊ฐ€๋ผ๋Š” ์˜๋ฏธ

- ๋ชจ๋“ˆํ™”๋ž‘ ๊ฐ™์€ ์˜๋ฏธ(= unit๊ณผ๋„ ๊ฐ™์Œ)

- ํ•œ ํ™”๋ฉด์— ๋ณด๊ธฐ ์ข‹์€ 50-80์ค„ ์‚ฌ์ด๋กœ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

 

 

## ๋ชจ๋“ˆํ™”(Modularity)

 

- ์˜๋ฏธ : ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์กฐ๋ฅผ ์ด๋ฃจ๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„

- ํŠน์ง•

  • ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ์œ„
  • ์œ ์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง
  • ๋ชจ๋“ˆ์—์„œ ๋˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ํ˜ธ์ถœ(call)ํ•  ์ˆ˜ ์žˆ์Œ -> interaction์˜ ํ•œ ์ข…๋ฅ˜ / interface : interaction์„ ํ•˜๋Š”๋ฐ ์†์‰ฝ๊ฒŒ ํ•˜๋Š” ์ˆ˜๋‹จ(ํ™”๋ฉด) / ํ˜ธ์ถœ์„ ํ•˜๋Š”๊ฒฝ์šฐ... ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต ๋ฐ›์„  
  • ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ๋ชจ๋“ˆ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ

- ๋ชจ๋“ˆ์˜ ํฌ๊ธฐ : ์‹œ์Šคํ…œ์˜ ๊ทœ๋ชจ, ์œ ํ˜•, ํŠน์„ฑ์— ๋”ฐ๋ผ ์ž‘์Œ / ์ž‘์€ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด ๋ชจ๋“ˆ์˜ ํฌ๊ธฐ๋Š” ํ•จ์ˆ˜ / ํฐ ์‹œ์Šคํ…œ์ด๋ผ๋ฉด...

 

- ์‘์ง‘๋„๋Š” ๊ฐ•ํ•˜๊ฒŒ(๋ชจ๋“ˆ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ„์—๋Š” ๊ฐ•ํ•˜๊ฒŒ) / ๊ฒฐํ•ฉ๋„๋Š” ์•ฝํ•˜๊ฒŒ(์˜์กด์„ฑ์ด ์•ฝํ•ด์•ผํ•œ๋‹ค)

- ๊ฒฐํ•ฉ๋„๋ฅผ ๋Š์Šจํ•˜๊ฒŒ ํ•˜๋ผ๋Š” ๋ง์ด... ๋ชจ๋“  ๊ด€๊ณ„๊ฐ€ ์•ˆ์ข‹๋‹ค๋Š” ๋ง์ด ์•„๋‹ˆ๋ผ A,B๊ฐ€ ์„œ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์—๋Ÿฌ์˜ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ์ง€ ๋ง๋ผ๋Š” ์†Œ๋ฆฌ  

- ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๋ณต์žกํ•ด์ง / ๋‚ฎ์„์ˆ˜๋ก ๋‹จ์ˆœํ•ด์ง€๋„ ์œ ์ง€๋ณด์ˆ˜, ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹๋‹ค

 

 

C์–ธ์–ด ์ ˆ์ฐจ์ง€ํ–ฅํ˜• ์–ธ์–ด...

- ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋„ ๋‹ค ์ˆœ์„œ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ ์™œ ์ ˆ์ฐจ์ง€ํ–ฅ์ด๋ผ๊ณ  ํ•˜๋Š”์ง€ ???? ํŠนํžˆ๋‚˜ ์ˆœ์„œ์— ์ง‘์ค‘ํ•ด์„œ?? ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ๋‚˜ ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค / ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€

 

JAVA ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด...

- ์‚ฌ๋žŒ์ด ์ดํ•ดํ•œ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์ž ํ•ด์„œ ๋‚˜์˜จ ์–ธ์–ด

- interaction์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— loose coupling, strong cohension์„ ๊ผญ ํ•˜์ž

 

 

# ๊ฐ์ฒด์ง€ํ–ฅ๋ฐฉ๋ฒ•๋ก ์˜ ํŠน์ง•

 

- ์บก์Šํ™” : ์ •๋ณด์€๋‹‰์˜ ๊ฐœ๋…์ด ํฌํ•จ๋œ ๊ฐœ๋… / ๋‚˜์˜ ์ •๋ณด๋ฅผ ๊ฐ์‹ธ์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋Š” ํšจ๊ณผ 

- ์ƒ์† : ๋‹ค๋ฅธํด๋ž˜์Šค์˜ ์†์„ฑ์„ ๋ฌผ๋Ÿฌ๋ฐ›์•„ ๋‚ด ๊ฒƒ์ฒ˜๋Ÿผ ์“ฐ๋Š” ๊ฒƒ 

- ๋‹คํ˜•์„ฑ : ํ•˜๋‚˜ ์ด์ƒ์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ

  • ์˜ค๋ฒ„๋กœ๋”ฉ : ๊ฐ™์€ ํ•จ์ˆ˜ ์ด๋ฆ„์ด์–ด๋„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋‚˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ์ค‘๋ณต ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์† ๊ด€๊ณ„์—์„œ ๋ถ€๋ชจ์˜ ๊ฐ€์ ธ์˜จ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜ ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์žฌ์ •์˜ํ•˜์—ฌ, ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ฉ”์†Œ๋“œ์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
    • ์‰๋„์ž‰์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์—ฌ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ž์‹ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ๋Œ€์‹  ์ž์‹ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค
728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ๐Ÿ˜ต‍๐Ÿ’ซ

https://school.programmers.co.kr/learn/courses/30/lessons/43165

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

๋‚ด ํ’€๐Ÿฆท

class Solution {
    public int solution(int[] numbers, int target) {
        return dfs(numbers, target, 0, 0);
    }
    
    private int dfs(int[] numbers, int target, int index, int sum) {
        // ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋‹ค ์‚ฌ์šฉํ–ˆ์„ ๋–„
        if(index == numbers.length) {
            // ๋ชฉํ‘œ ์ˆซ์ž์™€ ํ•ฉ์ด ๊ฐ™์œผ๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜ 1 ์ฆ๊ฐ€
            return sum == target ? 1 : 0;
        }
        // ํ˜„์žฌ ์ˆซ์ž๋ฅผ ๋”ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋นผ๋Š” ๊ฒฝ์šฐ๋กœ ์žฌ๊ท€ ํ˜ธ์ถฉ..
        return dfs(numbers, target, index + 1, sum + numbers[index]) + dfs(numbers, target, index + 1, sum - numbers[index]);
    }
}

 

์ด๋ฏธ ํ•œ๋ฒˆ ํ’€์—ˆ๋˜ dfs ๋ฌธ์ œ!!

๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์„ ์ฐพ์•„์•ผํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ dfs๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค

if๋ฌธ์„ ์“ฐ๋Š”๊ฒƒ๊นŒ์ง€๋Š” ์‰ฌ์šด๋ฐ ๋งˆ์ง€๋ง‰์— ์žฌ๊ท€๋ฅผ ์–ด๋–ป๊ฒŒ ์‹œ์ผœ์•ผํ•˜๋Š”์ง€๋Š” ํ•ญ์ƒ ๊ณ ๋ฏผ๋˜๋Š” ๋ถ€๋ถ„์ธ๊ฑฐ ๊ฐ™๋‹ค..

ํ•˜์ง€๋งŒ ์ด๋ฒˆ๋ฌธ์ œ๋Š” ์ˆ˜์›”ํ•˜๊ฒŒ ํ†ต๊ณผ~~

 

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฐœ๋…๋“ค โœ๏ธ

 

 DFS๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ํšจ๊ณผ์ ์ธ ๋ฌธ์ œ ์œ ํ˜•

  1. ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์„ ์ฐพ๋Š” ๊ฒฝ์šฐ : ์ฃผ์–ด์ง„ ์ˆซ์ž ๋ฐฐ์—ด์„ ๋”ํ•˜๊ณ  ๋นผ์„œ ํŠน์ • ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ
  2. ํ•ด๋‹ค ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒฝ์šฐ : ๋ฏธ๋กœ์—์„œ ์ถœ๊ตฌ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ
  3. ์กฐํ•ฉ๊ณผ ์ˆœ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ : ํŠน์ • ๊ธธ์ด์˜ ์กฐํ•ฉ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์ˆœ์—ด์„ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ
  4. ๋ฐฑํŠธ๋ž˜ํ‚น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ : N-Queens ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ œํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ

 

DFS ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

- ๋ฌดํ•œ ๋ฃจํ”„ ์ฃผ์˜ : ์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋ช…ํ™•ํžˆ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

- ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ : ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์งˆ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋„ˆ๋ฌด ๊นŠ์€ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ์—์„œ๋Š” ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

- ํƒ์ƒ‰ ์ตœ์ ํ™” : ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๊ฒฝ๋กœ๋Š” ์กฐ๊ธฐ์— ์ค‘๋‹จํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ๐Ÿ˜ต‍๐Ÿ’ซ

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

๋‚ด ํ’€๐Ÿฆท

import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        
        for(int i = 0; i < commands.length; i++) { 
            int start = commands[i][0] -1;
            int end = commands[i][1];
            int k = commands[i][2] - 1;
            
            // ๋ฐฐ์—ด์˜ ํŠน์ • ๊ตฌ๊ฐ„์„ ๋ณต์‚ฌํ•˜๊ณ  ์ •๋ ฌ
            int[] arr = Arrays.copyOfRange(array, start, end);
            Arrays.sort(arr);
            
            // k๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ์ถ”๊ฐ€
            answer[i] = arr[k];
            
            }
        return answer;
    }
}

 

์˜ค๋žœ๋งŒ์— ํ’€์–ด๋ณด๋Š” ์ •๋ ฌ๋ฌธ์ œ๋ผ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ง€๋งŒ ๋‹นํ™ฉํ–ˆ๋‹ค ใ…Žใ…Ž

์–ด๋–ป๊ฒŒ ๋ฐฐ์—ด์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฒƒ์ด ์ข‹์„์ง€ for๋ฌธ ๋Œ๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ค„๊นŒํ–ˆ๋Š”๋ฐ ์ฐพ์•„๋ณด๋‹ˆ copyOfRange๋ผ๋Š” ๋ฐฐ์—ด ๋ณต์‚ฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์—ฌ ์‚ฌ์šฉํ•ด์„œ ์“ฐ๋‹ˆ๊นŒ ๊ธˆ๋ฐฉ ํ•ด๊ฒฐ !!!

copyOfRange ๊ผญ ๊ธฐ์–ตํ•ด ๋‘๊ฒ ์Œ~

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฐœ๋…๋“ค โœ๏ธ

Arrays.copyOfRange(์›๋ณธ๋ฐฐ์—ด, ์‹œ์ž‘์ธ๋ฑ์Šค, ๋์ธ๋ฑ์Šค);

์›๋ณธ๋ฐฐ์—ด : ๋ณต์‚ฌํ•˜๋ ค๋Š” ๋ฐฐ์—ด
์‹œ์ž‘ ์ธ๋ฑ์Šค : ๋ณต์‚ฌ๋ฅผ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค(ํฌํ•จ)
๋์ธ๋ฑ์Šค : ๋ณต์‚ฌ๋ฅผ ์ข…๋ฃŒํ•  ์ธ๋ฑ์Šค(๋ฏธํฌํ•จ)

int[] array = {1, 5, 2, 6, 3, 7, 4};
int[] slicedArray = Arrays.copyOfRange(array, 1, 5); // {5, 2, 6, 3}
728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

# 1. ์Œ์„ฑ ํŒŒ์ผ ๋ณ€ํ™˜์— ํ•„์š”ํ•œ ffmpeg ๋‹ค์šด ๋ฐ›๊ธฐ!

 

https://yeko90.tistory.com/entry/FFmpeg-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EC%84%A4%EC%B9%98-%EC%84%B8%ED%8C%85

 

FFmpeg ๋‹ค์šด๋กœ๋“œ ์„ค์น˜ / ํ•„์ˆ˜ ๊ธฐ๋ณธ ์„ธํŒ… ๋ฐฉ๋ฒ•

์—ฌ๋Ÿฌ๋ถ„ ํ˜น์‹œ FFmpeg์— ๋Œ€ํ•ด ๋“ค์–ด๋ณด์‹  ์  ์žˆ๋‚˜์š”?FFmpeg ์‚ฌ์šฉ๋ฒ•๋งŒ ์ตํžŒ๋‹ค๋ฉด ๋‹ค์–‘ํ•œ ํฌ๋งท์˜ ๋น„๋””์˜ค์™€ ์˜ค๋””์˜คํŒŒ์ผ์„ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ์‹ฌ์ง€์–ด ๋ฌด๋ฃŒ๊ตฌ์š”!๋งŽ์€ ์œ /๋ฌด๋ฃŒ ์†Œํ”„ํŠธ์›จ์–ด

yeko90.tistory.com

 

๋‹ค์šด๋กœ๋“œ ํ•˜๊ณ  ๋„ˆ๋ฌด ์–ต๊นŒ ๋‹นํ–ˆ์ง€๋งŒ.. ์ปดํ“จํ„ฐ ๋ฆฌ๋ถ€ํŒ… ํ•ด์ฃผ๋‹ˆ๊นŒ ํ•ด๊ฒฐ ^^;;;; ์™„์ „ ๋Ÿฌํ‚ค๋น„ํ‚ค๋‹ค

 

 

# 2. ์ฒ˜์Œ ๋ณด๋Š” ์—๋Ÿฌ ์ •๋ฆฌ

 

libiomp5md.dll ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋Š” OpenMP๋ผ๋Š” ๋ณ‘๋ ฌ ์ปดํ“จํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋กœ๋“œ๋˜๋ฉด์„œ ์ƒ๊ธฐ๋Š” ์ถฉ๋Œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ฃผ๋กœ PyTorch๋‚˜ NumPy ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ํ”„๋กœ๊ทธ๋žจ์—์„œ OpenMP๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜์–ด ์ถฉ๋Œ์ด ์ƒ๊ธด ๊ฒ๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ OpenMP๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋กœ๋“œ๋˜๋”๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด KMP_DUPLICATE_LIB_OK๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ TRUE๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• (Windows)

1. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ

์ด ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์„ธ์…˜์—์„œ๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜๋ฉฐ, ์ปดํ“จํ„ฐ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ด๋ฉด ์ด ์„ค์ •์€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  1. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ด๊ณ , ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค:
  2. bash
  3. ์ด ์ƒํƒœ์—์„œ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”.
set KMP_DUPLICATE_LIB_OK=TRUE

2. Python ์ฝ”๋“œ ๋‚ด์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐ

Python ์ฝ”๋“œ ์•ˆ์—์„œ ์ง์ ‘ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ฉด, ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  1. import ๋ฌธ ์•„๋ž˜์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
  2. python
     
  3. ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„์— ๋‹ค์‹œ ์‹คํ–‰ํ•ด ๋ณด์„ธ์š”. Python์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
import os os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

3. ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์˜๊ตฌ ์„ค์ •ํ•˜๊ธฐ (Windows)

์ด ๋ฐฉ๋ฒ•์€ ์ปดํ“จํ„ฐ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— KMP_DUPLICATE_LIB_OK๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ชจ๋“  ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์™€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ์„ค์ •์ด ์œ ์ง€๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  1. Windows ๊ฒ€์ƒ‰์ฐฝ์— "ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŽธ์ง‘"์ด๋ผ๊ณ  ์ž…๋ ฅํ•˜๊ณ  ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŽธ์ง‘์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐฝ์—์„œ ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:
    • ์‹œ์Šคํ…œ ๋ณ€์ˆ˜ ๋ถ€๋ถ„์—์„œ "์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณ€์ˆ˜ ์ด๋ฆ„์— KMP_DUPLICATE_LIB_OK์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณ€์ˆ˜ ๊ฐ’์— TRUE๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. ํ™•์ธ์„ ๋ˆŒ๋Ÿฌ ๋ชจ๋“  ์ฐฝ์„ ๋‹ซ๊ณ  ์ปดํ“จํ„ฐ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๋ฉด, ์ด ์„ค์ •์ด ๋ชจ๋“  ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์™€ ํ”„๋กœ๊ทธ๋žจ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 

# 3. MongoDB Atlas Cloud Database ์„ค์น˜ํ›„์— fastapi์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ

 

from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi
import os
from dotenv import load_dotenv
from datetime import datetime


# .env ํŒŒ์ผ ๋กœ๋“œ
load_dotenv()

uri = os.getenv("MONGO_URI")

# Create a new client and connect to the server
client = MongoClient(uri, server_api=ServerApi('1'))

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์ปฌ๋ ‰์…˜ ์„ ํƒ
db = client["maeubom"]
collection = db["maeubom"]

# ์‚ฝ์ž…ํ•  ๋ฐ์ดํ„ฐ์˜ ์†์„ฑ ์ •์˜
# ๊ฐ ์ปฌ๋ ‰์…˜ ์ •์˜
emotion_analysis_col = db["EmotionAnalysis"]
summary_col = db["Summary"]
generated_image_col = db["GeneratedImage"]
generated_music_col = db["GeneratedMusic"]
quote_col = db["Quote"]
analysis_session_col = db["AnalysisSession"]

def get_database():
    return db

'''
# ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ database.py์˜ db ์—ฐ๊ฒฐ ๊ฐ€์ ธ์˜ค๊ธฐ
from database import get_database

db = get_database()  # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ
collection = db["maeumbom"]  # ์ปฌ๋ ‰์…˜ ์„ ํƒ
'''

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

 

# ํ…์ŠคํŠธ ์š”์•ฝ ๋ชจ๋ธ ์‚ฌ์šฉํ•˜๊ธฐ 

 

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import nltk
from fastapi import FastAPI, Form
import torch

# NLTK ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ
nltk.download('punkt')

# ๋ชจ๋ธ๊ณผ ํ† ํฌ๋‚˜์ด์ € ์„ค์ •
model_dir = "lcw99/t5-base-korean-text-summary"
tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = AutoModelForSeq2SeqLM.from_pretrained(model_dir)

# CUDA ์žฅ์น˜ ์„ค์ •
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)  # ๋ชจ๋ธ์„ CUDA๋กœ ์ด๋™

app = FastAPI()

@app.post("/text_sum/")
async def text_sum(input_text: str = Form(...)):
    max_input_length = 512

    # ์ž…๋ ฅ ํ…์ŠคํŠธ ์„ค์ • ๋ฐ ์ „์ฒ˜๋ฆฌ
    text = input_text
    inputs = ["summarize: " + text]
    inputs = tokenizer(inputs, max_length=max_input_length, truncation=True, return_tensors="pt").to(device)  # ์ž…๋ ฅ์„ CUDA๋กœ ์ด๋™

    # ์š”์•ฝ ์ƒ์„ฑ
    with torch.no_grad():
        output = model.generate(**inputs, num_beams=8, do_sample=True, min_length=10, max_length=100)

    # ์š”์•ฝ๋œ ํ…์ŠคํŠธ ๋””์ฝ”๋”ฉ ๋ฐ ๋ฌธ์žฅํ™”
    decoded_output = tokenizer.batch_decode(output, skip_special_tokens=True)[0]
    predicted_summary = nltk.sent_tokenize(decoded_output.strip())[0]

    return {"result": predicted_summary}

 

 

# ๋ช…์–ธ ์ถ”์ฒœ ๋ชจ๋ธ ์‚ฌ์šฉ ๋ชปํ•˜๊ณ  ๋žœ๋ค ๋Œ๋ฆฌ๊ธฐ;;;

 

from transformers import OPTForCausalLM, GPT2Tokenizer
from fastapi import FastAPI, Form
import torch
import random

# ๋ชจ๋ธ๊ณผ ํ† ํฌ๋‚˜์ด์ € ์„ค์ •
model = OPTForCausalLM.from_pretrained("facebook/opt-350m", torch_dtype=torch.float16)
tokenizer = GPT2Tokenizer.from_pretrained("facebook/opt-350m")

# ๋ชจ๋ธ์ด ์‚ฌ์šฉํ•  ์žฅ์น˜ ์„ค์ •
device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)

# FastAPI ์•ฑ ์ดˆ๊ธฐํ™”
app = FastAPI()

# ๋ช…์–ธ ํŒŒ์ผ์—์„œ ๋ช…์–ธ์„ ์ฝ์–ด ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
def load_quotes(file_path="wise_saying.txt"):
    with open(file_path, "r", encoding="utf-8") as file:
        return [line.strip() for line in file.readlines() if line.strip()]

quotes = load_quotes()  # wise_saying.txt์—์„œ ๋ช…์–ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

# FastAPI ์—”๋“œํฌ์ธํŠธ: ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช…์–ธ ์ƒ์„ฑ
@app.post("/create_text/")
async def create_text(input_text: str = Form(...)):
    # ๋ช…์–ธ ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฌด์ž‘์œ„๋กœ ํ•˜๋‚˜ ์„ ํƒ
    selected_quote = random.choice(quotes)
    selected_quote = selected_quote.split('.', 1)[-1].strip()
    return {"result": selected_quote}


# # ์ž…๋ ฅ ํ…์ŠคํŠธ์™€ ๊ฐ€์žฅ ๊ด€๋ จ ์žˆ๋Š” ๋ช…์–ธ์„ ์ฐพ๋Š” ํ•จ์ˆ˜
# def get_best_quote(input_text, quotes):
#     best_quote = ""
#     highest_score = -float("inf")  # ์ดˆ๊ธฐ ์ตœ๊ณ  ์ ์ˆ˜๋ฅผ ์Œ์˜ ๋ฌดํ•œ๋Œ€๋กœ ์„ค์ •

#     for quote in quotes:
#         prompt = f"๋‹ค์Œ ์ž…๋ ฅ ๋ฌธ๊ตฌ์™€ ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ๋ช…์–ธ์„ ๊ณ ๋ฅด์‹œ์˜ค: '{input_text}'\n๋ช…์–ธ: '{quote}'"
        
#         # ์ž…๋ ฅ ํ…์ŠคํŠธ์™€ ๋ช…์–ธ์„ ํ•จ๊ป˜ ํ† ํฐํ™”ํ•˜์—ฌ ๋ชจ๋ธ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ
#         inputs = tokenizer(prompt, return_tensors="pt").to(device)
#         with torch.no_grad():
#             # ํ…์ŠคํŠธ์™€ ๋ช…์–ธ์˜ ๊ด€๋ จ์„ฑ์„ ํ‰๊ฐ€ํ•˜๋„๋ก ๋ชจ๋ธ ์‚ฌ์šฉ
#             output = model(**inputs).logits.mean().item()
        
#         # ๋ชจ๋ธ ์ถœ๋ ฅ์ด ๋†’์„์ˆ˜๋ก ๋†’์€ ์—ฐ๊ด€์„ฑ์œผ๋กœ ๊ฐ„์ฃผ
#         if output > highest_score:
#             highest_score = output
#             best_quote = quote

#     return best_quote

# # FastAPI ์—”๋“œํฌ์ธํŠธ: ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ช…์–ธ ์„ ํƒ
# @app.post("/create_text/")
# async def create_text(input_text: str = Form(...)):
#     # ์ž…๋ ฅ ํ…์ŠคํŠธ์™€ ๊ฐ€์žฅ ๊ด€๋ จ ์žˆ๋Š” ๋ช…์–ธ์„ ์ฐพ์Œ
#     selected_quote = get_best_quote(input_text, quotes)
#     selected_quote = selected_quote.split('.', 1)[-1].strip()
#     return {"result": selected_quote}

 

 

# ํ…์ŠคํŠธ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋‹ค์‹œ ํ•ด๋ณด๊ธฐ..

 

from diffusers import StableDiffusionPipeline
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
from PIL import Image
import requests
import json
import torch

model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda"

pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to(device)


# FastAPI ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
app = FastAPI()

# ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์—”๋“œํฌ์ธํŠธ
@app.post("/createimage/")
async def create_image(input_text: str = Form(...)):       

    # ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    image = pipe(
        prompt=input_text,
        num_inference_steps=28,
        guidance_scale=3.5
    ).images[0]

    # ์ด๋ฏธ์ง€ ์ €์žฅ
    image_path = "generated_image.png"
    image.save(image_path)

    # return {"image_path": image_path}
    return FileResponse(image_path, media_type="image/png")




# ์‹œ๊ฐ„ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ์ค„์ด๋Š” ์ค‘...

from diffusers import StableDiffusionPipeline
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
import torch

model_id = "runwayml/stable-diffusion-v1-5"
device = "cuda"

# Stable Diffusion Pipeline ์„ค์ • (FP16 ์‚ฌ์šฉ)
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to(device)

app = FastAPI()

@app.post("/createimage/")
async def create_image(input_text: str = Form(...)):       
    # ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ (์†๋„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •)
    image = pipe(
        prompt=input_text,
        num_inference_steps=20,  # ์ƒ์„ฑ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด 20๋‹จ๊ณ„๋กœ ์„ค์ •
        guidance_scale=3.0       # ํ”„๋กฌํ”„ํŠธ ๋”ฐ๋ฅด๋Š” ๊ฐ•๋„ ์กฐ์ •
    ).images[0]

    # ์ด๋ฏธ์ง€ ์ €์žฅ ๋ฐ ๋ฐ˜ํ™˜
    image_path = "generated_image.png"
    image.save(image_path)
    return FileResponse(image_path, media_type="image/png")

 

 

์–ด์ œ ์“ด StableDiffusion ๋กœ๊ทธ์ธ ํ•˜๋Š” ๋ฒ• ์„ฑ๋ฒ”๋‹˜์ด ์•Œ๋ ค์ฃผ์‹ฌ...

 

1. token ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ 

2. ํ„ฐ๋ฏธ๋„์— huggingface-cli login ์ž…๋ ฅํ•˜๋ฉด

3. ํ† ํฐ ๋„ฃ์–ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ... ์•ˆ ๋ณด์ด๋‹ˆ๊นŒ ํ•œ๋ฒˆ๋งŒ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜์‚ผ..

# '''
# 5. ์Œ์•…, ๋ช…์–ธ, ๊ทธ๋ฆผ ์ถ”์ฒœ/์ƒ์„ฑ: (๋ชจ๋ธ ๋ฏธ์ •) :
#      (ํ›„๋ณด 1) facebook/musicgen-small 
#      ํ”„๋กฌํ”„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์Œ์•…์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. 
#      ๋Œ€์‹  ์ด๊ฑด ์ €ํฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์ชฝ์—์„œ ํ”„๋กฌํ”„ํ„ฐ๋ฅผ ๋ช‡๊ฐ€์ง€ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ค˜์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”.
# '''


from diffusers import StableDiffusionPipeline
from fastapi import FastAPI, Form
from PIL import Image
import torch
import json
import requests

# # Hugging Face API ํ† ํฐ ์„ค์ •
# API_TOKEN = "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"
# headers = {"Authorization": f"Bearer {API_TOKEN}"}

# Stable Diffusion ๋ชจ๋ธ ๋กœ๋“œ
pipe = StableDiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-large",
    torch_dtype=torch.float16,
    use_auth_token=API_TOKEN  # API ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์ธ์ฆ
)
pipe = pipe.to("cuda")

# FastAPI ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
app = FastAPI()

# ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์—”๋“œํฌ์ธํŠธ
@app.post("/createimage/")
async def create_image(text: str = Form(...)):
    """
    ์ฃผ์–ด์ง„ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    """
    # ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    image = pipe(
        prompt=text,
        num_inference_steps=28,
        guidance_scale=3.5
    ).images[0]

    # ์ด๋ฏธ์ง€ ์ €์žฅ
    image_path = "generated_image.png"
    image.save(image_path)

    return {"image_path": image_path}
    
 
 
 # ์ผ๋‹จ ์ˆ˜์ • ํ•œ๋ฒˆ ํ•œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ 
 from diffusers import StableDiffusionPipeline
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
import torch

# ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ๋กœ๋“œ
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    torch_dtype=torch.float16,
    safety_checker=None  # ์•ˆ์ „ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ผ๋ถ€ ์˜ค๋ฅ˜ ๋ฐฉ์ง€
).to("cuda")
pipe.enable_attention_slicing()

# FastAPI ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
app = FastAPI()

# ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์—”๋“œํฌ์ธํŠธ
@app.post("/createimage/")
async def create_image(text: str = Form(...)):
    """
    ์ฃผ์–ด์ง„ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    """
    # ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    image = pipe(
        prompt=text,
        num_inference_steps=28,
        guidance_scale=3.5
    ).images[0]

    # ์ด๋ฏธ์ง€ ์ €์žฅ
    image_path = "generated_image.png"
    image.save(image_path)

    return FileResponse(image_path, media_type="image/png")
728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

# ๋”ฅ๋Ÿฌ๋‹ ํ™˜๊ฒฝ ๊ตฌ์ถ• : CUDA, CuDNN

 

https://developer.nvidia.com/cuda-11.3.0-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local

 

 

https://developer.nvidia.com/cudnn-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local

 

cuDNN 9.5.1 Downloads

 

developer.nvidia.com

 

https://velog.io/@euisuk-chung/%ED%99%98%EA%B2%BD%EA%B5%AC%EC%B6%95-CUDA-CuDNN%EC%95%84-%EB%82%98-%EC%A2%80-%EA%B7%B8%EB%A7%8C-%EA%B4%B4%EB%A1%AD%ED%98%80%EB%9D%BC-%E3%85%A0

 

[Linux] ๋”ฅ๋Ÿฌ๋‹ ํ™˜๊ฒฝ ๊ตฌ์ถ• : CUDA, CuDNN

๋”ฅ๋Ÿฌ๋‹ ํ™˜๊ฒฝ ๊ตฌ์ถ•, CUDA/CUDNN ์„ค์น˜ ๋” ์ด์ƒ ๊ณ ๋ฏผํ•˜์ง€ ๋ง์ž!

velog.io

 

 

# ํ…์ŠคํŠธ -> ์‚ฌ์ง„ (stabilityai/stable-diffusion-3.5-large)

 

๊ฐ€์ด๋“œ..

https://stabilityai.notion.site/Stable-Diffusion-3-5-Large-Fine-tuning-Tutorial-11a61cdcd1968027a15bdbd7c40be8c6

 

์‹คํŒจ ์ฝ”๋“œ...

# '''
# 5. ์Œ์•…, ๋ช…์–ธ, ๊ทธ๋ฆผ ์ถ”์ฒœ/์ƒ์„ฑ: (๋ชจ๋ธ ๋ฏธ์ •) :
#      (ํ›„๋ณด 1) facebook/musicgen-small 
#      ํ”„๋กฌํ”„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์Œ์•…์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. 
#      ๋Œ€์‹  ์ด๊ฑด ์ €ํฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์ชฝ์—์„œ ํ”„๋กฌํ”„ํ„ฐ๋ฅผ ๋ช‡๊ฐ€์ง€ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ค˜์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”.
# '''


from diffusers import StableDiffusionPipeline
from fastapi import FastAPI, Form
from PIL import Image
import torch
import json
import requests

# Hugging Face API ํ† ํฐ ์„ค์ •
API_TOKEN = "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"
headers = {"Authorization": f"Bearer {API_TOKEN}"}

# Stable Diffusion ๋ชจ๋ธ ๋กœ๋“œ
pipe = StableDiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3.5-large",
    torch_dtype=torch.float16,
    use_auth_token=API_TOKEN  # API ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์ธ์ฆ
)
pipe = pipe.to("cuda")

# FastAPI ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
app = FastAPI()

# ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์—”๋“œํฌ์ธํŠธ
@app.post("/createimage/")
async def create_image(text: str = Form(...)):
    """
    ์ฃผ์–ด์ง„ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    """
    # ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    image = pipe(
        prompt=text,
        num_inference_steps=28,
        guidance_scale=3.5
    ).images[0]

    # ์ด๋ฏธ์ง€ ์ €์žฅ
    image_path = "generated_image.png"
    image.save(image_path)

    return {"image_path": image_path}



# from diffusers import BitsAndBytesConfig, StableDiffusionPipeline
# from fastapi import FastAPI, Form
# from PIL import Image
# import torch
# # from huggingface_hub import login

# # ์—‘์„ธ์Šค ํ† ํฐ
# # Hugging Face ๋กœ๊ทธ์ธ (ํ† ํฐ ํ•„์š”)
# # login("your_hugging_face_access_token")

# # ๋ชจ๋ธ ์„ค์ •
# model_id = "stabilityai/stable-diffusion-3.5-large, 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=access_token"
# nf4_config = BitsAndBytesConfig(
#     load_in_4bit=True,
#     bnb_4bit_quant_type="nf4",
#     bnb_4bit_compute_dtype=torch.bfloat16
# )

# # ๋ชจ๋ธ ๋กœ๋“œ
# pipe = StableDiffusionPipeline.from_pretrained(
#     model_id,
#     torch_dtype=torch.bfloat16,
#     quantization_config=nf4_config
# )
# pipe = pipe.to("cuda")
# pipe.enable_model_cpu_offload()

# # FastAPI ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
# app = FastAPI()


# # ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์—”๋“œํฌ์ธํŠธ
# @app.post("/createimage/")
# async def create_image(text: str = Form(...)):
#     """
#     ์ฃผ์–ด์ง„ ํ…์ŠคํŠธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
#     """
#     # ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
#     image = pipe(
#         prompt=text,
#         num_inference_steps=28,
#         guidance_scale=3.5
#     ).images[0]

#     # ์ด๋ฏธ์ง€ ์ €์žฅ ๊ฒฝ๋กœ
#     image_path = "generated_image.png"
#     image.save(image_path)

#     return {"image_path": image_path}

 

 

# ํ…์ŠคํŠธ -> ์˜ค๋””์˜ค (facebook/musicgen-small)

 

from fastapi import FastAPI, Form
from transformers import pipeline, AutoProcessor, MusicgenForConditionalGeneration
import scipy.io.wavfile
import torch
import tempfile
import os
import torch
# print(torch.cuda.is_available())  # True๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด GPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
# ๋ชจ๋ธ์ด GPU๋กœ ์ด๋™๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

app = FastAPI()

# # MusicGen ๋ชจ๋ธ ์„ค์ •
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", torch_dtype=torch.float32).to("cuda")
print(next(model.parameters()).device)  # "cuda:0"์ด ์ถœ๋ ฅ๋˜๋ฉด GPU์— ๋กœ๋“œ๋œ ๊ฒƒ

# ์Œ์•… ์ƒ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ ํ•จ์ˆ˜
def generate_music(text: str, length: int = 512):
    # ํ…์ŠคํŠธ๋ฅผ ๋ชจ๋ธ์— ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
    inputs = processor(text=[text], padding=True, return_tensors="pt").to("cuda")
    
    # ๋ชจ๋ธ์„ ํ†ตํ•ด ์˜ค๋””์˜ค ๊ฐ’ ์ƒ์„ฑ
    audio_values = model.generate(**inputs, max_new_tokens=length)
    
    # ์ƒ์„ฑ๋œ ์˜ค๋””์˜ค๋ฅผ WAV ํŒŒ์ผ๋กœ ์ž„์‹œ ์ €์žฅ
    sampling_rate = model.config.audio_encoder.sampling_rate
    with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_file:
        scipy.io.wavfile.write(tmp_file.name, rate=sampling_rate, data=audio_values[0, 0].cpu().numpy())
        temp_path = tmp_file.name
    
    return temp_path

# FastAPI ์—”๋“œํฌ์ธํŠธ: ์š”์•ฝ๋œ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•… ์ƒ์„ฑ
@app.post("/recommend_music/")
async def recommend_music(summary_text: str = Form(...), length: int = Form(512)):
    # ์Œ์•… ์ƒ์„ฑ
    music_path = generate_music(summary_text)
    
    # ์ƒ์„ฑ๋œ ์Œ์•… ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฐ˜ํ™˜
    return {"music_path": music_path}

# FastAPI์—์„œ ์ •์  ํŒŒ์ผ๋กœ WAV ํŒŒ์ผ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ • (๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ์šฉ)
@app.get("/download_music/")
async def download_music(music_path: str):
    if os.path.exists(music_path):
        with open(music_path, "rb") as f:
            data = f.read()
        return {"audio_data": data}
    else:
        return {"error": "File not found"}

 

728x90
๋ฐ˜์‘ํ˜•

+ Recent posts