Spring Boot Data Jpa 프로젝트에 Querydsl 적용하기  예제를 따라 해보려고 하다보니

gradle 5.0에서는 잘 되지 않았다.

처음에는 gradle 에서 달라진 annotationprocessor 때문이라고 생각해서 테스트를 해봤는데 잘 되지 않았다.

    compileOnly('org.projectlombok:lombok')
    annotationProcessor("org.projectlombok:lombok")

한참 구글링 해보면서 이런 저런 옵션을 설정 해봤는데 최종적으로는 다음과 같은 설정을 하면

gradle 5.0에서 queryDSL 과 lombok ,spring-boot 이 잘 동작 한다.


plugin

plugins {
id "org.springframework.boot" version "2.1.1.RELEASE"
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
id "io.franzbecker.gradle-lombok" version "1.14"
id "io.spring.dependency-management" version "1.0.6.RELEASE"
id "java"
id "idea"
}

io.franzbecker.gradle-lombok 를 사용하면 dependencies 설정이 자동으로 들어가기 때문에 따로 설정 하지 않아도 된다.

queryDSL 설정은 다음과 같이 한다.

// querydsl 적용
def querydslSrcDir = 'src/main/generated'

querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslSourcesDir = querydslSrcDir
}

compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}

configurations {
querydsl.extendsFrom compileClasspath
}

sourceSets {
main {
java {
srcDirs = ['src/main/java', querydslSrcDir]
}
}
}

이렇게 설정 하니 예제가 잘 동작 했다.

'지식창고 > Java' 카테고리의 다른 글

queryDSL lombok gradle 5.0  (0) 2019.01.02
eclipse workspace 삭제  (0) 2018.12.05
eclipse 설치한 플러그인  (0) 2018.04.10
gradle 유용한 플러그인  (0) 2016.07.25
eclipse neon으로 옮기면서 삽질  (0) 2016.07.15
eclipse + gradle => buildship  (0) 2016.07.04

구글에서 한글로 검색을 하면 거의대부분 파일 편집 방식으로 안내를 하고 있다.

영문으로 검색을 하면 이클립스 메뉴에서 삭제 방법을 안내 하고 있다.


Preferences -> General ->Startup and Shutdown 의 Workspaces


'지식창고 > Java' 카테고리의 다른 글

queryDSL lombok gradle 5.0  (0) 2019.01.02
eclipse workspace 삭제  (0) 2018.12.05
eclipse 설치한 플러그인  (0) 2018.04.10
gradle 유용한 플러그인  (0) 2016.07.25
eclipse neon으로 옮기면서 삽질  (0) 2016.07.15
eclipse + gradle => buildship  (0) 2016.07.04

none에서 oxygen 으로 업그레이드 방식으로 업그레이드 했으나 삐걱 거려서

oxygen으로 새로 설치 하고서 설치한 플러그인 목록을 기록 차원에서 남긴다.


BuildShip : gradle build

https://projects.eclipse.org/projects/tools.buildship


Darkest Dark Theme with DevStyle : 테마 관리

https://www.genuitec.com/products/devstyle/


Minimalist Gradle Editor : build.gradle 에디터

Properties Editor : 프로퍼티 에디터 한글지원

grep console : console 로그 메시지 지원


oxygen 장점

mac에서  한글 입력 문제가 발생하지 않는다.


'지식창고 > Java' 카테고리의 다른 글

queryDSL lombok gradle 5.0  (0) 2019.01.02
eclipse workspace 삭제  (0) 2018.12.05
eclipse 설치한 플러그인  (0) 2018.04.10
gradle 유용한 플러그인  (0) 2016.07.25
eclipse neon으로 옮기면서 삽질  (0) 2016.07.15
eclipse + gradle => buildship  (0) 2016.07.04

이클립스에서 사용하는 일반적인 플러그인은 다음과 같다.


apply plugin: 'java'
apply plugin: 'eclipse'



gradle build를 하면 jar파일이 잘 생성되는데 배포용 lib들을 깔끔하게 모아주는 방법이 없을까 찾아봤더니 있었다.


apply plugin: 'java-library-distribution'


build\distributions 폴더에 tar, zip 두가지 형태의 배포용 압축 파일이 생성된다.


단독 실행형 jar를 생성할 경우엔 다음 플러그인이 좋다.

apply plugin: 'application'


'지식창고 > Java' 카테고리의 다른 글

eclipse workspace 삭제  (0) 2018.12.05
eclipse 설치한 플러그인  (0) 2018.04.10
gradle 유용한 플러그인  (0) 2016.07.25
eclipse neon으로 옮기면서 삽질  (0) 2016.07.15
eclipse + gradle => buildship  (0) 2016.07.04
apache commons-imaging을 gradle 에서 설정하기  (0) 2015.09.18

eclipse neon으로 옮기면서 기존에 .gradle 을 삭제하고 다시 설정 하게 손보는 중이였다.


딱 한 프로젝트만 error표시가 뜨는데 딱히 에러 메시지는 보이지도 않고 이상했다.


여기 저기 옵션을 뒤적거리다 보니 에러 표시가 보였다.


Persisted container 저게 구버저전 호환용인가? 뭐지?  나는 Gradle을 사용하니 필요가 없을것 같았다.


샘플로 프로젝트를 생성해보니 저런 항목은 없다.  기존 프로젝트 호환용으로 설정된게 아닌가 싶다.


remove로 지우니 에러 표시가 사라지고 깔끔하게 동작한다.


아마도 일반적인 상황에서는 안생길듯 하다. 내경우엔 개발중인 SNAP SHOT을 포함시켜서 발생한것으로 보인다.



이클립스에 gradle 을 사용할때 보통



이걸 설치 하거나 수동으로 설치를 했었는데


neon이 새로나와서 테스트 해보려고 살펴보니 못보던 플러그인이 보였다.


Buildship 이라고 새로 나온 모양이다.


기존플러그인을 삭제하고 새로 설치를 하니 프로젝트 아이콘이 초기화되었다.

프로젝트 형식을 변환하자.



기존에 gradle플러그인은 뭔가 좀 intellij에 비해서 이질적이였는데


샘플 프로젝트를 생성해보니 좀 더 자연스러워진 느낌이다.


새로 프로젝트를 만들어봤다.


Gradle Project를 선택하고 프로젝트 명을 입력하고 다음을 누르면 쉽게 프로젝트가 생성된다.



프로젝트의 구조가 gradle답게 변했다.

Tasks에서 build를 하면

결과가 보이고


프로젝트 경로의 Build\libs에 보면 jar파일이 잘 생성되어 있다.


기존 플러그인에 손이 익어서 새로운 시스템이 좀 불편해 보이는 점도 있는데 차차 적응 해나가야지




maven은 잘 모르는 관계로 그동안은 저장소에서 jar파일을 다운받아 사용했었는데 

도움말 문서를 자세히 살펴보니  maven  pom.xml에서는 사용이 가능하게 되어 있다.


Where can I get the latest release?

There is currently no stable release of Imaging. However you can pull the latest SNAPSHOT from the Apache snapshot repository by adding the snapshot repository to your pom.xml:

<repository>
  <id>apache.snapshots</id>
  <name>Apache Development Snapshot Repository</name>
  <url>https://repository.apache.org/content/repositories/snapshots/</url>
  <releases>
    <enabled>false</enabled>
  </releases>
  <snapshots>
    <enabled>true</enabled>
  </snapshots>
</repository>

Then you can use the SNAPSHOT version of Commons Imaging in your pom.xml:

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-imaging</artifactId>
  <version>1.0-SNAPSHOT</version>
<dependency>

그렇다는것은 gradle에서도 된다는건데?


잠시 구글링을 해보고  다음과 같이 repositories를 추가 한다.

repositories {
    mavenCentral()
    maven {
        url "https://repository.apache.org/content/repositories/snapshots/"
    }
}


dependencies는

compile 'org.apache.commons:commons-imaging:1.0-SNAPSHOT'


마지막 스냅샷을 잘 가져온다. 새로운 스냅샷이 등록되면 갱신이 되는지는 아직 확인 못했음


새로운 스냅샷이 등록되면 gradle refresh할 때 갱신된다.

https://github.com/eclipse-color-theme/eclipse-color-theme/issues/206


언제 부턴가 컬러테마를 적용한것이 기본값으로 적용되었다.


해결방법을 찾아서 해봤는데 잘된다.


테마를 클래식으로 바꾸고 재시작 - > 다시 다크테마로 선택을 하면 컬러테마가 유지된다.

자바로 간단한 API 웹 프로그래밍을 해야 해서 알아보다 보니


http://sparkjava.com/ 이 경량화 이면서 자바 초보인 내가 알아보기 쉽게 되어 있어서 선택했는데


문제는 배포방법을 모르겠어서 삽질이 시작되었다.


이클립스에서의 실행은 아주 쉽다.


이클립스용 Gradle를 설치해주고 (마켓에서 설치) 새로운 GradleProjet를 생성한다.




build.gradle에 sparkjava dependencies 를 넣어준다.


http://mvnrepository.com/artifact/com.sparkjava/spark-core/2.0.0


그리고 최종적으로는 war로 배포를 할것이니 war플러그인도 설정






테스트용 클래스를 하나 생성하고 코드를 sparkjava 홈페이지에서 그대로 가져온다음 실행을 누른다.

아..그전에 프로젝트 팝업메뉴Gradle -> Refresh All , Gradle -> Enable Dependency Managment





http://localhost:4567/hello 에 접속하면 끝!


개발은 이상태로 계속 하면 된다.


문제는 이렇게 개발한것을 어떻게 배포를 하느냐 인데

자바 초보인데다가 웹프로젝트도 처음이고 war파일을 톰캣이나 jetty에 wabapps경로어 넣으면 된다 정도의

아주 기초적인 지식만 가지고 하루종일 구글링을 해보고 밤잠 설쳐 가면서 삽질을 했는데 도데체 모르겠는것이다.


결국은 maven까지 깔아서 해봤는데도 잘 안되었다.

( 이 과정에서  gradle이 얼마나 쉬운지 체험했다.)


안되면 처음부터 천천히 보자..공식문서에는 다음과 같이 나온다.


Other webserver

To run Spark on a web server instead of standalone first of all an implementation of the interface spark.servlet.SparkApplication is needed. In the init() method the routes should be initialized. In your web.xml the following filter needs to be configured:

어쩌라고?



자세히보니 init()을 하란다....


어쩌라고?????



다시 구글링..


범인은 가까운데 있다지..ㅡ.ㅡ;;


Git의 Test코드에서 sample을 찾아 볼 수있었다.


다른 웹서버에서 사용하기 위한 web.xml 설정과

https://github.com/perwendel/spark/blob/master/src/test/webapp/WEB-INF/web.xml


이를 사용하기 위한 샘플 코드

https://github.com/perwendel/spark/blob/master/src/test/java/spark/servlet/MyApp.java



이대로 지금 작업중인 HelloSpark에 추가를 한다.


src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <filter>
        <filter-name>SparkFilter</filter-name>
        <filter-class>spark.servlet.SparkFilter</filter-class>
        <init-param>
            <param-name>applicationClass</param-name>
            <param-value>org.gradle.Spark</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SparkFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

자바 코드도 수정을 한다.


아까 테스트한 Hello World에 github에서 가져온 소스를 덧붙인다.

package org.gradle;
import static spark.Spark.*;
import spark.servlet.SparkApplication;

public class Spark implements SparkApplication{

    public static void main(String[] args) {

        staticFileLocation("/public"); // Static files
        get("/hello", (req, res) -> "Hello World");
    }

    @Override
    public void init() {
        // TODO Auto-generated method stub
        before("/protected/*", (request, response) -> {
            halt(401, "Go Away!");
        });
        get("/hi", (request, response) -> {
            return "Hello World!";
        });
        get("/:param", (request, response) -> {
            return "echo: " + request.params(":param");
        });
        get("/", (request, response) -> {
            return "Hello Root!";
        });
        post("/poster", (request, response) -> {
            String body = request.body();
            response.status(201); // created
                return "Body was: " + body;
            });
        after("/hi", (request, response) -> {
            response.header("after", "foobar");
        });
        try {
            Thread.sleep(500);
        } catch (Exception e) {
        }
    }
}

이클립스 메뉴에서 Window->Show View -> Other 에서 Gradle Tasks를 추가 하고

작업중인 프로젝트를 선택한 후 build를 더블클릭하면 build\libs 경로에 HelloSpark-1.0.war 파일이 생성되며

이것을 톰캣이나 다른 jetty 서버에 배포를 하면 된다.


ps.

staticFileLocation("/public"); // Static files

이함수는 임베디드 jetty에서는 아무데서나 써도 되지만 war로 배포 하겠다고 한다면

꼭 main에서 실행해야 한다. 이것 때문에 하루 삽질!

결론 : 결과값은 resultMap으로 받을 수 없다.


mapper.xml

<select id="getNumber" statementType="CALLABLE" parameterType="hashmap">
        { #{Result, mode=OUT, jdbcType=INTEGER, javaType=int} = call getNumber
            (
                #{NumKey, mode=IN, jdbcType=VARCHAR, javaType=String},
                #{Count, mode=IN, jdbcType=INTEGER, javaType=int},
                #{GetNumber, mode=OUT, jdbcType=INTEGER, javaType=int }
            )
        }
</select>

결과값(output)은 파라메터로 넘긴 map에 담겨서 넘어오며 return은 null로 넘어온다.


'지식창고 > Java' 카테고리의 다른 글

이클립스 컬러테마 문제  (0) 2014.11.26
Sparkjava 와 Gradle 그리고 배포  (0) 2014.09.29
mybatis procedure 삽질  (0) 2014.08.28
자바 EUC-KR, UTF-8 파일 둘다 읽는 방법  (0) 2014.08.12
Java Resize Library Test  (0) 2014.08.09
eclipse aptana git 문제  (0) 2014.05.29