본문 바로가기

RUBY ON RAILS

Ruby의 기본 문법 (반복문과 조건문) + <form> 태그

안녕하세요 멋사3기 Kyunni입니다.

다섯 번째 강의는 반복문과 조건문, 그리고 <form>태그의 사용방법에 대하여 학습하였습니다. 강의에서는 반복문→조건문→<form>태그 순으로 진행이 되었지만, 포스팅에서는 조건문→반복문<form>태그 순으로 진행하겠습니다. :)


# 시작하기에 앞서, 도메인을 입력하였을 때에 해당 액션을 바로 띄워주는 routes 파일의 명령문을 남기도록 하겠습니다. 이 명령문을 적용시키게 되면, index.html 파일 대신 "도메인/controller/action"의 내용이 도메인 화면에 출력됩니다.

root :to => "pages#show"


조건문 (분기문)

조건문이란, 프로그래머가 명시한 불린 자료형 조건이 참인지 거짓인지에 따라 달라지는 계산이나 상황을 수행하는 프로그래밍 문법입니다. 

1. if문
흔히 if statement를 사용하게 되죠. 이는 Ruby 뿐만 아니라 다른 언어에서도 적용이 되므로 if문에 대하여 보다 정확히 알아두시는 것이 좋습니다.

if condition
    ...statement...
elseif condition
    ...statement...
else
    ...statement...
end

위의 코드에서 최종적으로 @lion에 저장되는 문자열은 무엇일까요? 답은 7이 10보다 작으므로, "smaller than 10"이 저장됩니다.

2. unless문
unless문은 if문의 부정형으로 if 대신 unless를 사용해주면 됩니다. (~가 아닐 때, -)

unless condition
    ...statement...
else    
    ...statement...
end

3. case문
case문은 다른 언어에서 switch문입니다. 두 가지의 사용법이 있으므로, 두 가지의 사용법을 모두 알아보도록 하겠습니다.

case object
when condition
    ...
statement...
end

보통 라디오버튼이나 체크박스 등의 결과에 따라 달라지는 경우나 한 가지 변수가 if -else 문의 형태로 elseif 문에 너무나도 많이 사용되어야할 때에 많이 사용이 되는 문법입니다.


반복문

Ruby 언어에서 반복문의 종류는 다양합니다. 다른 언어에도 공통으로 존재하는 while문, for문, 그리고 Ruby에서 흔하게 사용되는 반복자(iterator)를 이용한 반복문까지 있습니다 (Ruby에서는 대개 반복자(iterator)를 택합니다.). 이렇게 다양한 반복문의 형태를 차근차근 정리해보도록 하겠습니다. 

1. while문
모든 언어에 포함되어있는 while문은 사실상 반복문 중에서 가장 간단합니다(물론 언어마다 구체적인 문법은 조금씩 다릅니다.). 조건이 참일 경우, while과 end 사이의 statement를 실행시켜 주기만 하면 됩니다. (대괄호인 [ ] 안의 내용은 생략 가능합니다.)

while condition [do]
    ...statement...
end

2. for문
while문 만큼이나 대다수의 언어에서 많이 쓰이는 반복문이 바로 for문입니다.

for variable [, variable ... ] in expression [do]
    ...statement...
end

위의 코드를 간단히 분석하자면, i라는 variable이 0부터 5까지 반복하면서 "Hello Ruby!"라는 문자열을 출력해줍니다. 

3. Iterator(반복자)
반복자의 종류 또한 다양합니다. 이번 포스팅에서는 크게 each, upto, downto로 총 세 가지의 iterator를 소개해드리겠습니다.

(expression).each do |variable[, variable...]|
    ...statement...
end

(integer).upto(integer) do |variable[, variable...]|

    ...statement...
end

(expression).downto(integer) do |variable[, variable...]|

    ...statement...
end

each의 경우, 보통 Array 각각의 요소를 뽑아낼 때에 사용이 되어, 그 요소들이 variable에 하나씩 대입이 되면서 iterate가 진행이 됩니다. 예시를 살펴보면, @kyunni라는 배열에 담겨있는 "one", "two", "three"라는 문자열이 each라는 함수를 통해 lion에 매번 대입되며 각각이 출력되게 됩니다.

두 번째와 세 번째에 기술해둔 upto와 downto는 두 쌍이 상반되는 의미를 지녔습니다. upto의 경우 첫 번째 integer부터 괄호안의 integer까지 반복할 때마다 1씩 증가하며 variable에 대입됩니다. 반대로 downto의 경우 반복할 때마다 1씩 감소하게 됩니다.        


<form> 태그의 이해 및 사용법

form은 클라이언트의 의견이나 정보를 알기 위해 입력할 큰 틀을 만드는 데에 사용이 되므로, 굉장히 많이 사용됩니다. (예를 들어, 로그인, 회원가입, 게시판의 글 작성 등) 폼을 통해 입력된 데이터는 한 번에 서버로 전송되어 웹서버 측에서 처리하고, 처리된 결과에 따라 웹페이지에 보여지게 됩니다. 이번 포스팅에서는 폼의 내부적인 동작과정부터 폼의 큰 틀을 구성하는 엘리먼트에 대해 알아보겠습니다.

1. <form> 태그의 동작방법

  1. 폼이 있는 웹페이지를 방문합니다.

  2. 폼 내용을 입력합니다.

  3. 폼 안에 있는 모든 데이터를 웹서버로 보냅니다.

  4. 웹 서버는 받은 폼 데이터를 처리하기 위해 웹 프로그램으로 넘깁니다.

  5. 웹 프로그램은 폼 데이터를 처리합니다.

  6. 처리결과에 따른 새로운 html 페이지를 웹 서버에 보냅니다.

  7. 웹 서버는 받은 html 페이지를 브러우저에 보냅니다.

  8. 브라우저는 받은 html 페이지를 보여줍니다.


2. form 태그의 형식 및 구성요소

<form name="form_name" action="서버로 전송한 데이터를 수신할 URL" method="method_type">
    <input type="text" name="input_name" value="
input_value">
    <input type="submit" name="input_name" value="input_value">
</form>

  • action: 폼을 전송할 서버단 스크립트 파일 지정

  • name: 폼을 식별하기 위한 이름 지정

  • method: 폼을 서버에 전송할 http 메소드 지정(GET/POST)

  • input type: 태그모양을 다양하게 변경 가능, ex) text, radio, submit, button, reset 등


3. GET vs POST

전송할 http 메소드 종류인 GET과 POST는 브라우저에서 폼 데이터를 가져와 서버로 보내는 똑같은 기능을 수행하지만, 방식이 다릅니다. 

GET

POST 

 - URL에 정보가 담겨서 전송된다.
 - 전송할 수 있는 정보의 길이가 제한되어 있다.
 - 퍼머링크로 사용될 수 있다.

 - header의 body에 담겨서 전송된다.
 - URL 상에 전달한정보가 표시되지 않는다.
 - GET에 비해서 보안상 약간의 우위에 있다. (사실상 동일)
 - 퍼머링크로 사용될 수 없다.
 - 서버 쪽에 어떤 작업을 명령할 때 사용한다.
 (데이터의 기록, 삭제, 수정 등)

# 퍼머링크(permalink)란?
인터넷에서 특정 페이지에 영구적으로 할당된 URL 주소. 즉, 고유 링크나 고유 주소입니다. 

 

4. 사용 예

앞서 포스팅에서와 마찬가지로 프로젝트명은 test, 컨트롤러는 lion, erb 파일은 input.erb, output.erb로 먼저 만들어놓았다는 가정하에 진행하겠습니다.

 > input.erb

form 태그를 살펴보면, method는 GET 방식을 사용하여 입력된 내용을 전달합니다. (POST도 가능합니다.)

 > lion.rb

정보를 얻어오고자 하는 input 태그의 name을 params[:fname]의 형태로 컨트롤러 파일에 전달합니다.

 > output.erb

 > routes.rb
method 방식을 get으로 사용했으므로, get의 형태로 라우트 파일에 적용시켜줍니다.

[결과화면]