Clean Code that Works.

grails 배포 하기.

grails2013. 3. 5. 15:27

지금 만들어논 사이트 에서는


git pull 을 통해서 소스를 업데이트 한후에.

grails prod war 명령어를 통해 .war 파일을 만들고

war 명령어는 기본이 dev(devlopment) 이다.

이 파일을 tomcat/webapps/ 아래로 이동한 후 배포 하는 구조로 되어 있다.

그냥 일반 DB를 하이버네이트를 써서 스프링 시큐리티로 만든 User 클래스를 사용하면, 로그인도 잘 되고 아무 문제가 없는데

User 클래스를 Neo4j로 사용하면 로그인 하는데 문제가 발생한다.


User 클래스에는 시큐리티 플러그인이 만들어준 "beforeInsert", "beforeUpdate" 메서드가 있고, 여기서 password 인코딩을 해준다.

위 이벤트들은 GORM에서 지원해 주는 것들(http://grails.org/doc/latest/guide/GORM.html#eventsAutoTimestamping)


근데 Neo4j를 사용하면.. 그냥 list 를 호출하는데도 beforeUpdate 가 계속 호출되어, 패스워드 값이 여러번 변경된다.. 

무려 3번. 그냥 list를 호출하는데도.. -_-;; 이건 뭐야!!


저게 존재하는 이유가 패스워드 인코딩을 하기 위한거니..

해결 방법은. 

User 클래스의 위의 두 메서드( beforeInsert, beforeUpdate)를 제거 하고, UserController에서 패스워드 인코딩 하는 내용을 넣어 주는 걸로 변경 함. 


꼼수로.. 하이버네이트와 Neo4j를 같이 써볼려고 했는데..

Neo4j로 쓰는 도메인과 하이버네이트로 쓰는 도메인은.. Neo4j에서 참조가 안되는 관계로 포기.


예를 들어 Neo4j 는 '학교' 이고 하이버네이트가 '학생'일때 '학교'는 '학생'을 참조하고 있으면 에러남..

당연한 이야기긴 한데.. 뭔가 GORM에서 해결했을것 같은 느낌이 들어서 시도해봄...


아 그리고 User 클래스 만들어 주는 템플릿은 스프링 시큐리티 프러그인 내에 "Person.groovy.template"로 존재함.

Neo4j를 회사 서버에 설치해서 사용중인데 집에서도 공부할때 계속 사용해보고 싶었다.

Grails에서 기본적으로 제공해주는 environments 는 development, product, test 이렇게 지원을 해주는데, 나는 집에서 쓰고 싶으니까 별도로 값(home)을 지정해서 사용하고 싶었다. 


Grails 에서 제공하는 Environments 는 여기(http://www.grails.org/Environments)에 보면 자세히 설명이 되어 있고, 나는 home으로 사용하고 싶으니까 서버를 실행시에 아래와 같이 입력하면 된다.

grails -Dgrails.env=home run-app

그럼 이 환경을 사용하는 변수들을 설정해 주어야 하는데..

아래와 같이 설정하면된다.

environments {

home {

dataSource {

dbCreate = "create-drop"

url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"

}

grails {

neo4j {

type = "embedded"

  location = "/var/neo4j"

}

}

}

development {

dataSource {

dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''

url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"

}  

grails {

neo4j {

type = "rest"

  location = "http://100.0.0.1:7474/db/data/"

}

}

}

}


기본으로 run-app를 하면 development 로 올라가고, 위에 처럼 별도로 home으로 설정해주면 별도로 설정한 값을 가지고 실행된다. 

neo4j가 embedded로 설정되면 설치된 neo4j 플러그인이 자동으로 neo4j를 실행시켜 주므로 따로 설치할 필요는 없다(h2 db 처럼)

neo4j 설정은 아래를 참조.

http://springsource.github.com/grails-data-mapping/neo4j/manual/guide/gettingStarted.html#usingNeo4jStandalone



어제 집에서 이클립스 설치하고 grails 한번 해볼려고 했는데, git 에서 받은 소스가 빌드가 안되는 문제가 발생했다.

회사에서 커밋이 다 안됬나.. 하고 살펴봤는데..

grails.org 들어가보니 central plugin repository가 어제 하루 다운되서 그랬었다는...

다행이 오늘 빌드 해보니까 다 되는구나. ㅋ


하지만.. 띄워 볼수는 없을듯.......... neo4j는 사내 서버에 설치되어 있어서.. 사내에서만 접속된다.

oops .. 


neo4j 설정은 profile 지정이 안되나..


요즘 보는 것..

grails2012. 11. 15. 18:50

요즘 nosql 중 하나인 neo4j를 잠깐 보고 있는데..
셀프 참조하는 객체를 가져와서 도메인 클래스로 매핑해주는 방법을 못찾겠다.

cypher 쿼리로 작성해서 결과를 가지고 오면 RestNode 형식으로 값을 가져 오는데, 이 값이 내가 원하는 domain으로 자동 매핑 되면 좋겠지만.. 안된다. 

아 물론 그전에 최상위 객체를 가져오면 자동으로 셀프 참조하는 객체들 정보도 다 가지고 오면 좋겠다. 하이버네이드에서는 .. 무슨 옵션이더라.. max_fetch_depth 이건가 이걸로 연관된 객체들 값을 가져오는 dept를 지정할수 있었던것 같은데...

어렵구만...

https://github.com/KimJejun/grails-first/blob/master/grails-basic/grails-app/controllers/grails/basic/StartPointController.groovy

여기 소스 보면, show 하는 쪽에서 cypher 쿼리 사용해서 결과 매핑을.. 해야 하는데.. 음 어떻게 좀 자동으로 안되나..



위는 grails 공부하면서 보는 곳.


공부를 사내에서만 해서 -_-;; 

회사에서 지원해주는 내부 클라우드서버 에다가 neo4j 설치해서 사용하는 중이다.



보통 JSON을 사용이 필요할때는 화면에 결과로 만들어줄 때나, rest 한 요청등이 들어 왔을때 결과로 찍어 주기 위해서 사용하는데.. Grails에선 손쉽게 사용할 수 있다.

http://grails.org/doc/latest/guide/theWebLayer.html#xmlAndJSON

위 API 설명..

(groovy에서 제공하는 JsonBuilder를 사용해도 되나.. Grails에서 제공하는 방법이 더 쉽다.)


그냥 간단하게.. json 변환이 필요한 오브젝트에 .encodeAsJSON() 해주면 된다.

같은 방식으로 xml 등등 다양한 방식을 지원.


만약 결과로 json을 보내줘야 한다면 컨트롤러에서 render obj.encodeAsJSON() 하면 되고, 리스트 객체도 같은 방식으로 listObj.encodeAsJSON() 하면 자동으로 json 형식으로 만들어서 뿌려준다.

gsp 뷰에서 json으로 변환하고 싶으면 ${obj.encodeAsJSON()} 으로 사용하면 되고,

만약 obj가 null 이면 null 인 json 객체가 생성된다.

GSP 에서 데이터 표시해줄때

<g:hiddenField name="id" value="${startPointInstance?.id}" />

이렇게 쓰는데.

startPointInstance? ... 의 ?가 의미하는게 궁금해서 검색해봤다.

"Safe Navigation Operator" 란다. 만약 startPointInstance 인스턴스가 null 이면 id 에 접근하려고 하지 않는다.

(jsp 에서는 없는 프로퍼티나 값이 없으면 아무것도 표시 안하거나.. null로 나왔던것 같음)

http://stackoverflow.com/questions/4581532/what-does-the-question-mark-mean-in-gsp-grails

여기 가보면 자세한 설명이 있다. null 일경우 디폴트 값 지정하는 방법도.

좋구만 ~_~

http://lmgtfy.com/?q=gsp+question+mark




rest 방식으로 neo4j 사용할 때, 

grails 설정(DataSource.groovy)에 rest 방식으로 지정을 해 주고, 여기에 필요한 의존성을 추가 해 줘야 하는데.


이 파일이 어디 있냐면은..

http://m2.neo4j.org 요기, neo4j에서 제공하는 메이븐 레파지토리에 있다.


그러므로 BuildConfig.groovy에 아래와 같이 mavenRepository 추가하고

mavenRepo 'http://m2.neo4j.org/'

빌드 해서 연결 하도록 하자