Skip to content

we make your Artweek. we find your Inspiration. ๐Ÿ’ซ

Notifications You must be signed in to change notification settings

makeartweek/bixby

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

20 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์•„ํŠธ์œ„ํฌ ARTWEEK

Artweeklogo

"Artweek์™€ ํ•จ๊ป˜ํ•˜๋Š” ์˜ˆ์ˆ ์ ์ธ ์ผ์ฃผ์ผ"

๋ชฉ์ฐจ

  1. ์•„ํŠธ์œ„ํฌ๋ž€?

  2. ์บก์Š๊ตฌ์กฐ

  3. ์บก์Š์„ค์ •

  4. ์‚ฌ์ „(Vocabulary)

  5. ๋ฐœํ™”(Training)

  6. UI&UX(Layout)

  7. ๊ตฌ๋งคํŽ˜์ด์ง€

  8. Heroku ์„œ๋ฒ„์™€ Django orm

  9. AWS ์„œ๋ฒ„์™€ ์™ธ๋ถ€ DB

  10. HTTP ์š”์ฒญ

  11. on Marketplace!

  12. ๋ถ€๋ก

    โ€‹

์•„ํŠธ์œ„ํฌ๋ž€?

Artweek ํŒ€์€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜คํ”„๋ผ์ธ ๋ฌธํ™”์ƒํ™œ์„ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ์˜๊ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์•„ํŠธ์œ„ํฌ ์บก์Š์€ ์˜คํ”„๋ผ์ธ ๋ฌธํ™”์ƒํ™œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž ๋Œ€์‹  ์ฐพ์•„์ค๋‹ˆ๋‹ค. ์ด์šฉ ์ค‘ ๋ฌธ์˜์‚ฌํ•ญ์ด ์žˆ์œผ์‹  ๊ฒฝ์šฐ e-mail๋กœ ์—ฐ๋ฝ๋ฐ”๋ž๋‹ˆ๋‹ค.

makeartweek@gmail.com

์บก์Š๊ตฌ์กฐ

models

ํŒŒ์ผ๊ตฌ์กฐ

โ”œโ”€โ”€ actions
โ”‚   โ”œโ”€โ”€ GetCurrentPosition.model.bxb
โ”‚   โ”œโ”€โ”€ SearchByLocation.model.bxb
โ”‚   โ””โ”€โ”€ SearchEvent.model.bxb
โ””โ”€โ”€ concepts
   โ”œโ”€โ”€ Primitive
   โ”‚   โ”œโ”€โ”€ Event
   โ”‚   โ”‚   โ”œโ”€โ”€ Concert.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Director.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ EventID.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ EventStatus.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Exhibition.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Fee.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Images.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ ImgUrl.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Musical.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Performer.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Theater.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ TimeTable.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Title.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Type.model.bxb
   โ”‚   โ”‚   โ””โ”€โ”€ TypicalAgeRange.model.bxb
   โ”‚   โ”œโ”€โ”€ Place
   โ”‚   โ”‚   โ”œโ”€โ”€ Address.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ District.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Location.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ LocationID.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ Near.model.bxb
   โ”‚   โ”‚   โ””โ”€โ”€ Nearby.model.bxb
   โ”‚   โ”œโ”€โ”€ Signal
   โ”‚   โ”‚   โ”œโ”€โ”€ DirectorPostposition.model.bxb
   โ”‚   โ”‚   โ”œโ”€โ”€ PerformerPostposition.model.bxb
   โ”‚   โ”‚   โ””โ”€โ”€ SearchKeyword.model.bxb
   โ”‚   โ””โ”€โ”€ Time
   โ”‚       โ”œโ”€โ”€ CreatedAt.model.bxb
   โ”‚       โ”œโ”€โ”€ EndDate.model.bxb
   โ”‚       โ”œโ”€โ”€ Recent.model.bxb
   โ”‚       โ””โ”€โ”€ StartDate.model.bxb
   โ””โ”€โ”€ Structure
       โ”œโ”€โ”€ InfoSearchState.model.bxb
       โ”œโ”€โ”€ MyPositionList.model.bxb
       โ”œโ”€โ”€ Mypos.model.bxb
       โ”œโ”€โ”€ NearSearchState.model.bxb
       โ””โ”€โ”€ Point.model.bxb

๋ชจ๋ธ์€ ํฌ๊ฒŒ actions ์™€ concepts ๋‘ ํด๋”๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

actions

action์—์„œ๋Š” ์บก์Š์ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋™์ž‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Business Logic์—์„œ ๊ตฌ์ฒด์ ์ธ ์ž‘์—…์„ ์‹ค์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. actionsํด๋”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • GetCurrentPosition : ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์œ„๋„, ๊ฒฝ๋„๋กœ ํ‘œ๊ธฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” action.
  • SearchByLocation : ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ์ธ์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•  ๋•Œ ์ด๋ฅผ ์ฐพ์•„์ฃผ๋Š” action.
  • SearchEvent : ๋ฐœํ™”๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋ฐ›์€ ๋‹จ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ํ•ฉํ•œ ๋ฌธํ™”์ƒํ™œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” action.

concepts

concept์€ ์ธ์‹๋œ ๋ฐœํ™” ๋ฐ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋‹ด๊ธธ ๋ณ€์ˆ˜์˜ ํŠน์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. conceptsํด๋”๋Š” Primitive์™€ Structure ๋‘ ํด๋”๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Primitiveํด๋”์—๋Š” Event, Place, Time, signal๋“ฑ concept์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์„ธ๋ถ€์ ์ธ ํด๋”๋ฅผ ์ƒ์„ฑํ•ด ๊ตฌ๋ถ„ํ•จ์œผ๋กœ์จ ํšจ์œจ์ ์œผ๋กœ ๋ชจ๋ธ๋ง์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Structure๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Primitive๊ฐ€ ๋ชจ์ธ ๊ตฌ์กฐ์ฒด๋กœ, ์ฃผ๋กœ Business Logic์—์„œ ์‚ฐ์ถœ๋œ ๊ฒฐ๊ณผ๋ฌผ๋“ค์ด ๋‹ด๊ธฐ๊ฒŒ ๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๋Š” concept์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

resources

ํŒŒ์ผ๊ตฌ์กฐ

โ”œโ”€โ”€ base
โ”‚   โ”œโ”€โ”€ capsule.properties
โ”‚   โ”œโ”€โ”€ endpoints.bxb
โ”‚   โ”œโ”€โ”€ layouts
โ”‚   โ”‚   โ””โ”€โ”€ macros
โ”‚   โ”‚       โ”œโ”€โ”€ EventOneImage.layout.bxb
โ”‚   โ”‚       โ”œโ”€โ”€ EventSummary.layout.bxb
โ”‚   โ”‚       โ”œโ”€โ”€ LocDetail.layout.bxb
โ”‚   โ”‚       โ””โ”€โ”€ LocEvent.layout.bxb
โ”‚   โ””โ”€โ”€ views
โ”‚       โ”œโ”€โ”€ InfoSearchState.view.bxb
โ”‚       โ””โ”€โ”€ NearSearchState.view.bxb
โ””โ”€โ”€ ko-KR
   โ”œโ”€โ”€ artweek.hints.bxb
   โ”œโ”€โ”€ capsule-info.bxb
   โ”œโ”€โ”€ dialogs
   โ”‚   โ”œโ”€โ”€ NearSearchResult.dialog.bxb
   โ”‚   โ””โ”€โ”€ Result.dialog.bxb
   โ””โ”€โ”€ vocab
       โ”œโ”€โ”€ Concert.vocab.bxb
       โ”œโ”€โ”€ DirectorPostposition.vocab.bxb
       โ”œโ”€โ”€ District.vocab.bxb
       โ”œโ”€โ”€ Exhibition.vocab.bxb
       โ”œโ”€โ”€ Musical.vocab.bxb
       โ”œโ”€โ”€ Nearby.vocab.bxb
       โ”œโ”€โ”€ PerformerPostposition.vocab.bxb
       โ”œโ”€โ”€ Recent.vocab.bxb
       โ”œโ”€โ”€ SearchKeyword.vocab.bxb
       โ”œโ”€โ”€ Theater.vocab.bxb
       โ””โ”€โ”€ Type.vocab.bxb

์บก์Š์„ค์ •

์•„ํŠธ์œ„ํฌ ์บก์Š์˜ ๋Œ€ํ‘œ๋ฐœํ™”๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด hints ํŒŒ์ผ์— ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์˜๋„์— ๋งž๊ฒŒ ๋Œ€ํ‘œ ๋ฐœํ™”๋ฅผ ๋‹ค์–‘ํ™”ํ•˜์—ฌ ์›ํ•˜๋Š” ์˜คํ”„๋ผ์ธ ๋ฌธํ™”์ƒํ™œ ์ •๋ณด๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

hints {
 uncategorized {
   hint (์•„ํŠธ์œ„ํฌ์—์„œ, ๊ฐ•๋‚จ์—ญ์—์„œ ๊ฐ€๊นŒ์šด ์ „์‹œ ๋ณด์—ฌ์ค˜) {
    preferred-hint (๊ฐ•๋‚จ์—ญ์—์„œ ๊ฐ€๊นŒ์šด ์ „์‹œ ๋ณด์—ฌ์ค˜)
   }
   hint (์•„ํŠธ์œ„ํฌ์—์„œ, ์•„์ด์œ  ์ฝ˜์„œํŠธ ์ •๋ณด ์ข€ ์ฐพ์•„์ค˜) {
     preferred-hint (์•„์ด์œ  ์ฝ˜์„œํŠธ ์ •๋ณด ์ข€ ์ฐพ์•„์ค˜)
   }
   hint (์•„ํŠธ์œ„ํฌ์—์„œ, 10์›”์— ํ•˜๋Š” ์ „์‹œํšŒ ์ •๋ณด ์•Œ๋ ค์ค˜){
     preferred-hint (10์›”์— ํ•˜๋Š” ์ „์‹œํšŒ ์ •๋ณด ์•Œ๋ ค์ค˜)
   }
	...
 }
}

์‚ฌ์ „(Vocabulary)

์•„ํŠธ์œ„ํฌ ์บก์Š์ด ๋‹ค์–‘ํ•œ ํŒจํ„ด์˜ ๋ฐœํ™”๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ property์— ๋Œ€ํ•œ vocab ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ vocab์˜ ๋Œ€ํ‘œ์–ด์— ๋Œ€ํ•ด์„œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋™์˜์–ด๋ฅผ ๊ตฌ์ถ•ํ•จ์œผ๋กœ์จ ๋‹ค์–‘ํ•œ ๋ฐœํ™”์— ์ ์ ˆํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•™์Šต์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ์ „์˜ ์‚ฌ์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ enum, name, text ์„ธ ๊ฐ€์ง€ ํƒ€์ž…์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋น…์Šค๋น„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์˜๋„๋ฅผ ์ž˜ ์•Œ์•„๋“ค์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

enum

vocab ์ค‘์— District์˜ ๊ฒฝ์šฐ enum์„ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ์ง€์—ญ์€ ๋ช…์นญ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์ ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์–ด์ธ ์ง€์—ญ์— ํ•ด๋‹นํ•˜๋Š” ์œ ์˜์–ด์™€ ๋”๋ถˆ์–ด ๋žœ๋“œ๋งˆํฌ ๋ฐ ์ง€ํ•˜์ฒ  ์—ญ๋ช…์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋ฐœํ™”์— ๋Œ€ํ•ด ์ •ํ•ด์ง„ ๋Œ€ํ‘œ์–ด๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์œ„์น˜ ์ฃผ์†Œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

vocab (District){

  "๊ฐ•๋‚จ๊ตฌ" {

    "๊ฐ•๋‚จ๊ตฌ",
    "๊ฐ•๋‚จ",
    "๊ฐ•๋‚จ์—ญ",
    "์—ญ์‚ผ์—ญ",
    "์ฝ”์—‘์Šค",
  }
   ...
}

name

SearchKeyword์˜ ๊ฒฝ์šฐ name ์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์— ๋”ฐ๋ผ ๊ฐ€์žฅ ๋‹ค์–‘ํ•˜๊ฒŒ ๋ฐœํ™”๊ฐ€ ๋  ๋™์‚ฌ๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด ๊ฒ€์ƒ‰์ด๋ผ๋Š” ์˜๋„๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋น„์Šทํ•œ ๋™์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋‹ค์–‘ํ•œ ๋ฐœํ™”์— ๋Œ€ํ•œ ํŒจํ„ดํ•™์Šต์„ ํ†ตํ•ด ์ดํ›„ vocab ์— ๋“ค์–ด์žˆ์ง€ ์•Š๋”๋ผ๋„ ์ž๋™์œผ๋กœ SearchKeyword ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

vocab(SearchKeyword) {
  // ๋ณดํŽธ์ ์ธ ๊ฒ€์ƒ‰ํ‚ค์›Œ๋“œ  
  "๊ฒ€์ƒ‰",
  "๊ฒ€์ƒ‰ํ•ด",
  "๊ฒ€์ƒ‰ํ•ด์ค˜",
  "๊ฒ€์ƒ‰ํ•ด๋ผ",
  "๊ฒ€์ƒ‰ํ•ด์ฃผ์„ธ์š”",
  "๊ฒ€์ƒ‰ํ•ด์ค˜์š”",
  "๊ฒ€์ƒ‰์ข€",
}

๋ฐœํ™”(Training)

์‚ฌ์šฉ์ž ํ˜„์žฌ ์œ„์น˜ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "๊ทผ์ฒ˜์—์„œ ํ•˜๋Š” ์—ฐ๊ทน ์•Œ๋ ค์ค˜ ."

์ •๋ณด ์ œ๊ณต: ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜ ๊ธฐ์ค€ ๋ฐ˜๊ฒฝ 5ํ‚ค๋กœ ๋‚ด์—์„œ ์—ด๋ฆฌ๋Š” ์—ฐ๊ทน ์ •๋ณด ์ œ๊ณต

ํŠน์ • ์žฅ์†Œ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "๊ฐ•๋‚จ์—ญ/๊ฐ•๋‚จ ๊ทผ์ฒ˜์—์„œ ํ•˜๋Š” ์ฝ˜์„œํŠธ ์•Œ๋ ค์ค˜."

์ •๋ณด ์ œ๊ณต: ๊ฐ•๋‚จ๊ตฌ ์†Œ์žฌ์ง€์˜ ๊ณต์—ฐ์žฅ์—์„œ ํ•˜๋Š” ์ฝ˜์„œํŠธ ์ •๋ณด ์ œ๊ณต

ํŠน์ • ์ผ์ •์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "์ด๋ฒˆ ์ฃผ/์ด๋ฒˆ ๋‹ฌ/์˜ค๋Š˜ ํ•˜๋Š” ๋ฎค์ง€์ปฌ ์•Œ๋ ค์ค˜."

์ •๋ณด ์ œ๊ณต: ํŠน์ • ์ผ์ •์— ์ƒ์—ฐ๋˜๋Š” ๋ฎค์ง€์ปฌ ์ •๋ณด ์ œ๊ณต

ํŠน์ • ํƒ€์ž…์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "์ฝ˜์„œํŠธ/์—ฐ๊ทน/๋ฎค์ง€์ปฌ/์ „์‹œ ์•Œ๋ ค์ค˜."

์ •๋ณด ์ œ๊ณต: ํŠน์ • ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ์ •๋ณด ์ œ๊ณต

ํ–‰์‚ฌ ์ œ๋ชฉ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "ํ—ค๋“œ์œ… ๋ฎค์ง€์ปฌ ์ •๋ณด ์•Œ๋ ค์ค˜."

์ •๋ณด ์ œ๊ณต: ํ–‰์‚ฌ ์ œ๋ชฉ์— ํ•ด๋‹นํ•˜๋Š” ์ •๋ณด ์ œ๊ณต

์ถœ์—ฐ์ง„ ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "์–‘ํฌ์ฒ ์ด ๋…ธ๋ž˜ ๋ถ€๋ฅด๋Š” ์ฝ˜์„œํŠธ ์•Œ๋ ค์ค˜."

์ •๋ณด ์ œ๊ณต: ์–‘ํฌ์ฒ  ์ด ์ถœ์—ฐํ•˜๋Š” ์ฝ˜์„œํŠธ์— ๋Œ€ํ•œ ์ •๋ณด ์ œ๊ณต

์ œ์ž‘์ง„ ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์งˆ์˜: "์ด์ธ๋™์ด ์ œ์ž‘ํ•œ ์—ฐ๊ทน ์•Œ๋ ค์ค˜."

์ •๋ณด ์ œ๊ณต: ์ด์ธ๋™ ์ด ์ œ์ž‘ํ•œ ์—ฐ๊ทน์˜ ์ •๋ณด ์ œ๊ณต

UI&UX(Layout)

๋น…์Šค๋น„์— ์ด๋ฏธ ๊ตฌํ˜„๋œ template๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง์ ‘์ ์œผ๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ๋  ํ™”๋ฉด์ธ view๋ฅผ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

Layout์€ view์™€ view์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ macro๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

View

view๋Š” InfoSearchState ์™€ NearsearchState ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Macro

view์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด์„œ macro๋กœ EventOneImage, EventSummary, LocDetail, LocEvent ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

UIUXview

2๊ฐœ ์ด์ƒ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ๋•Œ๋Š” EventSummary ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ์„ธ์ •๋ณด๋ฅผ ์›ํ•  ๋•Œ๋Š” EventOneImage ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ๋•Œ๋Š” EventOneImage ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ view๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ƒ์„ธ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋งคํŽ˜์ด์ง€

์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•˜์—ฌ ๋ฉœ๋ก , ์˜ˆ์Šค24, ์ธํ„ฐํŒŒํฌ ๋“ฑ์˜ ํ‹ฐ์ผ“ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์ƒ์„ธํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๋งคํŽ˜์ด์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Heroku ์„œ๋ฒ„์™€ Django orm (ver 1.2.6.)

์•„ํŠธ์œ„ํฌํŒ€์€ AWS ์„œ๋ฒ„์—์„œ Heroku ์„œ๋ฒ„๋กœ ์ด๋™ํ•˜๋ฉฐ ์„œ๋ฒ„ ๋น„์šฉ์„ ํ•ด์†Œํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, django orm์„ ์ด์šฉํ•˜์—ฌ DB๋ชจ๋ธ ๊ตฌ์ถ• ๊ทธ๋ฆฌ๊ณ  REST API ๋˜ํ•œ ๊ตฌ์ถ•ํ•˜์—ฌ ์–ธ์ œ ์–ด๋””์„œ๋“  API์‹คํ–‰์œผ๋กœ ์‹ค์‹œ๊ฐ„ DB ๊ฐฑ์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

AWS ์„œ๋ฒ„์™€ ์™ธ๋ถ€ DB (ver 1.2.5.)

Flow

flowDiagram

์™ธ๋ถ€ DB

๋น…์Šค๋น„ ์ŠคํŠœ๋””์˜ค์—๋Š” ๋‚ด๋ถ€ DB๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„ํŠธ์œ„ํฌ ํŒ€์€ AWS Server๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ DB๋ฅผ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ์˜คํ”ˆ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Business logic์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ–ˆ์ง€๋งŒ ์•„ํŠธ์œ„ํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋Š” ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์˜คํ”„๋ผ์ธ ๋ฌธํ™”์ƒํ™œ(์—ฐ๊ทน, ๋ฎค์ง€์ปฌ, ์ „์‹œ, ์˜คํŽ˜๋ผ, ํด๋ž˜์‹, ์ฝ˜์„œํŠธ) ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ ์ž ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ์˜คํ”ˆ API์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ input value์— ๋”ฐ๋ผ ๊ณต์—ฐ ์ข…๋ฅ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ API๋ฅผ ์„ ํƒํ•ด ์ •๋ณด๋ฅผ ๊ตฌํ•ด์˜ค๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์›ํ•˜๋Š” ๋ชจ๋“  ๊ณต์—ฐ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์™ธ๋ถ€ DB์— ์ €์žฅํ•˜์—ฌ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

AWS server

AWS RDS, Mysql์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ DB ๊ด€๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ๋†’์˜€๊ณ ,

AWS์—์„œ ์ œ๊ณตํ•˜๋Š” API Gateway์™€ Lambda ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ DB์—์„œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํŠธ์œ„ํฌ๋งŒ์˜ API๋ฅผ ์ œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

DB ์ตœ์ ํ™”

ERD

์•„ํŠธ์œ„ํฌ์˜ DB๋Š” ์ƒ๊ธฐ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด 1:N์˜ ๊ด€๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, 6๊ฐœ์˜ Event type๊ณผ ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” 1๊ฐœ์˜ Main location์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ณต์—ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ Table์„ ๋‚˜๋ˆ„์–ด์„œ ์›ํ•˜๋Š” ์ข…๋ฅ˜์˜ ๊ณต์—ฐ์ด ์•„๋‹Œ ํƒ€ ์ข…๋ฅ˜์˜ ๊ณต์—ฐ์€ ๊ฒ€์ƒ‰๋Œ€์ƒ์—์„œ ์ œ์™ธํ•จ์œผ๋กœ์จ ๊ฒ€์ƒ‰์†๋„๊ฐ€ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

HTTP ์š”์ฒญ

์™ธ๋ถ€ DB์—์„œ ๋น…์Šค๋น„ ์ŠคํŠœ๋””์˜ค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„ํŠธ์œ„ํฌ์˜ API์— http ์š”์ฒญ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ๋น…์Šค๋น„์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” JavaScript API Reference ์ค‘ config์™€ http๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

config๋Š” capsule.properties๋‚˜ Config & Secrets์™€ ๊ฐ™์€ ์บก์Š์˜ configuration์— ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

## capsule.properties

config.default.remote.url=#๊ธฐ๋ณธ URL

๋‹ค์Œ๊ณผ ๊ฐ™์ด capsule.properties์˜ config.default.remote.url ๋ณ€์ˆ˜์— ๊ธฐ๋ณธ url์„ ์ €์žฅํ•ด๋†“์Šต๋‹ˆ๋‹ค. js์ฝ”๋“œ ์ž‘์„ฑ ์‹œ config.get() ํ•จ์ˆ˜์˜ ์ธ์ž์— "remote.url"์„ ํ• ๋‹นํ•จ์œผ๋กœ์จ ์ด๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, http ์š”์ฒญ์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋ฐ›์€ ๊ฒ€์ƒ‰ ์ •๋ณด๋ฅผ remote.url์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  let options = {
    query: {
      title: title,
      performer: performer,
      ... ,
      location: location,
    },
    format: "json"
  };

  console.log(options)
  var db = http.getUrl(config.get("remote.url"), options);

์ด์ฒ˜๋Ÿผ Business Logic์—์„œ ์ •์ œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ object ํƒ€์ž…์˜ ์ฟผ๋ฆฌ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ http์˜ getUrl() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด API์—์„œ json ํฌ๋งท์˜ ๋ฐ์ดํ„ฐ๋ฅผ get ์š”์ฒญ์œผ๋กœ ํ˜ธ์ถœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โญ On Marketplace!

๋น…์Šค๋น„ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ์•„ํŠธ์œ„ํฌ๋ฅผ ๋งŒ๋‚˜๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

07_released

๋ถ€๋ก

  • ๊ฐœ๋ฐœ์ž ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

    On-device-testing-ko-kr

  • ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ

    privacy-policy

  • ์‚ผ์„ฑ์ „์ž ๋ฌด์„ ์‚ฌ์—…๋ถ€

image-20191220102938725

Artweeklogo2

"from Artweek import inspiration"