2021-01-01(Fri)

ํ•ญ๋ชฉ

๋‚ด์šฉ

ํ•™์Šต ๋‚ ์งœ

2021-01-01(๊ธˆ)

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

09:00~22:00

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

๋ฃจ๋น„์˜จ๋ ˆ์ผ์ฆˆ ์ปจํŠธ๋กค๋Ÿฌ

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

ํผํŽ™ํŠธ ๋ฃจ๋น„์˜จ๋ ˆ์ผ์ฆˆ ์ปจํŠธ๋กค๋Ÿฌ ์ฑ•ํ„ฐ๋ฅผ ๋…ํŒŒํ•œ๋‹ค.

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

eunhkim, sanam, yohlee, jujeong๋‹˜๊ณผ ์›๊ฒฉํšŒ์˜๋กœ ๊ถ๊ธˆํ•œ ์ ์„ ๋‚˜๋ˆ”

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

์ฑ…์„ ํ›‘์œผ๋ฉฐ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ๊ฐœ๋ฐœ

์š”์ฒญ ์ •๋ณด ์ถ”์ถœ - params ๋ฉ”์„œ๋“œ

ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „๋‹ฌ๋œ ์š”์ฒญ ์ •๋ณด์— params[:<๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„>]์˜ ํ˜•์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

params ๋ฉ”์„œ๋“œ์—์„œ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ ์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ข…๋ฅ˜

์„ค๋ช…

ํฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ

<form method="POST">๋กœ ์ •์˜๋œ ์ž…๋ ฅ ์–‘์‹์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’

์ฟผ๋ฆฌ ์ •๋ณด

URL ๋์— "?"์ด ๋ถ™๊ณ , "<ํ‚ค ๊ฐ’>=<๊ฐ’>&.."ํ˜•์‹์œผ๋กœ ์ง€์ •๋œ ์ •๋ณด

๋ผ์šฐํŠธ ๋งค๊ฐœ ๋ณ€์ˆ˜

๋ผ์šฐํŠธ์—์„œ ์ •์˜ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜("/books/1"์—์„œ "1" ๋ถ€๋ถ„)

params ๋ฉ”์„œ๋“œ๋กœ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‚ค ์ด๋ฆ„์˜ ๋’ค์— ๋ฅผ ๋ถ™์—ฌ์ค˜์•ผํ•œ๋‹ค.

~/ctrl/para_array?category[]=rails&category[]=ruby

๋Œ€๋Ÿ‰ ํ• ๋‹น ์ทจ์•ฝ์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

๋Œ€๋Ÿ‰ ํ• ๋‹น(Mass Assignment)๋Š” ์•กํ‹ฐ๋ธŒ ๋ ˆ์ฝ”๋“œ์— ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ชจ๋ธ์˜ ํ•„๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋งŒ์•ฝ ์•„๋ž˜์ฒ˜๋Ÿผ new, update_attributes ๋“ฑ์˜ ๋ฉ”์„œ๋“œ์— "<ํ•„๋“œ ์ด๋ฆ„>: <๊ฐ’>" ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ ํ•ด์‹œ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์“ด๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

@book = Book.new(params[:book])
@book = Book.find(params[:id])
@book.update_attributes(params[:book])

์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ ์˜๋„์™€ ๋‹ฌ๋ฆฌ params์— role ๋“ฑ์˜ ๊ถŒํ•œ๊ณผ ๊ด€๋ จ๋œ ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ•ด์‹œ๊ฐ€ ํฌํ•จ๋˜๋ฉด ๋ณด์•ˆ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์†Œ์ง€๊ฐ€ ํฌ๋‹ค. ์ด๋ฅผ ๋Œ€๋Ÿ‰ ํ• ๋‹น ์ทจ์•ฝ์„ฑ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Rails๋Š” ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด StrongParameters๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

StrongParameters

StrongParameters๋Š” ๋Œ€๋Ÿ‰ ํ• ๋‹น ์ทจ์•ฝ์„ฑ์— ๋Œ€ํ•œ ํ™”์ดํŠธ ๋ฆฌ์ŠคํŠธ ๋Œ€์ฑ… ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•„๋“œ ๊ฐ’์„ ์ผ๊ด„ ์„ค์ •ํ•˜๊ธฐ ์ „์— ์„ค์ •ํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž…๋ ฅํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

์Šค์บํด๋”ฉ์œผ๋กœ ์•ฑ์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ์ปจํŠธ๋กค๋Ÿฌ์— ํฌํ•จ๋˜๋Š” params.require(model).permit(attr, ..) ์ด StrongParameters์ด๋‹ค.

def book_params
  params.require(:book).permit(:isbn, :title, :price, :publish, "cd")
end

์š”์ฒญ์˜ ๋‹ค์–‘ํ•œ ์ •๋ณด ์ถ”์ถœ

ํ•œํŽธ headers ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์ฒญ์— ํฌํ•จ๋œ ํ—ค๋”๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

def req_head
  render text: request.headers['User-Agent']
end

์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ถ”์ถ”ํ•  ๋–„๋„ params ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ params ๋ฉ”์„œ๋“œ๋Š” ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ๊ฐ์ฒด๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

1) ํŒŒ์ผ ์‹œ์Šคํ…œ์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์‹œ

ํผ์— multipart ์˜ต์…˜์„ ์ง€์ •ํ•ด์„œ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์ž. ๊ทธ ๋’ค ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

def upload_process
  file = params[:upfile]
  name = file.original_filename
  perms = ['.jpg', 'jpeg', '.gif', '.png'] # ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ™•์žฅ์ž ์ •์˜
  if !perms.include?(File.extname(name).downcase)
    result = '์ด๋ฏธ์ง€ ํŒŒ์ผ๋งŒ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”!'
  elif file.size > 1.megabyte
    result = '1MB ์ดํ•˜์˜ ํŒŒ์ผ๋งŒ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”!'
  else
    File.open("public/docs/#{name}", 'wb') { |f| f.write(file.read) }
    result = "#{name.toutf8}๋ฅผ ์—…๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค."
  end
    render text: result
end

2) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์‹œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์žฅ๋‹จ์ ์„ ๋”ฐ์ ธ์•ผํ•œ๋‹ค.

  • ์žฅ์ : ํŒŒ์ผ ์ ‘๊ทผ ์ œ์•ฝ์„ ๊ฑธ ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ๊ฑธ๋ ค๋ฉด ๋ฒˆ๊ฑฐ๋กœ์›€.)

  • ๋‹จ์ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ™”๋œ๋‹ค.

์‘๋‹ต

์•ก์…˜์—์„œ์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ์žˆ๋‹ค. ํŽธ์˜์ƒ ์‘๋‹ต ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ๋ฉ”๋ชจํ•˜์ž.

๋ฉ”์„œ๋“œ

์„ค๋ช…

render

ํ…œํ”Œ๋ฆฟ ํ˜ธ์ถœ ๋˜๋Š” ๊ธ€์ž/์Šคํฌ๋ฆฝํŠธ ์ถœ๋ ฅ ๋“ฑ, ๋ฒ”์šฉ์ ์ธ ์ถœ๋ ฅ

redirect_to

์ง€์ •๋œ ์ฃผ์†Œ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

send_file

์ง€์ •๋œ ํŒŒ์ผ์„ ์ถœ๋ ฅ

send_data

์ง€์ •๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ

render ๋ฉ”์„œ๋“œ

์•ก์…˜์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์‘๋‹ต ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ render ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

render ๋ฉ”์„œ๋“œ๋Š” ํ…œํ”Œ๋ฆฟ์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์‘๋‹ต์„ ์ธ๋ผ์ธ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ MVC ๊ด€์ ์—์„œ ์–ด๊ธ‹๋‚˜๋‹ˆ ์ฃผ์˜ํ•˜์ž. ๋””๋ฒ„๊ทธ์šฉ์œผ๋กœ๋งŒ ์“ธ ๊ฒƒ.

! ๋ทฐ์— yield ๊ตฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”๋ฐ render๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์ž.

! render๋ฅผ head ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์‘๋‹ต ์ƒํƒœ๊ฐ’์„ ๋ฐ›๋Š” ์šฉ๋„๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

redirect_to ๋ฉ”์„œ๋“œ

redirect_to ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •๋œ ํŽ˜์ด์ง€๋กœ์ฒ˜๋ฆฌ๋ฅผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์‹œํ‚จ๋‹ค.

reirect_to url [, status=302]
โ€‹
# urls: ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋Œ€์ƒ URL
# status: ์ƒํƒœ ์ฝ”๋“œ(์ˆซ์ž ๋˜๋Š” ์‹ฌ๋ณผ)

๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” url์€ ๋ฌธ์ž์—ด ๋˜๋Š” ํ•ด์‹œ ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

redirect_to 'http://www.wings.msn.to'           #์ ˆ๋Œ€ ๊ฒฝ๋กœ
redirect_to action: :index                      #๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์•ก์…˜
redirect_to controller: :hello, action: :list   #๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์•ก์…˜
redirect_to books_path                          #์ž๋™ ์ƒ์„ฑ๋œ ๋ทฐ ํ—ฌํผ
redirect_to :back                               #์ด์ „ ํŽ˜์ด์ง€

send_file ๋ฉ”์„œ๋“œ

์ง€์ •ํ•œ ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ฝ์–ด ๋“ค์—ฌ ๊ทธ ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•œ๋‹ค.

send_file path [, opts]
# path: ์ฝ์–ด ๋“ค์ผ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
# opts: ๋™์ž‘ ์˜ต์…˜

! ์š”์ฒญ ์ •๋ณด๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„ ๋‚ด๋ถ€์˜ ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๊ฒŒ๋˜๋ฏ€๋กœ ๊ต‰์žฅํžˆ ์œ„ํ—˜ํ•˜๋‹ค. ์•„๋ž˜ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ํ”ผํ•˜์ž.

send_file params[:path]

send_data ๋ฉ”์„œ๋“œ

๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ณ  ์‘๋‹ตํ•œ๋‹ค.

send_data data [,opts]
# data: ํŒŒ์ผ ๊ฒฝ๋กœ
# opts: ๋™์ž‘ ์˜ต์…˜

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž๋ฃŒํ˜•์„ ์ถ”์ถœํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•˜๋Š” ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ฝ˜ํ…์ธ  ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ(ctype ํ•„๋“œ)๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜ type์—, ๋ฐ”์ด๋„ˆ๋ฆฌ ํ•„๋“œ๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜ data์— ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

logger ๊ฐ์ฒด

logger ๊ฐ์ฒด๋Š” ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Rails๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. ๋กœ๊ทธ์˜ ์ค‘์š”๋„์— ๋”ฐ๋ผ 6๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์•„๋ž˜๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ˆœ์—์„œ ๋‚ฎ์€ ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•œ ๋ฉ”์„œ๋“œ.

  1. unknown(msg): ์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜

  2. fatal(msg): ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜

  3. error(msg): ์˜ค๋ฅ˜

  4. warn(msg): ๊ฒฝ๊ณ 

  5. info(msg): ์ •๋ณด

  6. debug(msg): ๋””๋ฒ„๊ทธ ์ •๋ณด

๋กœ๊ทธ ์ถœ๋ ฅ ๋ ˆ๋ฒจ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด development.rb ์— config.log_level = :error ๊ฐ™์€ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ๋˜ํ•œ filter_parameter_logging.rb ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํŒจ์Šค์›Œ๋“œ ๋“ฑ์˜ ํŒŒ์ผ์„ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

HTML ์ด์™ธ์˜ ์‘๋‹ต ์ฒ˜๋ฆฌ

์ถ”์ถœํ•œ ๋ชจ๋ธ์˜ ๋‚ด์šฉ์„ XML ๋˜๋Š” JSON ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•˜๋‹ค.

render ๋ฉ”์„œ๋“œ์— xml ๋˜๋Š” json ์˜ต์…˜์„ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ฐ€๋ น xml ์˜ต์…˜์„ ์ง€์ •ํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ชจ๋ธ์„ ๋„ฃ์–ด์ฃผ๋ฉด ์•„๋ž˜ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • to_xml ๋ฉ”์„œ๋“œ๋กœ ๋ชจ๋ธ์„ XML ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜

  • Content-Type ํ—ค๋”๋ฅผ "application/xml"๋กœ ์ง€์ •

๊ทธ๋Ÿฌ๋‚˜ ์ด์ฒ˜๋Ÿผ render ๋ฉ”์„œ๋“œ์— json๊ณผ xml ์˜ต์…˜์„ ์ง€์ •ํ•ด์„œ JSON ๋˜๋Š” XML ํ˜•์‹์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๊ฒฐ๊ณผ ์ƒ์„ฑ์€ ๋ทฐ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” MVC์˜ ๊ธฐ๋ณธ ์ •์ฑ…์—๋Š” ์œ„๋ฐ˜๋œ๋‹ค. ๋˜ํ•œ, json๊ณผ xml ์˜ต์…˜์œผ๋กœ ๋ชจ๋ธ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์€ ๋ชจ๋ธ์˜ ๋‚ด์šฉ์„ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋ฏ€๋กœ ์›ํ•˜๋Š” ํ˜•์‹์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์œผ๋กœ JSON๊ณผ XML ๋ฐ์ดํ„ฐ ์ƒ์„ฑ - Jbuilder/Builder

ERB๋กœ HTML ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ JSON๊ณผ XML ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์ด๋ฅผ ์ˆ˜์• ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ JBuilder์™€ Builder ํ…œํ”Œ๋ฆฟ์ด๋‹ค. ๊ฐ๊ฐ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, XML ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ์— ํŠนํ™”๋œ ํ…œํ”Œ๋ฆฟ์ด๋‹ค.

ํ•œํŽธ Builder์— ์žˆ๋Š” ๋ทฐ ํ—ฌํผ์ธ atom_feed ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Atom ํ”ผ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ€ํ‹ฐ ํฌ๋งท์œผ๋กœ ์ถœ๋ ฅ - response_to ๋ฉ”์„œ๋“œ

Rails์—์„œ ๋ฉ€ํ‹ฐ ํฌ๋งท์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ERB, Jbuilder, Builder, Ruby ๋“ฑ์˜ ํ…œํ”„๋ฆฟ์„ ์‚ฌ์šฉํ•ด ์›ํ•˜๋Š” ๋ทฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ค€๋น„ํ•ด๋‘๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์•„๋ž˜ ๊ฒฝ์šฐ์—๋Š” respond_to ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋””๋ฒ„๊ทธ ์ „์šฉ ์˜ค๋ฅ˜ ๊ธ€์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

  • ํ…œํ”Œ๋ฆฟ์„ ์ค€๋น„ํ•  ๊ฒƒ๋„ ์—†๋Š” ๊ฒฝ์šฐ

  • ๊ฐ๊ฐ์˜ ํ˜•์‹์— ๋”ฐ๋ผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

  • ํ—ค๋”๋งŒ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

respond_to do |format|
  foramt.type { statements }
  ...
end

respond_to ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ๋ธ”๋ก์—๋Š” format.type ํ˜•์‹์œผ๋กœ ์›ํ•˜๋Š” ํ˜•์‹ type์„ ์ ๋Š”๋‹ค. ์ดํ›„ statements ๋ถ€๋ถ„์—๋Š” ํ˜•์‹์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

์ด ๋•Œ respond_to ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์€ Rails์˜ actions_dispatch/http/mime_types.rb์— ์ •์˜๋˜์–ด ์žˆ๋‹ค. ๋งŒ์•ฝ ๊ธฐ์กด์— ์ •์˜๋œ ํ˜•์‹ ์™ธ์— ๋‹ค๋ฅธ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” /config/initializers/mime_types.rb์—์„œ ์•„๋ž˜ ํ˜•์‹์œผ๋กœ ํฌ๋งท์„ ๋“ฑ๋กํ•˜๋ฉด ๋œ๋‹ค.

Mime::Type.register "text/richtext", :rtf
Mime::Type.register_alias "text/html", :iphone

์ƒํƒœ ๊ด€๋ฆฌ

์ƒํƒœ ๊ด€๋ฆฌ๋ž€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€(์•ก์…˜) ์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ๋ฅผ ๋งํ•œ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” HTTP์˜ ํŠน์„ฑ์— ๊ธฐ์ธํ•œ๋‹ค.

HTTP๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ  ๋๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋„ ๊ทธ๋Ÿฌํ•œ ์š”์ฒญ์„ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ฆ‰, HTTP๋Š” ๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ(Stateless protocol)๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๋˜๋Š” ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€๋ผ๋Š” "์ƒํƒœ"๋ฅผ ์œ ์ง€ํ•ด์•ผํ•  ์ƒํ™ฉ์€ ๋งŽ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Rails๋Š” ์›๋ž˜ HTTP์— ์—†๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณด์ถฉํ•˜๊ณ  ์•„๋ž˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

๊ธฐ๋Šฅ

์„ค๋ช…

์ฟ ํ‚ค

๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋Š” ์ž‘์€ ๊ธ€์ž ์ •๋ณด(Rails ์ด์™ธ์˜ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์šฉ์ ์ธ ํ˜•ํƒœ์˜ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•)

์„ธ์…˜

์ฟ ํ‚ค, ์บ์‹œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ(๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•)

ํ”Œ๋ž˜์‹œ

ํ˜„์žฌ์™€ ๋‹ค์Œ ์š”์ฒญ์—์„œ๋งŒ ์œ ์ง€๋˜๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์„ธ์…˜ ์ •๋ณด

๋ฌผ๋ก  ์ฟผ๋ฆฌ ์ •๋ณด ๋˜๋Š” ์ˆจ๊ฒจ์ง„ ํ•„๋“œ ๋“ฑ์˜ ๊ธฐ๋Šฅ๋„ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•œ ๋ฐฉ๋ฒ•์ธ๋ฐ ์ด๊ฒƒ๋“ค์€ ์‚ฌ์šฉ์ด ๊ต‰์žฅํžˆ ํ•œ์ •์ ์ด๋ฏ€๋กœ ์ œ์™ธํ•ด๋ณธ๋‹ค.

์ฟ ํ‚ค ์ถ”์ถœ๊ณผ ์„ค์ •ํ•˜๊ธฐ - cookies ๋ฉ”์„œ๋“œ

์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ ์ชฝ์— ์ €์žฅ๋˜๋Š” ๊ฐ„๋‹จํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋‹ค. ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ๊ฑธ์ณ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ฑฐ๋‚˜, ํด๋ผ์ด์–ธํŠธ ๋‹จ์œ„๋กœ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” cookies ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

cookies ๋ฉ”์„œ๋“œ์— ์„ค์ • ๊ฐ€๋Šฅํ•œ ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์•Œ์•„๋‘ฌ์•ผํ•  ์‚ฌ์‹ค์„ ๋ฉ”๋ชจํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • values, expires๋Š” ์‚ฌ์‹ค์ƒ ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. expires ์˜ต์…˜์„ ์ƒ๋žตํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ซํž ๋•Œ ์ฟ ํ‚ค๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ์ ์—์„œ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

  • domain๊ณผ path๋Š” ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ๋„๋ฉ”์ธ๊ณผ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๊ณต์œ ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ฟ ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ path๋Š” ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด๋‘ฌ์•ผ ํ•œ๋‹ค.

  • secure๋Š” ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•  ๊ฒฝ์šฐ์—๋Š” true๋กœ ์ž…๋ ฅํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๊ฐ€ ํ˜ผ์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์•”ํ˜ธํ™”๋œ ์ฟ ํ‚ค๋Š” ์†ก์‹ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๋‹ค.

  • httponly๋Š” HTTP ํ†ต์‹ ์œผ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” HTTP ์ฟ ํ‚ค๋ฅผ ์œ ํšจํ™”ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋ถ€ํ„ฐ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… ์ทจ์•ฝ์„ฑ์„ ์ด์šฉํ•œ ์ฟ ํ‚ค ๋„์ฒญ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

permanent์™€ encrypted ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜์†ํ™” ์ฟ ํ‚ค์™€ ์•”ํ˜ธํ™” ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์†ํ™” ์ฟ ํ‚ค๋Š” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์œ ํšจ ๊ธฐ๊ฐ„์ด 20๋…„์œผ๋กœ ์„ค์ •๋œ ์ฟ ํ‚ค์ด๋‹ค. expire ์˜ต์…˜์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋„ permanent ์„ค์ •์ด ์šฐ์„ ๋œ๋‹ค. ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์œ ํšจ ๊ธฐ๊ฐ„์ด ๊ธด ์ฟ ํ‚ค๋Š” ๋ณด์•ˆ์ ์ธ ์ธก๋ฉด์—์„œ ์ข‹์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‚จ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์•”ํ˜ธํ™” ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ํ‚ค๋ฅผ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์ฟ ํ‚ค ์•”ํ˜ธํ™”๋‚˜ ํ•ด๋…์— ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์„ config/initializers/secret_token.rb์˜ Rails.application.config.secret_key_base ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด๋‘ฌ์•ผํ•œ๋‹ค.

์•„๋ž˜ ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ์˜์†์„ฑ ์ฟ ํ‚ค์™€ ์•”ํ˜ธํ™” ์ฟ ํ‚ค๋ฅผ ๋™์‹œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

cookies.permanent.encrypted[:email] = { value: ...}

์„ธ์…˜ ์‚ฌ์šฉ - session ๋ฉ”์„œ๋“œ

ํŽ˜์ด์ง€๋ผ๋ฆฌ์˜ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค ์™ธ์—๋„ ์„ธ์…˜์ด๋ผ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•œ๋‹ค. ์„ธ์…˜์ด๋ž€, ์‚ฌ์šฉ์ž(ํด๋ผ์ด์–ธํŠธ) ๋‹จ์œ„๋กœ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์ตœ๊ทผ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋Œ€๋ถ€๋ถ„ ์ง€์›ํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

Rails์˜ ์„ธ์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟ ํ‚ค์— ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ํ‘œ์ค€ ํ˜•ํƒœ์—์„œ๋Š” ์ฟ ํ‚ค์™€ ๊ฑฐ์˜ ์ฐจ์ด๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์„ธ์…˜์—์„œ๋Š” ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์„œ ์ €์žฅ ๋Œ€์ƒ(๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ)์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ ค์žˆ๋Š” ๋™์•ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ์ผ๋‹จ ์„ธ์…˜์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ž.

์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ €์žฅ ๋Œ€์ƒ

์„ค๋ช…

์ฟ ํ‚ค(CookieStore)

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ํด๋ผ์ด์–ธํŠธ์˜ ์ฟ ํ‚ค๋กœ ์„ธ์…˜์„ ์ €์žฅ(๊ธฐ๋ณธ). ๊ณ ์†์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ €์žฅํ•˜๋ฏ€๋กœ ๋น„๋ฐ€ ์ •๋ณด ์ €์žฅ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ. ์ €์žฅ ์‚ฌ์ด์ฆˆ๋„ 4KB๋กœ ์ œํ•œ๋จ.

์บ์‹œ(CacheStore)

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์บ์‹œ์— ์„ธ์…˜์„ ์ €์žฅ. ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์ˆ˜๋ช…์ด ์งง์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(ActiveRecordStore)

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์•กํ‹ฐ๋ธŒ ๋ ˆ์ฝ”๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์„ธ์…˜์„ ์ €์žฅ. ์„œ๋ฒ„์— ์ €์žฅํ•˜๋ฏ€๋กœ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋•Œ ์ ํ•ฉํ•จ.

์„ธ์…˜ ์ฒ˜๋ฆฌ๋Š” ์•„๋ž˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

  1. ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ (ํด๋ผ์ด์–ธํŠธ -> ์„œ๋ฒ„)

  2. ์„ธ์…˜ ID๋ฅผ ๋ฐœ๊ธ‰ (์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ)

  3. ๋‘ ๋ฒˆ์งธ ์ดํ›„๋ถ€ํ„ฐ์˜ ์š”์ฒญ (ํด๋ผ์ด์–ธํŠธ -> ์„œ๋ฒ„)

  4. ์„ธ์…˜ ID๋ฅผ ํ‚ค๋กœ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ถ”์ถœ (์„œ๋ฒ„)

  5. ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ (์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ)

ํฌ์ธํŠธ๋Š” ์„œ๋ฒ„ ์‚ฌ์ดํŠธ์—์„œ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•  ๋•Œ๋„ ํ‚ค๋Š” ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐœํ–‰๋˜๋Š” ์ฟ ํ‚ค๋ฅผ ์„ธ์…˜ ID๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์„œ๋ฒ„ ์ธก์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐœ์†ก๋œ ์„ธ์…˜ ID๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•œ๋‹ค.

flash ๋ฉ”์„œ๋“œ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์ „ํ›„๋กœ ์ผ์‹œ์ ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์“ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ •ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋Œ€์ƒ์˜ ํ™”๋ฉด์—์„œ "~์˜ ์ €์žฅ์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค."์™€ ๊ฐ™์ด ํ‘œ์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ!

ํ”Œ๋ž˜์‹œ๋Š” redirect_to ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ redirect_to ๋ฉ”์„œ๋“œ์— notice ์˜ต์…˜์œผ๋กœ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋Œ€์ƒ์— ํ”Œ๋ž˜์‹œ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

format.html { redirect_to book, notice: 'Book was successfully created.'}

ํ•„ํ„ฐ

ํ•„ํ„ฐ๋Š” ์•ก์…˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ด์ „๊ณผ ์ดํ›„์— ๋ถ€๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์•ก์…˜์— ๊ณตํ†ต์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์•ก์…˜๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ํ•œ๊บผ๋ฒˆ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

before, after, around ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

ํ•„ํ„ฐ๋Š” ์ •์˜๋œ ์ปจํŠธ๋กค๋Ÿฌ ๋˜๋Š” ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํŒŒ์ƒ๋œ ์ปจํŠธ๋กค๋Ÿฌ์— ์ ์šฉ๋œ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค -> ์ž์‹ ํด๋ž˜์Šค ์ˆœ์„œ๋กœ ํ•„ํ„ฐ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋ฌผ๋ก  skip_xxxx_action ๋ฉ”์„œ๋“œ๋กœ ๋ถ€๋ชจ ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ ํ•„ํ„ฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณตํ†ต ๊ธฐ๋Šฅ ์ •์˜ - Application ์ปจํŠธ๋กค๋Ÿฌ

Application ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋˜๋ฉฐ, ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ทผ์›์ด ๋œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋ฃจํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

์›์น™์ ์œผ๋กœ Application ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณตํ†ต ๊ธฐ๋Šฅ๋งŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์˜ˆ์‹œ

  • ๊ฐ๊ฐ์˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•  ํ—ฌํผ๋ฉ”์„œ๋“œ

  • ๋ชจ๋“ (๋˜๋Š” ๋Œ€๋ถ€๋ถ„) ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ด์šฉํ•˜๋Š” ํ•„ํ„ฐ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ณตํ†ต ์„ค์ •

๊ณตํ†ต ํ•„ํ„ฐ๋กœ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์˜ˆ์‹œ๋‹ค. Application ์ปจํŠธ๋กค๋Ÿฌ์˜ before ํ•„ํ„ฐ์— check_logined ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ธ์ฆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ, login_controller์—์„œ๋งŒํผ์€ skip_before_action :check_loginedํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฌดํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ๋ชจ๋ธ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋‹ค๋ฉด ์ด๋Ÿฐ ๊ณตํ†ต ๋กœ์ง์„ ๋‘๋Š” ํ‘œ์ค€ ์žฅ์†Œ๊ฐ€ ์žˆ๋‹ค. ๊ณตํ†ต ๋กœ์ง์„ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค์–ด ์•„๋ž˜ ๊ฒฝ๋กœ์— ๋„ฃ์–ด๋‘์ž.

  • app/controllers/concerns

  • app/models/concerns

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

    Rails ๊ณต์‹๋ฌธ์„œ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๋Š” ๋ถ€๋ถ„์„ ํ† ๋ก ์„ ํ†ตํ•ด ๋‹ต์„ ๊ตฌํ•ด๋ณด๋ คํ•˜์˜€์œผ๋‚˜, ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋ผ๋ฆฌ ๋…ผ์˜ํ•ด์„œ๋Š” ๊ฐ€์„ค๋งŒ ์„ธ์šธ ์ˆ˜ ์žˆ์„ ๋ฟ, ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฒ€์ฆํ•ด์•ผํ•œ๋‹ค๋Š” ์ ๋งŒ ์ธ์‹ํ–ˆ์Šต๋‹ˆ๋‹ค.

    ํ•˜๋ฃจํ•˜๋ฃจ ์กฐ๊ธˆ์ด๋ผ๋„ ์ž๋ผ๋Š” ๊ฒƒ. ์ƒˆํ•ด๊ฐ€ ๋˜์—ˆ์–ด๋„ ํ•ด์•ผ๋  ๊ฒƒ์€ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ฐ€์žฅ์œผ๋กœ์„œ ์ทจ์—…์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šฌ์Šฌ ์ด๋ ฅ์„œ, ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋“ฑ์„ ์ค€๋น„ํ•ด์•ผ๊ฒ ๋„ค์š”.

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

    • ๋ฃจ๋น„์˜จ๋ ˆ์ผ์ฆˆ

Last updated