2021-02-08(Mon)

ํ•ญ๋ชฉ

๋‚ด์šฉ

ํ•™์Šต ๋‚ ์งœ

2021-02-08(์›”)

ํ•™์Šต ์‹œ๊ฐ„

11:00~24:00

ํ•™์Šต ๋ฒ”์œ„ ๋ฐ ์ฃผ์ œ

Websocket

ํ•™์Šต ๋ชฉํ‘œ

Appearance ์ฑ„ํŒ…์ฐจ๋‹จ ๋งˆ์ € ๊ตฌํ˜„

๋™๋ฃŒ ํ•™์Šต ๋ฐฉ๋ฒ•

sanam, jujeong๋‹˜๊ณผ ํŽ˜์–ด์ฝ”๋”ฉ์„ ์ง„ํ–‰ํ•จ

์ƒ์„ธ ํ•™์Šต ๋‚ด์šฉ

๋ฌธ์ œ 1)

Backbone Model, Collection์„ ํ†ตํ•ด์„œ(Backbone์— ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ) ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ์„ ์ฃผ๊ณ  ๋ฐ›์•„์•ผํ• ๊นŒ? ์•„๋‹ˆ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•œ Helper ๋‚ด์˜ fetch ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผํ• ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ด๋ฅผ ์žฌ๋Ÿ‰๊ป ์„ ํƒํ–ˆ๋Š”๋ฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์„ ํƒ ๊ธฐ์ค€์ด ํ•„์š”ํ•˜๋‹ค.

๋ฐฐ๊ฒฝ)

  1. ํŠน์ • ์œ ์ €๋ฅผ ์ฑ„ํŒ…์ฐจ๋‹จํ–ˆ์„ ๋•Œ, ์ฆ‰ ์ฑ„ํŒ… ์ฐจ๋‹จ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์™€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ชจ๋‘ ํ•ด๋‹น ์œ ์ €๊ฐ€ current_user์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์—ˆ์Œ์„ ์•Œ์•„์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ๋ฉ”๋‰ด๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ , ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ๋Š” DB๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

  2. ๋ฐฑ์—”๋“œ์—์„œ๋Š” current_user์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์—ˆ์Œ์„ DB์— ์ €์žฅํ•˜๋Š” ์•ก์…˜์„ ์ด๋ฏธ ์ž˜ ๊ตฌํ˜„ํ•ด๋‘” ์ƒํƒœ์ด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ฑ„ํŒ… ์ฐจ๋‹จ์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ  ๋‹ค๋ฅธ ์œ ์ €๋“ค์—๊ฒŒ ์ „ํŒŒํ• ์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค.

  3. ์ฐธ๊ณ ๋กœ ๊ธฐ์กด์—๋Š” ์œ ์ € ์ฐจ๋‹จ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ view์—์„œ ์ด ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•ด์„œ chatBan ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  Helper.fetch๋ฅผ ํ†ตํ•ด์„œ Post ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ๋” ๊ตฌํ˜„ํ•ด๋’€๋‹ค.

ํ•ด๊ฒฐ)

ํ•ด๊ฒฐ์ด๋ผ๊ธฐ๋ณด๋‹จ ๋…ผ์˜ ๋์— ๋งŒ๋“  ํ˜‘์˜์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ชจ๋ธ๊ณผ ์ปฌ๋ ‰์…˜์€ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค. ์ด๋ฅผ ๋ชจ๋ธ๊ณผ ์ปฌ๋ ‰์…˜์„ fetch๋ฉ”์„œ๋“œ๋กœ ๋•ก๊ฒจ์˜ฌ ์ˆ˜๋Š” ์žˆ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์ตœ์‹ ์•ˆ์„ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ

  • ๋ฐ˜๋ฉด ํ”„๋ก ํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ณ€๊ฒฝ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ Helper.fetch๋กœ Post๋ฅผ ๋ณด๋‚ด๊ฒŒ๋” ํ•˜์ž. ์ผ๊ด€๋˜๊ฒŒ.

    ****

๋ฌธ์ œ 2)

๋กœ๊ทธ์ธ๊ณผ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ์ค€์„ ์ •ํ•ด์•ผํ•œ๋‹ค. ์ด์— ๋งž์ถฐ์„œ ๊ตฌํ˜„์„ ๋‹ฌ๋ฆฌํ•ด์•ผํ•œ๋‹ค.

  1. ๋ธŒ๋ผ์šฐ์ €๋‹น ๋กœ๊ทธ์ธ ํ—ˆ์šฉ(๊ธฐ์กด) ๊ธฐ์กด ๊ตฌํ˜„์—์„œ๋Š” ์ฟ ํ‚ค์— encrtyed[:service_id]๋กœ ์ ‘๊ทผํ•˜๋ฉด ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ๋˜์–ด์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ฟ ํ‚ค๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ์ด ์œ ์ €๋ฅผ ๋กœ๊ทธ์•„์›ƒ์‹œํ‚ค๊ณ  ๋กœ๊ทธ์ธ ํƒญ์„ ์—ด์–ด์ฃผ๋Š” ๊น”๋”ํ•œ ๋ฐฉ์‹์ด๋‹ค. ๋ฌธ์ œ๋Š” ํ•œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํƒญ์œผ๋กœ ๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‘๋ฒˆ์งธ ํƒญ์—์„œ ๋กœ๊ทธ์ธํ•  ๊ฒฝ์šฐ ๊ธฐ์กด ์œ ์ €๋ฅผ ๋กœ๊ทธ์•„์›ƒ์‹œ์ผœ๋ฒ„๋ ค์•ผ ํ•œ๋‹ค.

  2. ๋ธŒ๋ผ์šฐ์ € ํƒญ๋‹น ๋กœ๊ทธ์ธ ํ—ˆ์šฉ

    ์ด ๊ฒฝ์šฐ ์ฟ ํ‚ค๋Š” ๋กœ๊ทธ์ธ ๊ณผ์ •์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , persist ์ผ€์ด๋ธ”๋กœ ์—ฐ๊ฒฐํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค์˜ ์„œ๋น„์Šค ์•„์ด๋””๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ดํ›„์— ์ฟ ํ‚ค๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์–ด๋„ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ๋˜์–ด์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜์ž. ์‹œ์ž‘ํ•  ๋•Œ ์ฟ ํ‚ค delete ์š”์ฒญ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

ํ•ด๊ฒฐ)

ํ•ด๊ฒฐ์ด๋ผ๊ธฐ๋ณด๋‹จ ๋…ผ์˜ ๋์— ๋งŒ๋“  ํ˜‘์˜์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ‰๊ฐ€์‹œ ๋™์‹œ์ ‘์†์€ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ด์šฉํ•ด์„œ ํ•˜๋„๋ก ํ•˜์ž. ๋ธŒ๋ผ์šฐ์ € ํƒญ๋‹น ๋กœ๊ทธ์ธ์„ ํ—ˆ์šฉ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด UX์ƒ ๋” ๋‚˜์„ ๊ฒƒ์ด๋‚˜ ์š”๊ตฌ์‚ฌํ•ญ์— ํฌํ•จ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋‹ˆ ์˜ค๋ฒ„๋””๋ฒจ๋กญ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ € ํƒญ๋‹น ๋กœ๊ทธ์ธ์ด ํ—ˆ์šฉ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฏธ๋ค„์„œ ver 1.5์—์„œ ๊ตฌํ˜„ํ•˜์ž.

์˜๋ฌธ 1) import์„ ํ•  ๋•Œ ์™œ ์ž๋™์œผ๋กœ consumer๊ฐ€ ์ƒ์„ฑ๋ ๊นŒ?

import { ConnectAppearanceChannel } from "../channels/appearance_channel";
import consumer from "../channels/consumer";

1๋ฒˆ์€ appearance_channel์— ์žˆ๋Š” ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜์ธ ConnectAppearanceChannel์„ ์ง€์ •ํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

๋ฐ˜๋ฉด 2๋ฒˆ์—์„œ๋Š” ๋”ฑํžˆ ๋ฌด์—‡์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๊ณ  ์ง€์ •ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•œ๋‹ค. ์™œ? 2๋ฒˆ์€ ๋”ฑ ํ•˜๋‚˜๋งŒ ์ค€ ๋‹ค๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. export์— default ์˜ต์…˜์„ ์ฃผ๋ฉด ์ด ํŒŒ์ผ์—์„œ๋Š” ๋”ฑ ํ•˜๋‚˜๋งŒ ๋‚˜๊ฐ„๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค€๋‹ค.

ใ…‡ใ…‹ ๊ทธ๋ž˜์„œ ์™œ consumer๊ฐ€ ์ƒ์„ฑ์ด ๋ฏธ๋ฆฌ ๋˜์–ด์žˆ์„๊นŒ? exportํ•  ๋•Œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด export๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. consumer ํŒŒ์ผ์„ ํ™•์ธํ•ด๋ณด๋ฉด

import { createConsumer } from "@rails/actioncable"
โ€‹
export default createConsumer()

์œ„์ฒ˜๋Ÿผ ๋˜์–ด์žˆ๋‹ค.

# action_cable.js
function createConsumer() {
    var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getConfig("url") || INTERNAL.default_mount_path;
    return new Consumer(url);
  }

๊ทธ๋Ÿผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ import๋ฅผ ํ•ด์˜ฌ ๋•Œ ๋‹ค๋ฅธ consumer๊ฐ€ ์ƒ์„ฑ๋ ๊นŒ? ์•„๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฐ™์€ consumer๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. javascript ํŠน์„ฑ์ƒ importํ•˜๋ฉฐ ๋”ฑ ํ•œ๋ฒˆ ํ‰๊ฐ€๋˜๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฐธ๊ณ 

Rails & javascript ํ…Œํฌ๋‹‰ ํ•œํ† ๋ง‰

first_or_create

private
  def find_or_create_ladder_match_for(user)
    match = Match.where(matchtype: "ladder", status: "pending").first_or_create
    side = match.users.count == 0 ? "left" : "right"
    card = Scorecard.create(user_id: user.id, match_id: match.id, side: side)
    match.update(status: "progress") if match.reload.users.count == 2
    match
  end

์ฐธ๊ณ 

includes

join_table ์‚ฌ์šฉ์‹œ includes๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ตœ์ดˆ DB ์ ‘๊ทผ์‹œ ์—ฐ๊ด€ ํ…Œ์ด๋ธ”๋„ ํ•จ๊ป˜ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋•๋ถ„์— ์ ‘๊ทผ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  def show
โ€‹
    id = params[:id]
    if (params[:for] == "profile")
      user = User.includes(:in_guild, :score_cards, :tournament_memberships).find(id)
      render :json => { user: user.profile }
    else
      user = User.includes(:in_guild).find(id)
      render :json => { user: user.to_simple }
  end

User table์—์„œ ๋žญํ‚น์„ ๋งค๊ธธ ๋•Œ

stat[:rank] = User.order(point: :desc).index(self) + 1

model์—์„œ scope

scope๋ฅผ ์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด user.rb model์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ •์˜

scope :for_ladder_index, -> (page) { order(point: :desc).page(page.to_i).map { |user| user.profile } }
โ€‹
# ์ดํ›„์— users = User.for_ladder_index(params[:page]) ์ด๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ ์“ด๋‹ค.

Safe Navigation Operator

์ฐธ์กฐํ•˜๋Š” object๊ฐ€ nil์ธ์ง€ ํ™•์ธํ•˜๋ฉฐ ๋™์ž‘ํ•œ๋‹ค.

def enemy
    self.playing_game&.users&.where&.not(id: self.id)
end

์ฐธ๊ณ 

ํŠน์ • DOM ์š”์†Œ ์•ˆ์— ์–ด๋–ค ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ...

...๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

return $("#main-view-container").has(view_name).length > 0;

ํ•™์Šต ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ์ดํ‰

Appearance View๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ์ง€๋งŒ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค ๋•Œ ๋„์›€์ด ๋  ๋ฒ•ํ•œ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋งŽ์ดํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค ๋•Œ ์‹œ๊ฐ„์„ ๋งŽ์ด ์ค„์—ฌ์ฃผ๊ฒ ์ง€.

๋‹ค์Œ ํ•™์Šต ๊ณ„ํš

  • Appearance view ๊ตฌํ˜„์™„๋ฃŒ

Last updated