인프런 커뮤니티 질문&답변

백엔드 주니어 개발자님의 프로필 이미지
백엔드 주니어 개발자

작성한 질문수

실전! Querydsl

querydsl을 사용한 프로젝트를 cafe24에 배포하는데 문제가 생겼습니다ㅠㅠㅠㅠ

해결된 질문

작성

·

862

0

cafe24에 프로젝트를 배포하기 위해서는 ROOT.war파일을 생성해야했습니다.

프로젝트를 만들 때 jar를 선택하고 생성해버려서 war로 변경해야했고, 이는 구글링을 통해 해결 하였습니다. 하지만 ROOT.war파일을 압축 해제하고 보니 Q클래스들이 하나도 없었습니다. 아마 build > generated > querydsl 경로에 Q클래스들이 있어서 그런게 아닐까 생각하고 있습니다.

어떻게 해결하면 좋을까요?ㅠㅠ build.gradle코드는 아래와 같습니다.

plugins {
   id 'org.springframework.boot' version '2.2.2.RELEASE'
   id 'io.spring.dependency-management' version '1.0.8.RELEASE'
   //querydsl 추가
   id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
   id 'java'
   id 'war'
}

group = 'study'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '8'
configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
   developmentOnly
   runtimeClasspath {
      extendsFrom developmentOnly
   }
}

repositories {
   mavenCentral()
}

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   //war파일로 배포하기위한 설정
   providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'

   //스프링부트에서 validation을 사용하기 위한 코드
   implementation 'org.springframework.boot:spring-boot-starter-validation'

   // json 파싱
   implementation 'com.googlecode.json-simple:json-simple:1.1.1'

   developmentOnly("org.springframework.boot:spring-boot-devtools")

   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'com.h2database:h2'
   runtimeOnly 'org.mariadb.jdbc:mariadb-java-client:2.7.0'
   runtimeOnly("mysql:mysql-connector-java")
   annotationProcessor 'org.projectlombok:lombok'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'

   //model mapper
   implementation 'org.modelmapper:modelmapper:2.4.2'

   // lombok을 테스트 환경에서도 사용
   testCompileOnly 'org.projectlombok:lombok'
   testAnnotationProcessor 'org.projectlombok:lombok'

   // 이메일 전송
   implementation 'org.springframework.boot:spring-boot-starter-mail'

   //파라미터가 적용된 쿼리문
// implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
   //querydsl 추가
   implementation 'com.querydsl:querydsl-jpa'
   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'com.h2database:h2'
   annotationProcessor 'org.projectlombok:lombok'
   testImplementation('org.springframework.boot:spring-boot-starter-test') {
      exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
   }

   //테스트코드 작성시 entityManagerFActory에러 때문에추가
   implementation group: 'org.javassist', name: 'javassist', version: '3.15.0-GA'

}
test {
   useJUnitPlatform()
}

//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
   jpa = true
   querydslSourcesDir = querydslDir
}
sourceSets {
   main.java.srcDir querydslDir
}
configurations {
   querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
   options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

답변 2

0

안녕하세요. 백엔드 개발자 취준생님, 공식 서포터즈 David입니다.

start.spring.io에서 생성한 스프링부트 3.0.6 버전 기준 프로젝트에서 아래와 같이 build.gradle을 수정한 뒤 bootWar 태스크를 실행하면 Q클래스가 정상적으로 생성됨을 확인했습니다. 우선, 아래 설정 참고 부탁드립니다.

image

build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.6'
	id 'io.spring.dependency-management' version '1.1.0'
	// war 패키징 추가
	id 'war'
}

// war 패키징 추가
bootWar {
	archiveBaseName = 'david-3.0.6'
	archiveFileName = 'david-3.0.6.war'
	archiveVersion = '0.0.1'
}

group = 'com.playground'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	//Querydsl 추가
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"

	// war 패키징 추가
	runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat'
}

tasks.named('test') {
	useJUnitPlatform()
}

//Querydsl 추가
clean {
	delete file('src/main/generated')
}

감사합니다.

정말 감사합니다! 그런데 제가 지금 Tomcat JPS호스팅 절약형을 사용중인데 제가 알기로 java 버전을 8을 지원하는걸로 알고있어서 프로젝트를 8버전으로 진행했는데 17로 바꿔도 상관없을까요??

image

이 부분은 cafe24측에 문의를 해보시는 게 가장 정확할 것 같습니다.

올려주신 프로젝트 확인해 보니 스프링부트2.x 버전대를 사용하시고 있으신데 그렇다면 스프링부트3.x 버전대를 기준으로 작성된 위 설정이 동작하지 않을 것 같습니다.

cafe24에 문의 넣어보겠습니다! 그리고 2.x버전으로 바꿔서 하는방법있는지 찾아보겠습니다!! 그래도 도저히 방법을 못찾겠으면 질문하겠습니다!!ㅎㅎ

0

안녕하세요. 백엔드 개발자 취준생님, 공식 서포터즈 David입니다.
아래 가이드를 따라 프로젝트 공유 부탁드립니다.

전체 프로젝트를 압축한 뒤
구글 드라이브로 공유해서 링크를 남겨주세요.

1. 구글 드라이브 업로드 방법

구글 드라이브 업로드 방법
링크

2. 주의사항
구글 드라이브 공유시
권한을 반드시 확인해주세요

3. 아래 내용을 작성 부탁드립니다.
a. 프로젝트 실행 방법을 알려주세요.
b. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

https://drive.google.com/file/d/1rWzriimYb06OjUR1qMTfxHUw-Mnxj-8m/view?usp=sharing

  1. 프로젝트 실행 방법 :

    1. 파일을 압축해제하고, application-dba.properties 에 username, password, url에 값을 지운 상태입니다. 여기에 해당 값을 입력하기

    2. querydsl을 사용중 이므로 Q클래스들을 생성하기위해 compileQuerydsl

    3. url에 jdbc:mariadb://127.0.0.1:3306/{스키마명} 이런식으로 넣었으면 DB에 {스키마명}을 생성해준다.

    4. 실행시키면 잘작동한다.

  2. 어떻게 문제를 확인할 수 있는지 설명

    1. 프로젝트를 실행시키면서 발생하는 문제는 아니고, 배포할 때 생기는 문제입니다.

    2. cafe24를 이용해서 배포를하는데 이때 ROOT.war파일을 만들고, 이를 FTP서버를 통해 드래그&드랍으로 ROOT.war파일을 서버에 올려주면 일반적으로는 배포가 끝납니다.

    3. 하지만 querydsl을 사용하다보니 Q클래스들이 저장되어있는 폴더가 ROOT.war파일에 포함되지 않는 문제가 발생하였습니다.

    4. ROOT.war파일을 압축해제하여 살펴보니 WEB-INF안에 클래스들과 정적 소스들이 있었습니다. 하지만 Q클래스들은 없었습니다.

    5. image위 그림이 ROOT.war파일을 압축해제한 이미지이고 아래는 링크입니다.

      https://drive.google.com/file/d/1an1V-j4_QQU62ZJeidN5lfT62tEQXXYc/view?usp=sharing

    6. Q클래스들의 경로를 com하위에 하야하거나?무슨 다른 방법을 찾아봐야할 것 같기도하고....어렵네요ㅠㅠㅠ 해결방법알려주시면 너무너무 감사하겠습니다.

ROOT.war를 어떻게 만드셨을까요?

공유해 주신 프로젝트 내에 war 패키징 관련된 gradle task가 보이지 않아서요:)

백엔드 주니어 개발자님의 프로필 이미지
백엔드 주니어 개발자

작성한 질문수

질문하기