페이지

2013년 9월 25일 수요일

구버전 Grails로 작업하기 ( Grails 1.2.2 )

구버전 Grails로 작업하기 ( Grails 1.2.2 )

개요

오랜시간 수정없이 잘 쓰이던 Grails로 만들었던 웹앱을 약간 수정할 일이 생겼습니다.
개발당시 Grails는 1.2.2 이고 현재 개발컴에 설치 되어있는 Grails는 2.2 버전입니다.
약간의 수정이 필요할 뿐 최신버전에 맞게 소스를 고치거나 하고 싶은 생각은 없습니다.
구버전 Grails를 다운받아서 설치하고 수정하고 패키징하는 과정입니다.

다운로드

Grails의 사이트는 http://grails.org/ 입니다.
다운로드 페이지로 이동합니다. ( http://grails.org/download )
최신버전은 2.3.0 이네요. 저는 구버전이 필요한 상황이므로
Download previous release 에서 1.2 버전을 선택하고 1.2.2의 binary를 클릭하여
grails-1.2.2.zip 파일을 다운로드 받았습니다.

설치

C: 드라이브에 압축을 풀었습니다. C:\grails-1.2.2\

일단 실행해 보니 에러가 발생합니다.
C:\>C:\grails-1.2.2\bin\grails 오류: 기본 클래스 org.codehaus.groovy.grails.cli.support.GrailsStarter을(를) 찾거나 로드할 수 없습니다.

이미 grails-2.2 버전이 설치되어있어서 충돌이 나는 것 같습니다.

C:\>set GRAILS_HOME=c:\grails-1.2.2
C:\>C:\grails-1.2.2\bin\grails
Welcome to Grails 1.2.2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:\grails-1.2.2
No script name specified. Use 'grails help' for more info or 'grails interactive
' to enter interactive mode

GRAILS_HOME 을 재설정하고 실행하니 문제 없이 실행이 됩니다.

앱실행

수정할  앱 디렉토리로 이동해서
grails run-app
실행하니 브라우저에서 확인할 수 있는 url을 알려줍니다.

앱패키징

수정을 마치고 war 파일을 만들기 위하여 다음 명령을 차례대로 실행합니다.

grails prod clean
grails prod war

참고사항

- 외부 라이브러리는 앱\lib 폴더에 넣습니다.
- war 파일을 톰캣에서 돌릴 때
Caused by: groovy.lang.MissingMethodException: No signature of method: xxx.save() is applicable for argument types: () values: []
와 같은 에러가 발생한다면 war 파일을 만들기 전에 clean을 한번 실행해 보세요.
grails prod clean 

2013년 9월 16일 월요일

외부에서 SQL Server에 접속하기 위한 준비

[SQL Server 구성 관리자( Sql Server Configuration Manager )] 실행

[SQL Server 네트워크 구성] > [MSSQLSERVER에 대한 프로토콜] > [TCP/IP] '사용' 인지 확인하고 아니면 우클릭해서 '사용'으로 바꿉니다.

[SQL Server Managerment Studio] 실행

 [SQL Server Managerment Studio] > 좌측 [개체 탐색기] 에서 기본 인스턴스를 우클릭 하고 [속성]을 누릅니다.
 속성창에서 [보안] 페이지를 선택하고 [서버 인증] [SQL Server Windows 인증 모드]로 변경합니다.
 SQL Server를 다시 시작해줍니다.
 [SQL Server Managerment Studio] > 좌측 [개체 탐색기] 에서 기본 인스턴스를 우클릭 하고 [다시 시작]을 누릅니다.
 [새 쿼리]를 누릅니다.
 유저명( username1 ) , 암호 (1111) 로 로그인을 만들고 sysadmin 역할을 부여하는 명령을 입력하고 실행합니다.

create login username1 with password='1111', check_policy=off
go
exec sp_addsrvrolemember username1, sysadmin
go

 [SQL Server Managerment Studio] > 좌측 [개체 탐색기] 에서 기본 인스턴스 선택 > [보안] > [로그인] 을 선택하고 [F5] 키를 눌러 새로고침하여 추가된 username1 확인

 참고로 로그인을 삭제할 때는 아래 명령을 실행합니다.

drop login username1
go

[제어판] > [Windows 방화벽] 을 실행

 좌측에서 [고급 설정]을 선택합니다.
 고급 설정 창에서 좌측 [인바운드 규칙]을 선택하고 [새 규칙]을 누릅니다. 아래 내용을 입력합니다.
-       규칙종류 : 포트
-       프로토콜 및 포트 : TCP, 특정 로컬 포트[ 1433 ]
-       작업 : 연결 허용
-       프로필 : 도메인, 개인, 공용 모두 선택
-       이름 : SQL Server

 [마침]을 누릅니다.


이제 외부에서 접속하여 확인해 봅니다.

2013년 9월 13일 금요일

자바로 썸네일 만들기 thumbnailator

자바로 thumbnail을 만드는 라이브러리 입니다.
사용법이 간단하고 편해서 좋습니다.


몇 가지 기능을 살펴보겠습니다.

원본 파일을 썸네일 파일로 만들거나.
Thumbnails.of("original.jpg")
        .size(160, 160)
        .toFile("thumbnail.jpg");

썸네일을 OutputStream으로 출력할 수 있습니다.
OutputStream os = ...;
Thumbnails.of("large-picture.jpg")
        .size(200, 200)
        .outputFormat("png")
        .toOutputStream(os);

썸네일을 회전하고 워터마크를 넣을 수 도 있습니다.
Thumbnails.of(new File("original.jpg"))
        .size(160, 160)
        .rotate(90)
        .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f)
        .outputQuality(0.8f)
        .toFile(new File("image-with-watermark.jpg"));

설치는 라이브러리 파일을 다운로드하여 클래스패스에 추가하기만 하면 됩니다.


2013년 9월 12일 목요일

java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp

Caused by: org.hibernate.exception.GenericJDBCException: could not load an entity: [classpath#133]

Caused by: java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp

 하이버네이트에서 mysql 의 datetime 형 컬럼의 값이 0일 때 Date형으로 파싱하지 못하고 뿌리는 에러입니다.

 컬럼에 null을 허용하고 하이버네이트를 이용한 접근만 있었다면 테이블에 0값이 들어갈 일은 없을 겁니다.

 제경우는 mysql5.6 버전으로 업그레이드하면서 new Date() 로 설정된 값이 디비에 업데이트시 제대로 된 값을 저장하지 못하고 0값('0000-00-00 00:00:00')을 입력하는 현상이 발생하였습니다.

 대략 코드로 표현하면 아래와 같은 식입니다.

@Entity
@Table(name = "table1")
public class Bean1 {
    @Column(name = "date1")
    private Date date1;
    ...
}

bean1.setDate1(new Date());
dao.update(bean1);

 아래와 같이 new Date() 대신 SimpleDateFormat으로 조정을 해서 넣으면 또 저장이 되긴했습니다.

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse(format.format(new Date()));
bean1.setDate1(date);

 근본적인 해결책은 아니라는 생각에 mysql connector/J 를 최신버전으로 바꿔보니 정상적으로 작동하였습니다.

 결론은 mysql업그레이드 시에는 mysql connector 도 함께 업그레이드 하는 것이 좋습니다. connector도 버전간에 기능이 달라지는 경우가 있으니 주의해야 합니다.

2013년 9월 11일 수요일

Mysql Connector/J 5.1

Mysql Java 용 JDBC 드라이버 입니다.

http://dev.mysql.com/downloads/connector/j/
다운로드 링크입니다.

MSI Installer 설치 파일은 어디에 파일들을 설치했는지 알려주지도 않고 설치가 끝납니다.
불편해서 지우고 Select Platform: 을 Platform Independent 로 변경하고 압축파일을 받아서 사용했습니다.

압축을 해제하고 jar파일(mysql-connector-java-5.1.26-bin.jar)을 복사해서 사용했습니다.

mysql-connector-java-3.1.10-bin.jar 를 사용하다가 최신버전으로 변경하였는데요. 적용과정에서 한가지 문제가 되었던 부분이 있습니다.

메타데이터를 사용하는 부분입니다.
ResultSetMetaData rsmd = resultSet.getMetaData();

3버전에서 rsmd.getColumnName(no) 는 필드의 Alias 값을 반환했습니다.
5버전에서는 rsmd.getColumnLabel(no) 를 사용해야 Alias 값을 받을 수 있고 rsmd.getColumnName(no) 는 컬럼의 실제 이름값을 반환합니다.

예를 들면 아래와 같은 쿼리가 있다면
select a as b from table;

3버전에서 rsmd.getColumnName(no) 는 'b'
5버전에서 rsmd.getColumnName(no) 는 'a'
5버전에서 rsmd.getColumnLabel(no) 는 'b'
가 됩니다.

2013년 9월 9일 월요일

org.apache.catalina.session.StandardManager doLoad 심각: IOException while loading persisted sessions: java.io.EOFException

- 톰캣 가동중 오류발생

org.apache.catalina.session.StandardManager doLoad 심각: IOException while loading persisted sessions: java.io.EOFException

- 해결방법

톰캣설치폴더\work 폴더를 지우고 다시 가동

백업 장치 'C:\Users\Administrator\Downloads\db.bak'을(를) 열 수 없습니다. 운영 체제 오류 5(액세스가 거부되었습니다.)입니다.

- 환경

윈도우 서버 2012, SQL Server 2012

- 명령

restore filelistonly from disk='C:\Users\Administrator\Downloads\db.bak'

- 결과

메시지 3201, 수준 16, 상태 2, 줄 7
백업 장치 'C:\Users\Administrator\Downloads\db.bak'을(를) 열 수 없습니다. 운영 체제 오류 5(액세스가 거부되었습니다.)입니다.
메시지 3013, 수준 16, 상태 1, 줄 7
RESTORE FILELIST이(가) 비정상적으로 종료됩니다.

- 해결

파일을 다른드라이브로 옮겨서 실행

- 결론

엑세스 거부관련 문제는 C: 드라이브가 아닌 곳으로 옮겨서 확인할것.