2021-01-04(Mon)
ํญ๋ชฉ | ๋ด์ฉ |
ํ์ต ๋ ์ง | 2021-01-04(์) |
ํ์ต ์๊ฐ | 12:00~24:00 |
ํ์ต ๋ฒ์ ๋ฐ ์ฃผ์ | ๋ฃจ๋น์จ๋ ์ผ์ฆ ๋ผ์ฐํ , ํ ์คํธ |
ํ์ต ๋ชฉํ | ํผํํธ ๋ฃจ๋น์จ๋ ์ผ์ฆ ๋ผ์ฐํ , ํ ์คํธ ์ฑํฐ๋ฅผ ๋ ํํ๋ค. |
๋๋ฃ ํ์ต ๋ฐฉ๋ฒ | - |
์์ธ ํ์ต ๋ด์ฉ
์ฑ ์ ํ์ผ๋ฉฐ ์๋์ฒ๋ผ ๊ฐ๋จํ๊ฒ ๋ฉ๋ชจ๋ฅผ ์งํํ๋ค.
๋ผ์ฐํ
RESTful ์ธํฐํ์ด์ค
RESTful ์ธํฐํ์ด์ค๋ REST์ ํน์ง์ ๊ฐ์ง ๋ผ์ฐํธ๋ฅผ ๋งํ๋ค. REST๋ HTTP ๋ฉ์๋์ CRUD๋ฅผ ๋์์ํค๋ ๊ฒ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
์ถ์ถ: GET
์์ฑ: POST
๋ณ๊ฒฝ: PATCH
์ ๊ฑฐ: DELETE
Rails๋ ์์น์ ์ผ๋ก RESTful ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํธ๋ฅผ ์ค๊ณํ๋ค. ๋นRESTful์ ์ธ ๋ผ์ฐํธ๋ฅผ ์ค์ ํ ์๋ ์์ง๋ง, Rails์์ ์ ๊ณตํ๋ form_for
, url_for
, link_to
๋ฑ์ ๋ทฐ ํฌํผ๋ RESTful ์ธํฐํ์ด์ค๋ฅผ ์ ์ ๋ก ์ค๊ณ๋์ด ์์ผ๋ฏ๋ก ์ ๋งํ๋ฉด RESTful์ ์ธ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ์.
resources ๋ฉ์๋
RESTful ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ๋๋ routes.rb์์ resources ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
์๋ฅผ ๋ค์ด ์๋ ์ฝ๋๋ฅผ ์ ์ผ๋ฉด ์๋ ํ์ฒ๋ผ URL๋ก ์ก์ ์ด ๋งคํ๋๋ค.
URL | ์ก์ | HTTP ๋ฉ์๋ | ์ญํ |
/users(.:format) | index | GET | ์ฌ์ฉ์ ๋ชฉ๋ก ์์ฑ |
/users/:id(.:format) | show | GET | ๊ฐ๊ฐ์ ์ฌ์ฉ์ ์์ธ ํ๋ฉด ์์ฑ |
/users/new(.:format) | new | GET | ์ ๊ท ์ฌ์ฉ์ ์ถ๊ฐ ํ๋ฉด ์์ฑ |
/users(.:format) | create | POST | ์ ๊ท ์ฌ์ฉ์ ํ๋ฉด์ผ๋ก๋ถํฐ์ ์ ๋ ฅ์ ๋ฐ์ ๋ฑ๋ก ์ฒ๋ฆฌ |
/users/:id/edit(.:format) | edit | GET | ๊ธฐ์กด์ ์ฌ์ฉ์ ํธ์ง ํ๋ฉด ์์ฑ |
/users/:id(.:format) | update | PATCH/PUT | ํธ์ง ํ๋ฉด์ผ๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ์ ์์ ์ฒ๋ฆฌ |
/users/:id(.:format) | destory | DELETE | ๋ชฉ๋ก ํ๋ฉด์์ ์ ํํ ๋ฐ์ดํฐ ์ ๊ฑฐ ์ฒ๋ฆฌ |
๋ํ resources ๋ฉ์๋๋ ๋ทฐ ํฌํผ(link_to ๋ฑ)์์ ์ฌ์ฉํ ์ ์๋ Url ํฌํผ๋ ์๋์ผ๋ก ์์ฑํ๋ค.
ํฌํผ ์ด๋ฆ( | ํฌํผ ์ด๋ฆ( | ๋ฆฌํด ๊ฐ(๊ฒฝ๋ก) |
users_path | users_url | /users |
user_path(id) | user_url(id) | /users/:id |
new_user_path | new_user_url | /users/new |
edit_user_path(id) | edit_user_url(id) | /users/:id/edit |
์ด๋ฌํ ํฌํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋งํฌ๋ฅผ ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ฌผ๋ก , ๋ผ์ฐํธ ์ ์์ ์์กดํ์ง ์์ ์๋ ์๋ค.
resource ๋ฉ์๋
resources ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ RESTful ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ค๋ฉด, resource ๋ฉ์๋๋ ํ๋์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ RESTful ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์๋ ์ฝ๋๋ฅผ ์ ์ผ๋ฉด ์๋ ํ์ฒ๋ผ URL๋ก ์ก์ ์ด ๋งคํ๋๋ค.
URL | ์ก์ | HTTP ๋ฉ์๋ | ์ญํ |
/config(.:format) | show | GET | ์ค์ ์ ๋ณด ํ๋ฉด ํ์ ์์ธ ํ๋ฉด ์์ฑ |
/config/new(.:format) | new | GET | ์ ๊ท ์ค์ ์ถ๊ฐ ํ๋ฉด ์์ฑ |
/config(.:format) | create | POST | ๋ฑ๋ก ํ๋ฉด์์ ์ ๋ ฅ์ ๋ฐ์ ๋ฑ๋ก ์ฒ๋ฆฌ |
/config/edit(.:format) | edit | GET | ๊ธฐ์กด ์ค์ ์์ ํ๋ฉด ํ์ |
/config(.:format) | update | PATCH/PUT | ์์ ํ๋ฉด์์ ์ ๋ ฅ์ ๋ฐ์ ์์ ์ฒ๋ฆฌ |
/config(.:format) | destroy | DELETE | ์ง์ ๋ ์ค์ ์ ๋ณด๋ฅผ ์ ๊ฑฐ ์ฒ๋ฆฌ |
resources ๋ฉ์๋์ ๋น์ทํ์ง๋ง, index ์ก์ ์ด ์ ์๋์ง ์์์ผ๋ฏ๋ก show, edit, delete ๋ฑ์์ :id๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ์ง ์๋๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
์ฐธ๊ณ 1) resource ๋ฉ์๋๋ config ๋ฆฌ์์ค๊ฐ ConfigsController๋ก ๋งคํ๋๋ค.
์ฐธ๊ณ 2)
http://localhost:3000/rails/info/routes
๋ก ์ ๊ทผํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ก๋ ๋ผ์ฐํธ ์ ์๋ฅผ ํ์ธํ ์ ์๋ค.
RESTful ์ธํฐํ์ด์ค์ ์ฌ์ฉ์ ์ ์ํ
resources, resource ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด RESTfulํ ์ ํ์ ์ธ ๋ผ์ฐํธ๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์๋ค. ํ์ง๋ง ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ ๋ค๋ฉด ํ์ค์ ์ธ ๊ท์น๋ง์ผ๋ก๋ ๋ชจ๋ ๊ฒ์ ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ์ค์ํ ์ต์ ๋ค์ด ๋ญ๊ฐ ์๋์ง๋ ํ์ธํด๋ ํ์๊ฐ ์๋ค.
๋ผ์ฐํธ ๋งค๊ฐ ๋ณ์ ์ ์ฝ ์กฐ๊ฑด - contraints ์ต์
์ฌ์ค ๋ผ์ฐํธ ๋งค๊ฐ ๋ณ์์ ๊ด๋ จ๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ ๋ชจ๋ธ์์ ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด์ง๋ง, ๋ผ์ฐํธ์์ ์ฒ๋ฆฌํ๋ฉด ์์น ์๋ ๊ฐ์ ๋ณด๋ค ํ์คํ๊ฒ ์ฐจ๋จํ ์ ์๋ค.
constraints: { <๋งค๊ฐ ๋ณ์ ์ด๋ฆ>: <์ ๊ท ํํ์> }
ํํ๋ก ๋ผ์ฐํธ ๋งค๊ฐ ๋ณ์์ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ค. ์๋์ฒ๋ผ!
์ฌ๋ฌ ๊ฐ์ ๋ฆฌ์์ค์ ๋์ผํ ์ ์ฝ ์กฐ๊ฑด์ ๋ถ์ฌํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ธ๋ก ํ์์ผ๋ก ์ ์ฝ ์กฐ๊ฒ ๋ ์์ฑํ ์ ์๋ค.
๋ณต์กํ ์ ์ฝ ์กฐ๊ฑด ์ค์ - ์ ์ฝ ํด๋์ค ์ ์
์ ๊ท ํํ์๋ง์ผ๋ก๋ ํํํ ์ ์๋ ๋ณต์กํ ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด ์ ์ฝ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ ์ฝ ํด๋์ค์ ์กฐ๊ฑด์ ๋ง๋ค ๋๋ matches?
๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
matches?
๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ท์น์ ์ง์ผ์ผํ๋ค.
๋งค๊ฐ ๋ณ์๋ก ์์ฒญ ์ ๋ณด(request ๊ฐ์ฒด)๋ฅผ ๋ฐ์.
๋ฆฌํด ๊ฐ์ผ๋ก๋ ๋ผ์ฐํธ๋ฅผ ์ ํจํํ ์ง์ ๋ํ true ๋๋ false๋ฅผ ๋ฆฌํด
์์๋ฅผ ๋ณด์. ์๋์ฒ๋ผ ์ ์ฝ ํด๋์ค๋ฅผ ์ ์ํ๋ค๋ฉด,
์๋์ฒ๋ผ ์ ์ฝ ํด๋์ค๋ฅผ ๋ถ๋ฌ์์ constraint ์ต์ ์ผ๋ก ์ ๋ฌ๋ง ํด์ฃผ๋ฉด ๋๋ค.
form ๋งค๊ฐ ๋ณ์ ์ ๊ฑฐ - form ์ต์
resources์ resource ๋ฉ์๋๋ก ์ ์๋ ๋ชจ๋ ๋ผ์ฐํธ๋ ~(.:format)
์ด ๋ถ์ด์๋ค. ๋ฐ๋ผ์ ~books.xml
๋๋ ~/books.json
์ฒ๋ผ ์ถ๋ ฅ ํ์์ ํ์ฅ์ ํํ๋ก ์ง์ ํ ์๋ ์๋ค.
ํ์ง๋ง ๋ฆฌ์์ค์ ๋ฐ๋ผ์๋ ์ฌ๋ฌ ํ์์ ๋์ํ์ง ์์ ์๋ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ format ์ต์
์ false๋ก ์ง์ ํ์. ๊ทธ๋ผ URL ํจํด์์ ~(.:format)
์ด ์ ๊ฑฐ๋ ๋ผ์ฐํธ๊ฐ ์์ฑ๋๋ค.
์ปจํธ๋กค๋ฌ ํด๋์ค์ Url ํฌํผ์ ์ด๋ฆ ์์ - controller์ as ์ต์
resources์ resource ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ ๋ ๋ฆฌ์์ค ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋์๋๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฒฐ์ ํ๊ณ Url ํฌํผ๋ฅผ ์์ฑํ๋ค.
๋ชจ๋ ๋ด๋ถ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋งตํ - namespace์ scope ๋ธ๋ก
์ปจํธ๋กค๋ฌ ํด๋์ค์ ์๊ฐ ๋ง์์ง๋ฉด ๋ชจ๋์ ์ฌ์ฉํด ์ปจํธ๋กค๋ฌ๋ฅผ ํด๋๋ก ์ ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค. ์๋์ฒ๋ผ ์ปจํธ๋กค๋ฌ ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด Admin::BooksController๊ฐ controllers/admin ํด๋ ์๋์ books_controller.rb๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑ๋๋ค.
์ด๋ ๊ฒ ๋ชจ๋๋ก ์ปจํธ๋กค๋ฌ ํด๋์ค๋ฅผ ์์ฑํ ๊ฒฝ์ฐ์๋ ํ
ํ๋ฆฟ์ /views/<๋ชจ๋ ์ด๋ฆ>/<์ปจํธ๋กค๋ฌ ์ด๋ฆ>
ํด๋์ ๋ฃ์ผ๋ฉด ๋๋ค.
์ด์ฒ๋ผ ๋ชจ๋์ ์ฌ์ฉํ ์ปจํธ๋กค๋ฌ ํด๋์ค์ RESTful ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ค๋ฉด ์๋์ฒ๋ผ namespace ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด /admin/books
๋๋ /admin/books/:id
์ ๊ฐ์ URL ํจํด๊ณผ, admin_books_path
๋๋ admin_book_path(id)
์ ๊ฐ์ URL ํฌํผ๊ฐ ์์ฑ๋๋ค.
๋ง์ฝ์ ๋ชจ๋์ ์ธ์๋ง ํ๊ณ URL ํจํด๊ณผ URL ํฌํผ์๋ ์ํฅ์ ์ฃผ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ์๋ ์๋์ฒ๋ผ scope ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ๋๋ค.
RESTful ์ธํฐํ์ด์ค์ ์ก์
์ถ๊ฐ - collection๊ณผ member ๋ธ๋ก
collection๊ณผ member ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด resources์ resource ๋ฉ์๋๋ก ์๋ ์์๋๋ ๋ผ์ฐํธ ์ธ์ ์ํ๋ ์ก์ ์ ์ถ๊ฐํ ์ ์๋ค.
collection ๋ธ๋ก์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ์ก์ ์, member ๋ธ๋ก์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ์ก์ ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ค.
RESTful ์ธํฐํ์ด์ค์ ์ก์
์ ๋ฌดํจํ - only์ except ์ต์
collection, member ๋ธ๋ก๊ณผ ๋ฐ๋๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ ์ก์ ์ ์ผ๋ถ๋ฅผ ๋ฌดํจํํ๊ณ ์ถ์ ๋๋ only ๋๋ except ์ต์ ์ ์ง์ ํ๋ค.
๋ผ์ฐํธ ์ ์๋ฅผ ์ถ๊ฐ ๋๋ ๋ฌดํจํํ๋ ๊ฒ์ด ์๋๋ผ ํ์ค ์ก์ ์ธ new ์ก์ , edit ์ก์ ๊ณผ ๊ด๋ จ๋ URL์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ :path_names ์ต์ ์ ์ง์ ํ๋ค.
๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋ฆฌ์์ค ํํ - resources ๋ฉ์๋ ์ค์ฒฉ
๋ฆฌ์์ค๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, books ๋ฆฌ์์ค(๋์ ์ ๋ณด)๋ reviews ๋ฆฌ์์ค(๋์ ๋ฆฌ๋ทฐ)๋ฅผ ํฌํจํ๋ค. ์ด๋ฌํ ๋ฆฌ์์ค ๊ณ์ธต ๊ด๊ณ๋ has_many ๋๋ belongs_to ๋ฑ์ ๋ชจ๋ธ Association์ผ๋ก ๋ํ๋ธ๋ค.
์ด๋ฌํ ๋ฆฌ์์ค(๋ชจ๋ธ)์ ๊ด๊ณ๋ URL๋ก๋ ํํํด์ฃผ๋ ๊ฒ์ด ์ง๊ด์ ์ด๋ค. ๊ฐ๋ น ๋์1์ ๋ฆฌ๋ทฐ ์ ๋ณด๋ ~/books/1/reviews
์ฒ๋ผ ๋ํ๋ด๋ ๊ฒ์ด ์ข๋ค.
์ด๋ฌํ ๊ด๊ณ๋ resources์ resource ๋ฉ์๋๋ฅผ ์ค์ฒฉํด์ ๋ํ๋ธ๋ค.
์ด๋ฌ๋ฉด URL ํฌํผ์ book_
์ด๋ผ๋ ์ ๋์ฌ๊ฐ ๋ถ๋๋ค. resources์ resource ๋ฉ์๋๋ ๊ณ์ํด์ ์ค์ฒฉํ ์ ์์ง๋ง, ๊ณ์ธต์ 2๋จ๊ณ ๊น์ง๋ง ๋ง๋๋ ๊ฒ์ด ๋ฌด๋ํ๋ค.
๋ฆฌ์์ค์ ์์ ์ค์ฒฉ ํํ - shallow ์ต์
์๋์ฒ๋ผ shallow ์ต์ ์ ์ฐ๋ฉด '์์ URL'์ด ์์ฑ๋๋ค.
๋ผ์ฐํธ ์ ์ ์ฌ์ด์ฉ - concern ๋ฉ์๋์ concerns ์ต์
concern ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณตํต๋๋ ๋ด์ฉ์ ์ฌ๋ฌ ๊ฐ์ ๋ผ์ฐํธ ์ ์์ ๋ฃ์ ์ ์๋ค.
RESTful ํ์ง ์์ ๋ผ์ฐํธ ์ ์
๋ชจ๋ ๊ฒ์ RESTfulํ๊ฒ ๋ง๋ค ์ ์๋ ๊ฒ์ ์๋๋ค. ์ด๋ด ๋ ๋ฌด๋ฆฌํด์ RESTful ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ๋ ค ๋ค์ง ๋ง๊ณ , ๊ฐ๋จํ๊ฒ RESTful ํ์ง ์์ ๋ผ์ฐํธ๋ฅผ ์ ์ํด๋ณด์.
match ๋ฉ์๋
RESTful ํ์ง ์์ ๋ผ์ฐํธ๋ฅผ ์ ์ํ ๋๋ match ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
via ์ต์ ์๋ ํน๋ณํ ๊ฐ์ผ๋ก :all(๋ชจ๋ HTTP ๋ฉ์๋ ํ์ฉ)์ ์ง์ ํ ์๋ ์๋ค. ํ์ง๋ง CSRF ๊ณต๊ฒฉ์ ๊ฐ์ ์ ์ธ ์์ธ์ด ๋๋ฏ๋ก ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ๋ง์.
๋ค์ํ RESTful ํ์ง ์์ ๋ผ์ฐํธ ํํ
์์๋ฅผ ๋ณด์.
๋ฃจํธ ๋งคํ ์ ์ - root ๋ฉ์๋
๋ฃจํธ์ ๋์ํ๋ ๋ผ์ฐํธ๋ฅผ ์ค์ ํ ๋๋ root ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. root ๋ฉ์๋๋ ์ผ๋ฐ์ ์ผ๋ก routes.rb์ ๋ง์ง๋ง์ ์์ฑํ๋ค.
ํ
์คํธ
์๋ํ๋ ํ ์คํธ์ ์์ ์ ์ด๊ณ ์ ์ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋๋ฐ ํ์์์๋ค. Rails๋ ์ด๊ธฐ ๋ฒ์ ๋ถํฐ ์ด๋ฐ ์๋ํ๋ ํ ์คํธ๋ฅผ ๊ต์ฅํ ์ค์์ํ๊ณ ์๊ณ , ์๋ ํ ์คํธ๋ค์ ์ง์ํ๋ค.
Unit ํ ์คํธ: ๋ชจ๋ธ ๋๋ ๋ทฐ ํฌํผ์ ๋์ ํ์ธ
Functional ํ ์คํธ: ์ปจํธ๋กค๋ฌ์ ํ ํ๋ฆฟ์ ํธ์ถ ๊ฒฐ๊ณผ ํ์ธ(์ํ ์ฝ๋ ๋๋ ํ ํ๋ฆฟ ๋ณ์ ๋ทฐ์ ์ถ๋ ฅ ๊ฒฐ๊ณผ ๋ฑ)
Integration ํ ์คํธ: ์ฌ๋ฌ ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋๋๋ค๋ฉฐ ์ฌ์ฉ์์ ์ค์ ์กฐ์์ ๋ชจ๋ฐฉํ๊ณ ๊ฒฐ๊ณผ ํ์ธ
ํ ์คํธ ํ๋ ์์ํฌ๋ก๋ RSpec, minitest, Test::Unit ๋ฑ์ด ์๋ค. ์ฐธ๊ณ
์ฑ ์์๋ Test::Unit์ ๋ํด ์ค๋ช ํ๋ค.
ํ
์คํธ ์ค๋น
์ฐ์ ํ ์คํธ๋ฅผ ํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์คํธ ์ ์ฉ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค. ์์๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด์.
1. ํ
์คํธ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ตฌ์ถ
์๋์ฒ๋ผ rake ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ค.
rake db:migrate
๋ช
๋ น์ด๋ก ๋ฏธ์คํ ๋ง์ด๊ทธ๋ ์ด์
์ ์คํํ๊ณ , schema.rb
๋ฅผ ์ต์ ์ํ๋ก ์
๋ฐ์ดํธํ ๋ค์ rake db:test:load
๋ช
๋ น์ด๋ก schema.rb
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ
์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ฒ๋ง ํ๋ฉด ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ๊ตฌ์กฐ๋ก ํ
์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ตฌ์ถ๋๋ค.
ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ตฌ์ถ๋์๋์ง ํ ์คํธ ํ๊ฒฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ํ์ฌ ํ์ธํ ์ ์๋ค. rails ๋ฒ์ ๋ณ๋ก ๋ช ๋ น์ด๊ฐ ๋ค๋ฅด๋ ์ฃผ์ํ ๊ฒ.
Rails 3, 4:
rails dbconsole test
Rails 5, 6:
rails dbconsole -e test
2. ํ ์คํธ ๋ฐ์ดํฐ ์ค๋น
ํฝ์ค์ฒ๋ฅผ
test/fixtures
๋๋ ํ ๋ฆฌ์ ๋ฃ์ด์ฃผ์.Unit ํ ์คํธ
Unit ํ ์คํธ(๋จ์ ํ ์คํธ)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๊ณ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ฃผ์ ๋ชจ๋ธ ๋ฑ)๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๋ ํ ์คํธ์ด๋ค.
models ํ ์คํธ
/test/models
๋ด๋ถ์ ์์ฑ๋ ์คํฌ๋ฆฝํธ์ test ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํ ์คํธ ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ์. ์ด ๋ test๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋กtest_xxxx
๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ฟ์ด๋ฏ๋กtest_
๋ก ์์ํ๋ ๋ฉ์๋๋ฅผ ์ง์ ์ ์ํด๋ ์๊ด์๋ค.์ดํ
rake test:models
๋ช ๋ น์ด๋ก ๋ชจ๋ธ ํ ์คํธ๋ฅผ ์คํํ๋ค. ๋ง์ฝ ํน์ ํ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ํ๊ณ ์คํํ๋ ค๋ฉดrake test:models ํ ์คํธ_์คํฌ๋ฆฝํธ_๊ฒฝ๋ก
๋ฅผ ์คํ์ํค๋ฉด ๋๋ค.ํ ์คํธ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๋๋ ์คํ ์์๊ฐ ๋ง์๋๋ก์ด๋ฏ๋ก ์คํ ์์์ ์์กดํ๋ ํ ์คํธ ๋ฉ์๋๋ ์์ฑํ์ง ์๋๋ก ํ์.
Rails๋ ํ ์คํธ๋ฅผ ์คํํ ๋ ํฝ์ค์ฒ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก๋ํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ํ ์คํธ ์คํฌ๋ฆฝํธ์์ ์ด์ฉํ ์ ์๊ฒ ํด์๋ก ์ ๊ฐํ๋ค.
์๋ฅผ ๋ค์ด books.yml ๋ด๋ถ์ :islb๋ผ๋ ํค๋ก ์ ์๋ ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด, books(:jslib)์ ์ ๊ทผํ ์ ์๋ค.
view helper ํ ์คํธ
/test/helpers
ํด๋ ๋ด๋ถ์<์ปจํธ๋กค๋ฌ>_helper_test.rb
์ฒ๋ผ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๊ณ ์ญ์test
๋ฉ์๋๋ก ํ ์คํธ๋ฅผ ์์ฑํ ๋ค์rake test:helpers
๋ช ๋ น์ด๋ก ์คํํ์.์ญ์๋ ๋ง์ฝ ํน์ ํ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ํ๊ณ ์คํํ๋ ค๋ฉด
rake test:helpers ํ ์คํธ_์คํฌ๋ฆฝํธ_๊ฒฝ๋ก
๋ฅผ ์คํ์ํค๋ฉด ๋๋ค.ํ ์คํธ ์ค๋น์ ๋ค์ฒ๋ฆฌ - setup๊ณผ teardown ๋ฉ์๋
ํ ์คํธ ์คํฌ๋ฆฝํธ์๋ ๊ฐ๊ฐ์ ํ ์คํธ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ ๊ณผ ํ์ ์๋์ผ๋ก ํธ์ถ๋๋ ์์ฝ ๋ฉ์๋๊ฐ ์๋ค. ํ ์คํธ ์คํฌ๋ฆฝํธ์ ๋ถ๋ชจ ํด๋์ค
ActiveSupport::TestCase
์ ์ ์๋์ด ์๋ ๋ฉ์๋์ด๋ฏ๋ก ์ค๋ฒ๋ผ์ด๋ํด์ ์ฌ์ฉํ๋ค.๊ฐ๊ฐ ๋ฌด์จ ์ญํ ์ ํ๋์ง ์ด๋ฆ์์ ๋ฑ ๊ฐ์ด ์จ๋ค.
setup: ๊ฐ ํ ์คํธ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์คํ(์ฌ์ฉํ ๋ฆฌ์์ค ์ด๊ธฐํ)
teardown: ๊ฐ ํ ์คํธ ๋ฉ์๋๊ฐ ํธ์ถ๋ ์ดํ์ ์คํ(์ฌ์ฉํ ๋ฆฌ์์ค ๋ค์ฒ๋ฆฌ)
์๋์ฒ๋ผ ์ฐ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํฝ์ค์ฒ๋ฅผ ์ฝ๋ ๊ฒ๊ณผ ์ ๊ฑฐ๋ Rails๊ฐ ์๋์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก setup ๋ฉ์๋์์ ๋ฐ๋ก ์คํํด์ฃผ์ง ์์๋ ๋๋ค.
Functional ํ ์คํธ
Functional ํ ์คํธ(๊ธฐ๋ฅ ํ ์คํธ)๋ ์ปจํธ๋กค๋ฌ(์ก์ )์ ๋์ ๋๋ ํ ํ๋ฆฟ์ ์ถ๋ ฅ์ ํ์ธํ๊ธฐ ์ํ ํ ์คํธ์ด๋ค. Functional ํ ์คํธ์์๋ ๋ธ๋ผ์ฐ์ ์ฒ๋ผ HTTP ์์ฒญ์ ์ ์ฌ์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ผ๋ก ์ก์ ๋ฉ์๋๋ฅผ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก HTTP ์ํ ์ฝ๋, ํ ํ๋ฆฟ ๋ณ์ ๋๋ ์ต์ข ์ ์ธ ์ถ๋ ฅ ๊ตฌ์กฐ ๋ฑ์ ํ์ธํ๋ค. ๋ํ, ๋ผ์ฐํธ ์ ์์ ์ ํจ์ฑ์ ํ์ธํ๋ ๊ฒ๋ Functional ํ ์คํธ์ ์ญํ ์ด๋ค.
์ปจํธ๋กค๋ฌ test ๋ฉ์๋ ์์ฑ
/test/controllers
ํด๋ ๋ด๋ถ์xxx_controller_test.rb
์ test ๋ฉ์๋๋ก ํ ์คํธ๋ฅผ ์์ฑํ๋ค. ์๋๋ ์์.ํ ์คํธ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ ์์ฒด๋ Unit ํ ์คํธ์ ๊ฐ์ง๋ง, ๋ช ๊ฐ์ง Functional ํ ์คํธ๋ง์ ํฌ์ธํธ๊ฐ ์๋ค.
get ๋ฉ์๋๋ก ์์ฒญ ์์ฑ
Functional ํ ์คํธ์์๋ ์ผ๋จ ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ๊ธฐ ์ํด get ๋ฉ์๋๋ก HTTP ์์ฒญ์ ์์ฑํ๋ค.
์๋๋ ๋งค๊ฐ ๋ณ์ ์ ๋ณด๋ฅผ ํจ๊ป ์ ๋ฌํ๋ ์์ !
Functional ํ ์คํธ์์ ์ด์ฉํ ์ ์๋ ์์ฝ ๋ณ์
Functional ํ ์คํธ์์๋ get, post ๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํ์ ์๋ ์์ฝ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค.
๋ถ๋ฅ
๋ณ์ ์ด๋ฆ
์ค๋ช
๊ฐ์ฒด
@controller
์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ํด๋์ค
๊ฐ์ฒด
@request
์์ฒญ ๊ฐ์ฒด
๊ฐ์ฒด
@response
์๋ต ๊ฐ์ฒด
ํด์
assigns(:key), assigns['key']
๋ทฐ์์ ์ฌ์ฉํ ์ ์๋ ํ ํ๋ฆฟ ๋ณ์
ํด์
cookies[:key]
์ฟ ํค ์ ๋ณด
ํด์
flash[:key]
ํ๋์ ์ ๋ณด
ํด์
session[:key]
์ธ์ ์ ๋ณด
Functional ํ ์คํธ์์ ์ฌ์ฉํ ์ ์๋ assert_xxxx ๋ฉ์๋
Unit ํ ์คํธ์์ ์ผ๋ Assertion ๋ฉ์๋ ๋ง๊ณ ๋ Functional ํ ์คํธ์์ ์ถ๊ฐ๋ก ์ธ ์ ์๋ Assertion๊ฐ ์๋ค. ์ค์ํ ๊ฒ ๋ช ๊ฐ๋ฅผ ์ ๋ฆฌํด๋ณด์๋ฉด ์๋์ ๊ฐ๋ค.
assert_difference
๋ฉ์๋: ์ฒ๋ฆฌ ํ ์ํ ๋ณํ ํ์ธassert_generates
๋ฉ์๋: ๋ผ์ฐํ ๋์ ํ์ธassert_select
๋ฉ์๋: ํ ํ๋ฆฟ ์ถ๋ ฅ ๊ฒฐ๊ณผ ํ์ธ
Integration ํ ์คํธ
Integration ํ ์คํธ(ํตํฉ ํ ์คํธ)๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋๋๋ค๋ฉฐ ์ค์ ์ฌ์ฉ์์ ํ๋์ ๋ชจ๋ฐฉํ ๋ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด ์ฑ ์์ ๊ตฌํํ๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ์๋ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅธ๋ค. Integration ํ ์คํธ๋ก ์ด๋ฐ ๋จ๊ณ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ค์ ๋ก ๋ชจ๋ฐฉํด์ ๊ฐ๊ฐ์ ๋จ๊ณ์์ ์ ๋๋ก ๋ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋์ง๋ฅผ ํ์ธํ ์ ์๋ค.
hello#view ์ก์ ์ ์ ๊ทผ
๋ฏธ์ธ์ฆ ์ํ์ด๋ฏ๋ก, login#index ์ก์ (๋ก๊ทธ์ธ ํ์ด์ง)๋ก ๋ฆฌ๋ค์ด๋ ํธ
๋ก๊ทธ์ธ ํ์ด์ง์์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ธ์ฆ ์ฒ๋ฆฌ
login#auth ์ก์ ์์ ์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด hello#view ์ก์ ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ
ํ ์คํธ ์คํฌ๋ฆฝํธ ์์
ํ ์คํธ ์คํฌ๋ฆฝํธ ์์ฑ
Integration ํ ์คํธ๋ ์ง์
rails generate integration_test xxxxx
๋ช ๋ น์ด๋ก ์์ฑํด์ค์ผํ๋ค.ํ ์คํธ ์คํฌ๋ฆฝํธ ์์ฑ ์์ ์์๋ก ์ ์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ธํ๋ ์ฝ๋ ์์๋ ์๋์ ๊ฐ๋ค.
์ค๊ฐ ์ค๊ฐ์ ์๋
follow_redirect!
๋ ์๋ต์ ์๋ ๋ฆฌ๋ค์ด๋ ํธ ๋์์ผ๋ก ๋ค์ ์์ฒญํ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ฏธ์ธ์ฆ ์ํ์ ์ฌ์ฉ์๊ฐ/hello/view
์ ์ ๊ทผํ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ผ๋ ์๋ต์ ๋ฐ๊ฒ ๋ ํ ๋ฐ, ์ด ๋ ๋ฐ์ ๋ฆฌ๋ค์ด๋ ํธ ๋์์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋ชจ๋ฐฉํ๋ ๊ฒ์ด๋ค.ํ ์คํธ ์คํฌ๋ฆฝํธ ์คํ
rake test:integration
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์คํธ๋ฅผ ์คํ์ํฌ ์ ์๋ค.
ํ์ต ๋ด์ฉ์ ๋ํ ๊ฐ์ธ์ ์ธ ์ดํ
RESTful, Test ๋ ๋ชจ๋ ์ทจ์ ๊ณต๊ณ ๋ฅผ ๋ณด๋ฉด ์์ฃผ ๋ง๋ ์ ์๋ ํค์๋์ ๋๋ค. Rails๋ฅผ ํ์ตํ๋ ๊ณผ์ ์์ ์ด ๋์ ์ฝ๊ฐ์ด๋๋ง ๋ง๋ณผ ์ ์๋๊ฒ ์ข๋ค์. Rails๋ฅผ ํ์ตํ ๋๋ง๋ค nest.js๋ spring ํ์ต์ ์๊ฐ์ ์ฐ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ์์๋ค๊ธด ํ์ง๋ง, ์ด๋ฐ ์์ผ๋ก '๋ฐฑ์๋'์ ํ์ํ ๊ฐ๋ ๊ณผ ๊ธฐ์ ์ ํ์คํ ํ์ตํด๋ฒ๋ฆฌ๋ ๊ธฐํ๋ก ์ผ์์ผ๊ฒ ์ต๋๋ค.
๋ค์ ํ์ต ๊ณํ
๋ฃจ๋น์จ๋ ์ผ์ฆ ํด๋ผ์ด์ธํธ๋จ ํ๊ธฐ
Last updated