이 블로그 검색
2012년 9월 3일 월요일
Ruby on Rails 간단 게시판 다시 만들어보기
예제 소스: https://github.com/jeremyko/RailsBoardSample/tree/moreRailsWay
참고한 문서 : http://ruby.railstutorial.org/ruby-on-rails-tutorial-book
앞서 예제를 좀더 수정해서 약간 더 개선시킨 소스이다. 추가된 부분은 다음과 같다.
1. RESTful routing
2. form_for , 모델을 폼과 연결
3. Partial 사용, 중복 제거
4. Validation check
5. bootstrap-sass
1. RESTful 제공
rails가 제공하는 resources 메서드 를 호출해서 RESTful한 route를 사용할수 있다.
route.rb 파일을 다음처럼 변경한다.
* route.rb
RailsBoard::Application.routes.draw do
root :to => 'my_rails_board_rows#index'
#REST-style URI
resources :my_rails_board_rows
#matchs...
match '/listSpecificPageWork', to: 'my_rails_board_rows#listSpecificPageWork'
match '/searchWithSubject', to: 'my_rails_board_rows#searchWithSubject'
match '/EditViaPostReq', to: 'my_rails_board_rows#EditViaPostReq'
end
이렇게 한줄 추가함으로서 rails에서 처리가능한 route는 다음처럼 구성되게 된다.
< Table 1 RESTful URI >
# ------------------------------------------------------------------------------------
# request URI Action Purpose
# ------------------------------------------------------------------------------------
# GET /my_rails_board_rows index 모든 게시물들 조회
# GET /my_rails_board_rows/1 show id 1의 게시물 조회
# GET /my_rails_board_rows/new new 새로운 게시물 작성을 위한 화면 보임
# POST /my_rails_board_rows create 새로운 게시물을 생성 처리
# GET /my_rails_board_rows/1/edit edit id 1 게시물 수정을 위한 화면 보임
# PUT /my_rails_board_rows/1 update id 1 게시물 수정 작업 처리
# DELETE /my_rails_board_rows/1 destroy id 1 게시물 삭제 처리
게시물 CRUD 처리를 RESTful하게 처리하기 때문에, 이전 예제와 비교시 action이 간단해졌다. 또한 Rails는 url을 간단하게 표시할수 있게끔 helper를 같이 생성해주는데, resources :my_rails_board_rows 의 경우 다음과 같은 helper들이 생성된다.
------------------------------------------------------------------------------------
helper 호출시 return 되는 값
------------------------------------------------------------------------------------
my_rails_board_rows_path /my_rails_board_rows
new_my_rails_board_row_path /my_rails_board_rows/new
edit_my_rails_board_row_path(:id) /my_rails_board_rows/:id/edit
my_rails_board_row_path(:id) /my_rails_board_rows/:id
RESTful 구현을 위해 컨트롤러를 작성해보자
resources 호출로 RSESTful한 접근을 설정한 경우, Rails 는 위에서 표시된 것처럼(예를 들어, my_rails_board_rows/new), 모델명을 기준으로 컨트롤러를 찾게 된다. 즉, my_rails_board_rows_controller.rb를 찾는데, 현재 이 파일이 없으므로 생성해줘야 한다.
2012년 8월 28일 화요일
Ruby on Rails 간단 게시판
(rails 에 관심있는 새내기에 의한, 새내기를 위한 글 입니다~~).
요즘 취미로 Ruby on Rails 에 대해 공부하고 있는데, 간단한 게시판 예제를 작성 해보자.
이 예제의 소스는 여기서 받을수 있다.
https://github.com/jeremyko/RailsBoardSample
여기서 만들 게시판은 앞서 spring, django 에서 예제로 만든것 과 동일한 기능의 게시판이다. 간단한 기능을 가진 게시판이라서, Rails가 제공해주는 scaffolding 을 사용하면 10분 이내로도 작성이 가능할 수 있지만, 이 예제에서는 scaffolding 을 사용하지 않고 처음부터 작성하는것으로 한다. 그리고 Rails 에서 가능한 여러 기능들 즉, RSpec을 사용한 BDD, REST지원, validation check, coffee script, 뷰에서의 partial 등은 일단 간단 게시판을 먼저 작성한후, 향후 포스팅을 통해서 점차 적용시켜보도록 할것이다.
rails와 ruby 개발 환경은 완료된 상태라고 가정한다.
이 예제에서의 사용된 개발환경은 다음과 같다.
ruby 1.9.3p194 (2012-04-20) [i386-mingw32]
Rails 3.2.8
그리고 사용할 DB는 기본 Sqlite 로 하기로 한다.
만약, Oracle 사용시에는 그에 따른 약간의 소스 코드 수정이 필요한데, 그것은 주석으로 표시하였다.
2012년 8월 8일 수요일
Django 게시판 만들기 4 - 검색 기능 구현
이제 검색 기능만 구현하면 이 간단 게시판은 완성이다. 우리는 전체목록 출력을 위한 listSpecificPage.html 템플릿 작성시, 검색 버튼을 누르면 /searchWithSubject/ 로 이동하게 해 놓았다. 그러므로, 지금까지 해왔던 것처럼 url 맵핑 및 컨트롤러 구현을 실시한다.
- url 맵핑
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
url(r'^DoWriteBoard/$', views.DoWriteBoard),
url(r'^listSpecificPageWork/$', views.listSpecificPageWork),
url(r'^viewWork/$', views.viewWork),
url(r'^listSearchedSpecificPageWork/$', views.listSearchedSpecificPageWork),
url(r'^listSpecificPageWork_to_update/$', views.listSpecificPageWork_to_update),
url(r'^updateBoard/$', views.updateBoard),
url(r'^DeleteSpecificRow/$', views.DeleteSpecificRow),
url(r'^searchWithSubject/$', views.searchWithSubject),
)
- 컨트롤러 작성
@csrf_exempt
def searchWithSubject(request):
searchStr = request.POST['searchStr']
print 'searchStr', searchStr
url = '/listSearchedSpecificPageWork?searchStr=' + searchStr +'&pageForView=1'
return HttpResponseRedirect(url)
컨트롤러는 이미 우리가 작성해 놓은 /listSearchedSpecificPageWork 로 redirection 만을 하고 있다. 이전 시간에 게시물 보기 기능을 구현하면서 목록으로 돌아가기 기능 구현시, 먼저 검색을 위한 컨트롤러를 작성해 놓은 것이 기억날 것이다. 원래 그것은 검색 기능 구현시에 작성이 되어야 했던 것 (즉 지금)인데, 먼저 작성을 했었다. 그때 작성해놓은 것을 지금 사용하는것이니 착오없기를 바란다. 이미 만들어 놓은것이 있기 때문에 검색 기능 구현은 이처럼 간단하게 끝난다.
지금까지 django를 이용한 간단 게시판 작성 예제를 만들어 보았다. 오로지 실제 돌아가는 게시판 속성 작성을 염두에 두고 글을 썼고, django를 이루는 상세 내용은 건너뛴 부분이 많기 때문에 지금까지의 내용만 가지고는 django를 상세히 알수 없을 것이다. 자세한 세부 사항은 공식 사이트 문서를 참조하시길 바라면서 나처럼 실질적인 예제를 찾고 계셨던 분들에게 조금이나마 도움이 되었으면 하는 바람이다.
이 예제의 전체 소스는 아래에서 받을 수 있다.
https://github.com/jeremyko/dj_board
참고
https://www.djangoproject.com/
http://www.djangobook.com/en/2.0/
2012년 8월 7일 화요일
Django 게시판 만들기 3 - 글 조회 및 수정, 삭제 기능 구현
목록에서 글 보기를 위한 url은 /viewWork 로 설정했고, GET방식으로 글 조회를 위한 정보를 전달하게 되어 있었다. 그럼 할일은 앞서와 마찬가지로 url 과 컨트롤러 맵핑이 되겠다. 먼저 컨트롤러 추가.
def viewWork(request):
pk= request.GET['memo_id']
boardData = DjangoBoard.objects.get(id=pk)
# 조회수를 늘린다.
DjangoBoard.objects.filter(id=pk).update(hits = boardData.hits + 1)
return render_to_response('viewMemo.html', {'memo_id': request.GET['memo_id'],
'current_page':request.GET['current_page'],
'searchStr': request.GET['searchStr'],
'boardData': boardData } )
여기서는 테이블의 PK값인 id를 알고 있으므로, model의 DjangoBoard.objects.get(id=pk) 츨 호출해서 해당 데이터를 얻을수 있다. 그리고 구한 게시물 정보를 템플릿으로 넘겨주고 있다. url을 추가한다.
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
url(r'^DoWriteBoard/$', views.DoWriteBoard),
url(r'^listSpecificPageWork/$', views.listSpecificPageWork),
url(r'^viewWork/$', views.viewWork),
)
그 다음은? viewMemo.html 템플릿을 생성한다. 간단한 게시판이라서 그런지 정말 간단하다.^^
<html>
<head>
<title>글보기</title>
</head>
<script language="javascript">
function boardlist()
{
var s = "{{searchStr}}";
if(s=="None")
location.href = '/listSpecificPageWork?current_page={{current_page}}';
else
location.href = '/listSearchedSpecificPageWork?pageForView={{current_page}}&searchStr={{searchStr}}';
}
function boardmodify()
{
location.href='/listSpecificPageWork_to_update?memo_id={{memo_id}}¤t_page={{current_page}}&searchStr={{searchStr}}';
}
function boarddelete()
{
location.href='/DeleteSpecificRow?memo_id={{memo_id}}¤t_page={{current_page}}';
}
</script>
<table cellspacing = 0 cellpadding = 5 border = 1 width=500>
<tr><td><b>조회수</b></td><td> {{ boardData.hits }} </td></tr>
<tr><td><b>이름 </b></td><td> {{ boardData.name }} </td></tr>
<tr><td><b>이메일 </b></td><td> {{ boardData.mail }} </td></tr>
<tr><td><b>제목 </b></td><td> {{ boardData.subject }} </td></tr>
<tr><td><b>내용 </b></td><td width=350> {{ boardData.memo }} </td></tr>
</table>
<table cellspacing = 0 cellpadding = 0 border = 0 width=500>
<tr><td>
<input type=button value="수정" OnClick="javascript:boardmodify()">
<input type=button value="목록" OnClick="javascript:boardlist()">
<input type=button value="삭제" OnClick="javascript:boarddelete()">
</td></tr>
</table>
</html>
여기까지 작업한 결과, 글 목록에서 해당 게시물을 클릭하면 다음처럼 내용이 조회된다.
Django 게시판 만들기 2 - 글쓰기 기능 구현
글쓰기 기능 구현
이제 글쓰기 기능을 구현할 차례이다. 글쓰기 버튼을 클릭시에 /show_write_form 이 호출되므로, 이 url을 컨트롤러에 맵핑해서 글쓰기 기능을 구현하면 된다. 먼저 /sample_board/view.py파일에 글쓰기를 위한 컨트롤러를 추가한다.
def show_write_form(request):
return render_to_response('writeBoard.html')
그리고 dj_board/urls.py 에 다음처럼 추가한다.
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
)
요청을 받으면 글작성을 위한 템플릿만을 화면에 출력하는 부분이므로 간단하게 처리한다. 그럼 이제, writeBoard.html 템플릿을 작성해야 한다. templates 폴더에 writeBoard.html 를 다음처럼 생성한다. form을 이용한 간단한 작성화면이 되겠다.
이제 글쓰기 기능을 구현할 차례이다. 글쓰기 버튼을 클릭시에 /show_write_form 이 호출되므로, 이 url을 컨트롤러에 맵핑해서 글쓰기 기능을 구현하면 된다. 먼저 /sample_board/view.py파일에 글쓰기를 위한 컨트롤러를 추가한다.
def show_write_form(request):
return render_to_response('writeBoard.html')
그리고 dj_board/urls.py 에 다음처럼 추가한다.
urlpatterns = patterns('',
url(r'^$', views.home),
url(r'^show_write_form/$', views.show_write_form),
)
요청을 받으면 글작성을 위한 템플릿만을 화면에 출력하는 부분이므로 간단하게 처리한다. 그럼 이제, writeBoard.html 템플릿을 작성해야 한다. templates 폴더에 writeBoard.html 를 다음처럼 생성한다. form을 이용한 간단한 작성화면이 되겠다.
Django 게시판 만들기 1 - 설치 및 설정
Python 을 이용한 웹 개발 프레임워크인 django를 이용해서, 간단한 게시판을 만들어 보자. 앞서 스프링을 이용해서 작성된 게시판 과 동일한 기능을 수행하는 간단한 게시판이다. 먼저 django 프레임워크를 설치해야 한다.
2019-05-06 : 이글은 2012년도 기준으로 설명된 글이라서 현재 최신 django 버전과 일치 안되는 부분이 많습니다. 공식 django 문서를 참고하시기 바랍니다. (시간나는데로 업데이트 해보려고는 하는데 기약이 없음).
1. django 프레임워크 설치
* python 설치 : 일단 python이 설치가 되어 있어야 한다.
* Django 설치
직접 다운로드 받아 압축을 풀어서 셋업을 수행해도 되고, Svc, Git 등을 이용해서 최신소스를 받아오는 방법도 있다. 나는 git을 사용하므로 다음처럼 적당한 위치의 폴더에서 clone을 생성하여 소스를 받았다.
git clone https://github.com/django/django.git
그다음, 받은 폴더에서 다음을 수행한다.
python setup.py install
만약 'ImportError: No module named setuptools' 에러를 만나면 다음을 실행한다.
sudo curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
파이선에서 다음을 실행해서 django 가 제대로 설치되었는지 확인한다.
>>> import django
>>> print django.get_version()
혹은
>>> print (django.get_version())
혹은
>>> python -m django --version
3.0
버전을 출력하면 설치는 제대로 된것이다.
* 윈도우 환경에서는 환경변수 PATH 설정:
django가 설치되면 python 설치 폴더의 \Lib\site-packages 안에 django가 복사된다. 이 경로를 PATH에 추가한다. python 설치 폴더\Lib\site-packages\django\bin; 를 추가. python을 처음 설치했다면, python bin 경로도 PATH에 추가하는것을 잊지말자.
2. 프로젝트 생성 및 설정
이제 환경 설정이 완료되었으니, 실제 게시판을 생성해보자. 프로젝트 생성을 원하는 위치에서 다음 명령을 수행한다.
django-admin startproject dj_board
django게시판이란 의미로 프로젝트명을 dj_board로 하였다. 다음처럼 디렉토리가 구성된다.
dj_board/
manage.py
dj_board/
__init__.py
settings.py
urls.py
wsgi.py
본격적인 개발에 앞서 간단한 테스트를 해보자, 생성한 프로젝트 폴더에서 django에 내장된 개발용 웹 서버를 실행한다.
2012년 7월 24일 화요일
MyBatis-Spring : mapper interface 와 annotation을 활용한 게시판 예제
MyBatis-Spring : mapper interface 와 annotation을 활용한 게시판 예제
지난번 MyBatis-Spring 에 대한 소개 에 이어서, 이를 활용한 간단한 게시판 작성 예제를 작성해본다. XML파일에 맵핑을 정의하지 않고, mapper interface 와 annotation을 이용해서 처리하는것으로 해봤다. 게시판은 전체 목록 출력, 검색기능, 내용보기 및 수정, 삭제등의 아주 기본적인 기능만을 다루고 있다. 이 프로젝트의 소스는 다음 위치에 있으니 참조하시길 바란다.
https://github.com/jeremyko/SpringMvcBoardMyBatis
1. 우선 기본적인 스프링 MVC 프로젝트를 생성한다.
간단하게 설명하기 위해서 스프링 환경 설정 부분은 생략했다. 일단 사용된 툴만 적어 보면 다음과 같다 (환경들은 알아서들 잘 맞추시길..자바는 환경 설정이 제일 어려운것 같다.^^).
- Eclipse Indigo(3.7)
- apache-tomcat-7.0.27
- Maven Integration for Eclipse
- SpringSource Tool Suite (STS) for Eclipse Indigo(3.7)
- 데이터베이스: oracle 11g XE
사용된 이클립스 플러그인은 help -> Eclipse Marketplace 에서 검색.이클립스 file -> new -> others -> SpringSource Tool Suite -> Spring Template Project -> Spring MVC Project 로 프로젝트를 생성.
그다음 pom.xml 파일을 열어서 dependency에 mybatis-spring 을 추가한다
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.1.1</version>
</dependency>
추가된 dependency를 반영하기 위해서 Run As -> Maven install을 수행한다.
Run As -> Run on Server로 생성된 프로젝트가 정상 작동 하는지 확인하기 바란다.
Hello World 라고 큼지막하게 웹 페이지가 뜨면 성공이다.
2. 게시판 테이블 및 seq 생성
이 예제에서는 오라클을 이용하고 있다. XE버전은 무료라서 개인이 사용하기에 좋은것 같다. 단지 단점이라면 리소스를 많이 잡아먹는다 (500 MB 메모리 사용). 이클립스가 사용하는 리소스도 상당한데, Oracle까지 돌리면 기본 1GB 정도는 그냥 두놈이 차지하게 된다. 컴에 램이 4GB 는 되어야 좀 돌릴만하다. 만약 다른 DB를 사용한다면, 아래의 내용을 참조로 수정이 필요할 수도 있겠다.
CREATE SEQUENCE "SEQ_ID" MINVALUE 1 MAXVALUE 99999999999
INCREMENT BY 1 START WITH 1 ;
CREATE TABLE "SPRING_BOARD"
(
"ID" NUMBER(10,0) NOT NULL,
"SUBJECT" VARCHAR2(50),
"NAME" VARCHAR2(50),
"CREATED_DATE" DATE,
"MAIL" VARCHAR2(50),
"MEMO" VARCHAR2(200),
"HITS" NUMBER(10,0),
PRIMARY KEY ("ID") ENABLE
) ;
피드 구독하기:
글 (Atom)
