MyBatis 어노테이션에서 Groovy “”” 사용하기

기본

정상혁 님의 포스트에 이클립스에 Groovy를 세팅하는 자세한 방법이 나와있는데요. 따라하다 보니 몇 가지 문제가 발생했습니다.

  • Maven에서 빌드 시, testCompile 골에서 예외 발생.
  • slf4j 사용시, 로거를 초기화 할 수 없어 예외 발생.
  • Groovy 클래스를 실행 할 수 없음.

마지막 것은 제 삽질입니다 (…) 이번 포스팅은 위 세 가지 문제를 해결해 MyBatis 어노테이션에서 Groovy 삼중 큰따옴표를 쓰는 것이 목표입니다.

1. Maven에서 빌드 시, testCompile 골에서 예외 발생.

로그에는 심볼을 찾을 수 없다고 나오는데 사실 ClassNotFound 예외입니다. Maven으로 빌드 도중 JUnit 테스트를 할 때, groovy 파일을 먼저 컴파일 하지 않아 발생합니다.

GMaven 홈페이지의 Building Groovy Projects 글을 보면 <goal> 설정 부분에 stub 만드는 골이 있는 것을 볼 수 있습니다.

<goals>
	<goal>generateStubs</goal>
	<goal>compile</goal>
	<goal>generateTestStubs</goal>
	<goal>testCompile</goal>
</goals>

이 스텁 골들의 역할은 maven-compiler-plugin이 compile 골과 testCompile 골을 실행하기 전에 groovy 클래스들을 java 소스로 변환시켜 주는 것입니다. 그래서 maven-compiler-plugin이 문제 없이 자신의 골을 수행할 수 있도록 만들어 줍니다.

2. slf4j 사용시, 로거를 초기화 할 수 없어 예외 발생.

GMaven은 Maven 플러그인이고 실제로 Groovy 실행을 위해서는 gmaven runtime API가 필요합니다.

<dependency>
    <groupId>org.codehaus.gmaven.runtime</groupId>
    <artifactId>gmaven-runtime-1.7</artifactId>
    <version>1.3</version>
</dependency>

위에 1.7은 어떤 버전의 Groovy를 실행할 지에 대한 것이고 아래 1.3은 gmaven-runtime API 자체 버전입니다.

이 API는 다른 API들과 의존성을 가지고 있는데요. 그 중 하나가 gshell-io 입니다. gshell-io는 다시 slf4j와 구현체인 gossip에 의존성을 가지고 있기 때문에 gossip으로 개발 중이 아니라면 제대로 Logger를 초기화 하지 못하거나 중복된 클래스가 있어서 예외가 발생할 수 있습니다. 해결 방법은 gshell-io에서 gossip을 exclude 하면 됩니다.

<dependency>
	<groupId>org.sonatype.gshell</groupId>
	<artifactId>gshell-io</artifactId>
	<version>2.4</version>
	<exclusions>
		<exclusion>
			<groupId>org.sonatype.gossip</groupId>
			<artifactId>gossip</artifactId>
		</exclusion>
	</exclusions>
</dependency>

3. Groovy 클래스를 실행 할 수 없음.

Groovy 클래스로 만들어 놓고 컴파일은 했는데 실행이 안되는 문제입니다.

http://dist.springsource.org/release/GRECLIPSE/e3.7/

위 주소의 이클립스 플러그인을 설치 할 때, Groovy 1.8 compile features를 설치할 수 있는데요. (옵션입니다.) 이것을 설치하게 되면 기본 Groovy 컴파일러가 1.8 용으로 잡히게 됩니다. 즉, 1.8 버전용으로 컴파일 된다는 뜻이고, GMaven 런타임 API의 경우 1.7 버전 용이기 때문에 1.8 버전의 Groovy API가 없어서 발생하는 에러입니다.

옵션에서 Groovy compiler 버전을 1.7로 바꿀 수가 있는데 이렇게 해도 에러가 계속 나더라구요. 해결책이라고 하기도 뭣하지만 결국 Groovy 1.8 compiler features를 언인스톨 해서 해결했습니다 (…)

4. class 파일로 컴파일도 완료 됐는데 cannot be resolved type 에러 발생

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>2.3.2</version>
	<configuration>
		<source>1.7</source>
		<target>1.7</target>
		<encoding>${default.encoding}</encoding>
		<includes>
			<include>**/*.java</include>
			<include>**/*.groovy</include>
		</includes>
	</configuration>
</plugin>

이렇게 groovy 파일도 인클루드 시켜 버립니다.

MyBatis 어노테이션에서 Groovy “”” 사용하기

드디어 메인 주제네요. MyBatis 어노테이션에서는 constant가 아니면 안됩니다. 그래서 유틸 클래스를 사용할 수가 없습니다. 따라서 Mapper 인터페이스 자체를  groovy 파일로 만들어서 사용하면 됩니다.

public interface SqlMapper {

	@Select("""
		SELECT reservation.id id, client.id clientId, client.name, client.department, menu.title, menu.id menuId, menu.building, reservation.reserve_date reserveDate, reservation.type
		FROM reservation, client, menu
		WHERE menu.building = #{building}
		AND client.id = reservation.client_id
		AND menu.id = reservation.menu_id
	""")
	List<Reservation> getReservationList(Reservation reservation);
}

그냥 Java처럼 보이지만 사실 Groovy 클래스입니다.

Advertisements

[링크] Java에서 XML없이 SQL개발하기

기본

최근에 MyBatis 어노테이션을 사용해보니 간단한 쿼리는 괜찮은데 쿼리가 길어지면 한 줄에 다 써놓자니 너무 길고 +로 연결하자니 다른 툴 사용할 때, 여간 불편한게 아니더라구요.

Groovy에서 삼중 큰따옴표(“””) 를 지원 하는지도 몰랐었는데, “”” 이렇게 스트링을 시작하면 문자열을 리터럴 그대로 인식할 수 있다고 합니다.(각각의 라인은 \n으로 처리됩니다.) Groovy는 JVM위에서 돌아가는 언어고, Java 문법도 다 지원해주죠. 이클립스에서 플러그인만 하나 추가해 주면 사용하는데 불편함이 없으니 정상혁님의 글대로 쿼리 유틸 클래스를 Groovy로 만들어 주면 매우 편할 것 같다는 생각이 들었습니다 🙂

Maven pom.xml에서 properties 파일 읽어오기

기본

스프링 프레임워크에서 xml로 설정 파일을 분리시켜 놓긴 했지만, 그래도 데이터베이스 계정이라던지 스프링에 관련 없는 설정 파일도 생기게 마련인데요. 아마 간단하게 properties를 많이 애용하실 겁니다. 저도 그렇구요.

Maven에서 carbon5 플러그인으로 데이터베이스 이력관리를 하다보니 pom.xml에도 jdbc 접속 계정이나  driver 정보가 필요하게 되는데요. 이 정보는 스프링 프레임워크에서 DataSource를 초기화 하는데 한 번 더 쓰이게 됩니다.

그래서 Maven 설정 파일인 pom.xml과 스프링프레임워크 설정 파일인 applicationContext.xml에서 하드코딩 안하고 동시에 사용 가능한 외부 설정 파일이 없을까 하다가 Maven에서 properties 파일을 읽어올 수 있는 플러그인을 찾았습니다.

사용 방법:
먼저 저장소를 추가해 줍니다. 아직 알파 버전인데 사용하는데 문제는 없어보였습니다.

<repositories>
	<repository>
		<id>Codehaus Snapshots</id>
		<url>http://nexus.codehaus.org/snapshots/</url>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
		<releases>
			<enabled>false</enabled>
		</releases>
	</repository>
</repositories>
<pluginRepositories>
	<pluginRepository>
		<id>Codehaus Snapshots</id>
			<url>http://nexus.codehaus.org/snapshots/</url>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
		<releases>
			<enabled>true</enabled>
		</releases>
	</pluginRepository>
</pluginRepositories>
<plugins>
	<plugin>
		<groupId>org.codehaus.mojo</groupId>
		<artifactId>properties-maven-plugin</artifactId>
		<version>1.0-alpha-2</version>
		<executions>
			<execution>
				<phase>initialize</phase>
				<goals>
					<goal>read-project-properties</goal>
				</goals>
				<configuration>
					<files>
						<file>src/mavenpilot/config/jdbc.properties</file>
					</files>
				</configuration>
			</execution>
		</executions>
	</plugin>
</plugins>

이렇게 사용하시면 됩니다. properties를 읽어오는거 외에 쓰기 기능과 프로필 지원 기능도 있습니다.

ps. carbon5 플러그인을 사용해서 새로운 스키마를 만들 때 db-migration:new 해서 만들게 되는데 이때, properties를 못읽어와서 예외가 발생할 수 있습니다.
그래서 properties:read-project-properties db-migration:new 식으로 properties를 읽는 골을 먼저 실행하셔야 합니다.

에디트플러스3에서 C/CPP 컴파일 및 실행하기

기본

교수님 부탁으로 EditPlus3에서 Visual Studio 컴파일러를 사용한 컴파일 및 실행하는 방법을 정리해 봤습니다.

1. 컴파일러 세팅

1.1. 에디트플러스 메뉴 중 도구 -> 기본 설정을 선택합니다.

1.2. 왼쪽 항목에서 도구 -> 사용자 도구를 선택하고, 우측에 추가 -> 프로그램을 선택합니다.

사용자 도구에서 프로그램 추가

프로그램 추가

1.3. 메뉴제목은 ‘compiler’ 등으로 적고, 명령탭은 우측의 … 버튼을 클릭하신 후, C:\Program Files\Microsoft Visual Studio <버전>\VC\bin 디렉토리로 이동 후, cl.exe 파일을 선택합니다.

1.4. 인수는 우측의 아래방향 화살표 아이콘을 누른 후, 파일이름을 선택합니다. 디렉토리도 마찬가지로 화살표 아이콘을 누른 후, 파일디렉토리를 선택합니다.

컴파일러 세팅

컴파일러 세팅

1.5. 출력 내용 캡쳐, 열려진 파일 저장에 체크합니다. 컴파일러 세팅은 완료 됐습니다. 이제 Ctrl+1 을 누르면 파일이 위치한 곳에 컴파일이 됩니다. 다음은 실행 관련 세팅입니다.

2. 실행 세팅

2.1. 다시 추가 -> 프로그램을 선택합니다. 메뉴제목은 ‘run’ 정도로 적습니다.

2.2. 명령에 $(FileNameNoExt) 라고 적습니다.

2.3. 디렉토리에 파일 디렉토리를 선택합니다. 

실행 환경 구성

실행 환경 구성

2.4. 출력 내용 캡쳐, 열려진 파일 저장에 체크합니다. 이것으로 실행 세팅은 끝이며, Ctrl+2 로 컴파일한 파일을 실행할 수 있습니다.

3. 라이브러리/include 파일 설정

명령행에서 컴파일을 할 때 각종 include 파일과 라이브러리들을 필요로 하기 때문에 환경변수에 등록을 해주어야 합니다.

3.1. 내컴퓨터 -> 속성 -> 고급 -> 환경변수 -> 시스템 변수 -> Path 더블 클릭 후, ; 추가한 후 C:\Program Files\Microsoft Visual Studio <버전>\Common7\IDE;C:\Program Files\Microsoft Visual Studio <버전>\VC\bin 두 폴더를 추가합니다.

3.2. 시스템 변수 -> 새로 만들기 버튼 클릭 후, 변수 이름 ‘INCLUDE’ 변수 값으로 C:\Program Files\Microsoft Visual Studio <버전>\VC\include 폴더를 지정합니다.

3.3. 다시 시스템 변수 -> 새로 만들기 버튼 클릭 후, 변수 이름 ‘LIB’ 변수 값으로 C:\Program Files\Microsoft Visual Studio <버전>\VC\lib; C:\Program Files\Microsoft SDKs\Windows\<버전>\Lib 두 폴더를 지정합니다.

시스템 변수 설정까지 끝내셨다면 에디트 플러스에서 컴파일/실행할 수 있는 환경이 구성됐습니다.