2012. 1. 18. 08:49 IT

블로깅 때문에 검색하다가 우연히 발견. 

http://grailsboston.com  

무려 h2 database로 운영한다 ㅎㅎ

플러그인 목록을 보면서 이것저것 생각하게 되는데 ( http://grailsboston.com/twittersearcher/plugin/list  )

(정말 작은 커뮤니티를 가지고 많이도 만들었네... )
 
posted by smplnote
2012. 1. 18. 08:20 IT

Jump Into Grails 2.0 스크린캐스트 ( http://grails.org/screencast/show/31 ) 를 따라해봄
 

1. 플러그인 추가
 

conf/BuildConfig.groovy
---------------------------
    plugins {
                ... 
runtime ":spring-security-core:1.2.7"
                ... 
    }

2. compile을 이용하여 플러그인 자동설치 
>grails compile

실행이 잘되면 "s2-quickstart" script를 실행하라는 메세지가 나온다. 

cf) 여기서 제대로 안되고 다운로드를 실패하면 바로 이전 글 "Grails에서 플러그인 설치실패" http://pffm.tistory.com/273  내용을 참고바람.

3. spring security 초기화 및 도메인 클래스 생성 
다음과 같이 실행하여 초기화 및 도메인 클래스를 생성하는 작업을 수행한다. 
>grails s2-quickstart org.example.demo User Role
 
작업이 끝나면 conf/Config.groovy 에 수정이 반영되었으니 확인하라는 메세지가 나온다. 

하단에 세줄이 추가된 것을 알 수 있다. 
conf/Config.groovy
 
---------------------------
grails.plugins.springsecurity.userLookup.userDomainClassName = 'org.example.demo.User'
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'org.example.demo.UserRole'
grails.plugins.springsecurity.authority.className = 'org.example.demo.Role'

여기에 한줄 더 추가 입력 (로긴 성공시 기본으로 갈 Url)
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/home' 


4. 테스트용 컨트롤러 생성
이제  home 과  publiccontroller 를 만들고.. 
>grails create-controller home
>grails create-controller  public


5. 각각 컨트롤러의 접근 권한을 다르게 부여

- 접근 권한이 불필요한곳
class PublicController{
    def index() { render 'public' }

- 명시적으로 접근권한 부여 (Secured annotation 사용)
import grails.plugins.springsecurity.Secured
@Secured(['ROLE_USER'])
class HomeController {
    def index() { render 'home' }

    @Secured(['ROLE_ADMIN'])
    def adminOnly() { render 'admin' }
}


6. 부트스트랩에 USER, ROLE  사전 등록작업  
 conf/BootStrap.groovy
--------------------------
 import org.example.demo.* // import 문 추가 
...
    def init = { servletContext ->   // init 안에 추가 
        // admin Role과 userRole 을 생성 
def adminRole = Role.findByAuthority('ROLE_ADMIN') ?: new Role(authority: 'ROLE_ADMIN').save(failOnError: true)
def userRole = Role.findByAuthority('ROLE_USER') ?: new Role(authority: 'ROLE_USER').save(failOnError: true)

        // user role을 가진 bobby와 admini role을 가진 adminuser를 생성  
def user1 = User.findByUsername('bobby') ?: new User(username: 'bobby', enabled:true, password: 'pass').save(failOnError: true)
if(!user1.authorities.contains(userRole)){
UserRole.create user1, userRole, true
}
def user2 = User.findByUsername('admin') ?: new User(username: 'adminuser', enabled:true, password: 'pass').save(failOnError: true)
        if(!user2.authorities.contains(userRole)){ UserRole.create user2, userRole, true }
        if(!user2.authorities.contains(adminRole)){ UserRole.create user2, adminRole, true } 
 
 7. 확인작업
>grails run-app
 | Server running. Browse to http://localhost:8080/demo

1) http://localhost:8080/demo/public 은 로그인 없이 접근 OK
2) http://localhost:8080/demo/home 은 로그린 화면으로 redirection
3) bobby 로그인 후 http://localhost:8080/demo/home/index 접근 OK
4) bobby 로그인 후 http://localhost:8080/demo/home/adminOnly 접근 불가
5) adminuser 로그인 후  http://localhost:8080/demo/home/adminOnly 접근 OK

8. User에 필드 추가하기 (option)
도메인 클래스만 손보면 알아서 추가해줌... (당연한거잖아.. )

ex) 사용자 정보에 nick 을 추가한다면.. 
User.groovy 
----------------
String nick; // 사용자 정보에 nick 필드 추가 

// 참고로 마지막  encodePassword 메소드를 보면 password 필드를 암호화처리해주고 있음을 알 수 있다.
 
물론..  BootStrap.groovy 안에서도 유저 생성할때 nick 을 추가해주세요. 
... new User(username: 'nickuser', enabled:true, password: 'pass', nick: 'blah blah')  

cf) BootStrap 파일을 수정할 경우에는 grails를 재시작 해주어야 합니다. 당연하긴 하지만.. 뭔가 BootStrap도 재기동 할수 있는 기능을 제공해 해줬으면... 


기타.

1. 한글 문제
한글을 BootStrap.groovy 에 넣어보았는데 안되더라. 원인은 .groovy 파일을 UTF-8 로 저장하지 않아서.  
혹시 이걸로 해결이 안된다면 다음 링크를 참조하세요.  
http://jgrasstechtips.blogspot.com/2008/05/how-to-learn-new-groovy-friend-italian.html 
comment를 보면 JAVA_OPTS 에 groovy.source.encoding 을 전달하라는 이야기가 나온다. 

2.  LDAP, ActiveDirectory 연계는?
찾아보니.. 
spring-security-ldap 플러그인이 제공된다. 


마치며... 
 
이걸 더 진행시킬 기회가 올지는 잘 모르겠다. 아마 힘들듯... 

비교할 자리는 아니지만...

grails와 playframework을 다시 생각해보면 grails는 위와같이 spring 위에 올라탄 느낌을 편리하게 제공해준다.

일단 groovy에 익숙해진다면 플러그인을 직접 만드는 것도 그리 어려워보이지 않는다.

하지만 편리함 뒤에는 내부의 복잡함이 지나치게 숨겨진게 아닌가 싶기도 하다.
 
반면 playframework은 java 고유의 호흡법을 유지할 수 있다는 장점과 컴팩트함을 장점으로 가지는 것 같다. 

물론 다시 안을 들여다 보게 된다면 SCALA의 무덤에 기겁을 할 지도 모른다... (뭘 그리 겁내냐!) 


아무튼...  개인 신변이 조금 정리되어 이제 다시 링크... 
posted by smplnote
2012. 1. 16. 16:51 IT
grails install-plugin xxxxx 를 실행했으나 실패. 

grails plugin 설치가 안되는 문제가 발생. ( set-proxy 로 해결하라고 나오지만 회사에서 proxy는 왠지.. )

시도 1) grails install-plugin http://myserver.com/plugins/grails-example-0.1.zip

시도2) 
grails install-plugin /path/to/grails-example-0.1.zip

둘다 실패... 

my-grails-app/lib 에 xxx.zip 또는 dependency를 가지는 jar 파일을 복사해서 해결함

cf) 
http://search.maven.org/  ,  http://plugins.grails.org  를 활용.
xxx-plugin.xml 파일 내용중 dependency 부분을 확인해서 추가로 받아야 할 것들을 확인할것.


참조하세요 ->  http://grails.org/doc/latest/guide/plugins.html
posted by smplnote
2012. 1. 13. 16:51 IT

- 준비물
JDK 1.6.X
STS  (현재버전 2.9.0 M1) 

- 설치 
1. STS 실행후 Dashboard의 Extension Tab으로 가서 Grails 와 Grails Support 를 추가로 설치.
컴파일러를 groovy 1.8로 바꾸려면 Groovy Eclipse 플러그인을 다시 추가해야한다 . (이거 dependency 걸어서 같이 받게좀 해주세요.. )
참조 :  http://grails.org/STS+Integration 

2. STS재실행후  grails 홈 설정 ( STS 실행경로 바로 상위에 grails-2.0.0 이 생김. )

3.  http://grails.org/Quick+Start   따라하면 됨.. 

cf) H2 메모리 DB를 이용해서 테스트할때 좋은건 Grails가 DB web 콘솔을 기본으로 제공한다는것 ( 2.0 소개 스크린캐스트에서 발견..) 이때 jdbc url은 conf/DataSource.groovy 파일에 있는 설정값을 이용하면 된다. 


ps. 왠지 그레일즈는 설치해서 튜토리얼 한번 해보고 뭐좀 더 해보려다가 멈추게 된다.
진중하게 좀 파고들어야 하는데...
그리고 STS는 왤케 느리냐..  
다음엔 grails의 spring security 아니면  spring-security-facebook  을 조금 건드려볼까함.. 

posted by smplnote
2011. 12. 16. 09:51 IT

2011년 11월 15일자로 grails 2.0.0 정식버전이 공개되었다.
http://blog.springsource.org/2011/12/15/grails-2-0-released/

며칠전부터 groovy 관계자들이 '곧 나옵니다'하고 홍보해대서 별로 놀랍지는 않았다.
 
뭐가 새로운걸까 간단하게 둘러보자.
http://grails.org/doc/2.0.0/guide/introduction.html#whatsNew

A. 개발환경 관련

1. 콘솔 출력 개선 및 인터랙티브 모드 지원
서버사이드에서는 아직도 콘솔 작업이 대세다.
아마존같은 클라우드 벤더도 대부분 콘솔로만 제어할 수 있는 경우가 많다.
단순한 작업에 Web을 구성하는 것도 사실 번거로운 일이고...
Spring ROO 방식도 그렇지만 콘솔화면에 익숙한 사람들을 위한 즐거운 놀잇거리라고 할까...
콘솔에서 탭을 이용하여 명령어를 완성하거나 선택할 수 있게 하는 기능으로 보인다.

2. 리로딩 에이전트
웹 어플리케이션 리로딩 작업에 더이상 클래스로더를 사용하지 않는대신 JVM agent를 사용한다고 한다.
이전엔 설정관련해서도 뭔가 건들면 자주 리로딩이 되던 관계로 좀 귀찮았는데.. 좀 도움이 될까?

3. 에러 리포팅 및 분석 개선
효율적인 오류 해결에 도움을 받는건 늘 좋은 일이다.

B. 핵심기능

1. groovy 1.8 적용

C. Web 기능
1. 컨트롤러의 액션을 클로져가 아닌 메소드 형식으로 작성할수 있게 되었음.
2. primitive type 인자를 액션의 파라미터로 사용할 수 있음
3. 서블릿 3.0 비동기 기능 지원
4. 필터에 제외할 액션, uri를 설정할수 있음
5. html 5 기반 스캐폴딩  - 슬슬 html5를 공부해야할 압박감이 밀려온다.
6. jquery를 디폴트로 포함 - jquery가 대세다...

C. 퍼시스턴스 기능
1. GORM API 제공
2. Criteria, where 쿼리를 분리하여 사용 가능
3. 다중 데이터소스 지원 : 이거 필요한 기능이었다.. - 트릭은 있었지만..
4. DB 역공학 기능 - 뭔지 봐야겠다..
5. Hibernate 3.6 기반

D. 테스팅
1. 개선된 단위테스트 콘솔 출력
2. 단위테스트 API 추가 (Spock0.6 스타일로)
3. 단위테스트 스캐폴딩


이번달 개인적인 일만 처리하면... 탐험을 시작해봐야겠다.
posted by smplnote