웹 브라우저를 이용해서 localhost:9000에 접근했다.
https://lh3.googleusercontent.com/-Guq4-WEhF0E/VGoHjeXv6EI/AAAAAAAAEdo/O8C02u7Q59c/w729-h470-no/go_revel_01.png
이렇게 뜨면 성공
revel은 app/밑에 있는 파일들이 변경되는 지를 검사한다. 만약 파일이 변경된다면, 애플리케이션을 리빌드 한다. 반면 app/바깥쪽에 있는 파일들은 변경여부를 검사하지 않는다. 만약 웹 애플리케이션이 app/ 바깥쪽에 있는 파일의 영향을 받는다면, 개발자가 직접 recompile를 해야 한다.
views 디렉토리밑에는 템플릿(Template)파일들이 있다. 메서드 이름과 같은 이름으로 템플릿 파일을 만들면 된다.
Ruby on Rails, Django등의 웹 애플리케이션 프레임워크를 다뤄본 경험이 있다면, routes는 익숙한 개념일 거다. Routes는 유저의 요청을 어느 방향(파일)로 보낼지를 결정하기 위해서 사용한다. 이 파일은 conf/routes에 있다. Root(localhost:9000/) 요청에 대한 라우트 값을 살펴보자.
모든 컨트롤러들은 반드시 *revel.Controller 구조체를 포함하고 있어야 한다. 그리고 처리 결과로 revel.Result를 반환한다.
Revel 컨트롤러는 요청을 처리하기 위한 유용한 메서드들을 제공한다. 예를들어서 Render()메서드는 템플릿 파일을 찾아서 응답코드(200 OK)와 함께 HTML 파일을 만들어서 출력한다.
모든 템플릿은 app/views 디렉토리에 있다. 템플릿 이름을 명시하지 않을 경우, revel은 action의 이름과 일치하는 템플릿을 찾는다. hello_go의 경우에는 app/views/App/Index.html파일을 찾아서 렌더링 한다. 템플릿 파일은 GO Template 포맷으로 작성한다.
으로 변경해 보자.
브라우저를 리플레쉬(refresh)하면, 변경된 내용이 즉시 반영되는 걸 확인할 수 잇을 것이다. Revel은 template 파일이 변경되는 걸 검사해서 리플레쉬하는 기능을 가지고 있다.
템플릿파일은 동적으로 갱신이 된다고 치고, 코드의 변경내용도 갱신되는지 확인해 보자. app/controllers/app.go의 코드를 (에러가 발생하도록)바꿨다.
이제 브라우저를 다시 리프레쉬 해보자. 아래와 같은 디버깅 메시지를 확인할 수 있을 거다.
https://lh6.googleusercontent.com/-nUcBU1YGQhQ/VGoW9T9UWrI/AAAAAAAAEe0/_hutn5W6GcE/w729-h388-no/go_revel_02.png
이제 템플릿을 수정해 보자. app/controllers/app.go를 아래와 같이 수정한다.
브라우저로 보는 화면은 아래와 같다.
https://lh3.googleusercontent.com/-hC8d2vYkhs0/VGtYIgmXLhI/AAAAAAAAEik/_5X4aVEaUOA/w653-h377-no/go_revel_05.png
값(나는 yundream을 입력했다.)을 입력하고 submit 버튼을 클릭하면, Page Not Found 에러가 떨어질 거다.
https://lh3.googleusercontent.com/-UhPAt2jN4b8/VGta8hYTWYI/AAAAAAAAEjI/APfLyAGkdVQ/w772-h427-no/go_revel_06.png
app/controllers/app.go에 Hello 메서드를 추가하자.
페이지를 리프레시 하면, 제대로된 HTML 문서를 확인할 수 있다.
https://lh5.googleusercontent.com/-54e5VHMR2OU/VGtdlah_O0I/AAAAAAAAEj4/UJ02hxu9ce8/w817-h471-no/go_revel_07.png
마지막으로 매개변수에 대한 validation 체크를 해보자. 나는 매개변수 myName에 대해서 "반드시 값이 설정돼 있어야 할 것", "3자 이상일것", "16자 미만일 것" 3가지 조건을 검사하기로 했다. Revel 에서 제공하는 validation module를 이용하면, 간단하게 검사할 수 있다. 아래와 같이 app/controlers/app.go를 수정했다.
1
2
3
4
5
6
7
8
9
10
11
12
func (c App) Hello(myName string) revel.Result {
c.Validation.Required(myName).Message("Your name is required!")
c.Validation.MinSize(myName, 3).Message("Your name is not long enough!")
c.Validation.MaxSize(myName, 16).Message("Your name is too long!")
프로토타이핑 외에 웹 프레임워크를 사용해 본적은 없고, 사용했던 웹 프레임워크도 경량 프레임워크(Sinatra) 정도다. 아직은 어느 정도의 생산성을 보장해 줄지를 예상하기에는 아직 경험과 정보가 부족하지만, 지금까지의 느낌을 정리한다.
아직 1.0 버전이 아니다. 1.0 final 단계라고 하니, 조만간 1.0 버전이 나오지 않을까 싶다. Revel 사이트에 들어 갔더니 "거의 완성 단계지만 여전히 많은 부분이 녀경되고 있다. 손을 더러히고 싶지 않다면, 지금 프로젝트에 적용하지는 말라"라고 경고하고 있다.
Ruby on Rails, Play와 구조적으로 매우 유사하다. 이들 프레임워크를 사용한 경험이 있다면, 쉽게 적응할 수 있다. (Sinatra로 다룬 나도 쉽게 적응할 수 있었다. 사실 Sinatra도 Monk와 함께 사용하면서 Rails와 비슷한 구조로 개발했지만...)
템플릿 뿐만 아니라 Code까지 (서버 리스타트 없이)변경 내용을 즉시 확인할 수 있어서 편하다.
Contents
1. 환경
2. 설치
3. revel 웹 애플리케이션 생성
3.1. revel 웹 애플리케이션 구조
3.1.1. app/ 디렉토리
4. revel web 애플리케이션 개발
4.1. Routes
4.2. Acions
4.3. Template
4.4. Hot-reload
5. Hello world App
6. 정리
1. 환경
2. 설치
3. revel 웹 애플리케이션 생성
3.1. revel 웹 애플리케이션 구조
3.1.1. app/ 디렉토리
4. revel web 애플리케이션 개발
4.1. Routes
4.2. Acions
4.3. Template
4.4. Hot-reload
5. Hello world App
6. 정리
Recent Posts
Archive Posts
Tags