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

섭섭님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

queryDsl Cannot find symbol이라고 뜹니다

작성

·

5.4K

0

 

 

이렇게 찾을 수 없다고 뜨는데 이유를 모르겠습니다

 

또한 

 

위에 있는 코드로 했을 경우에는 QOrder 등 파일이 생성이 되는데 밑에있는 코드로 했을 경우는 generated 파일 자체가 생성이 안되고 완료했다는 코드만 뜹니다ㅠ

답변 9

1

섭섭님의 프로필 이미지
섭섭
질문자

다들 $buildDir 을 사용하라고 하는데 전 Cannot assign 'GString' 이렇게 뜨는데 이게 문제일까요...

이 코드로 했을 경우는 아에 generated 디렉토리가 생성 자체가 안돼요ㅜㅠㅠ

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 섭섭님

Querydsl이 설정이 버전업 마다 조금씩 달려져서 어려운 점이 있습니다.

다음을 참고해주세요.

https://www.inflearn.com/questions/355723

감사합니다.

0

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header"/>
<body>

<div class="container">

<div th:replace="fragments/bodyHeader :: bodyHeader"/>

<div>
<div>
<form th:object="${orderSearch}" class="form-inline">
<div class="form-group mb-2">
<input type="text" th:field="*{memberName}" class="form-control" placeholder="회원명"/>
</div>
<div class="form-group mx-sm-1 mb-2">
<select th:field="*{orderStatus}" class="form-control">
<option value="">주문상태</option>
<option th:each="status : ${T(jpabook.jpashop.domain.OrderStatus).values()}"
th:value="${status}"
th:text="${status}">option
</option>
</select>
</div>
<button type="submit" class="btn btn-primary mb-2">검색</button>
</form>
</div>

<table class="table table-striped">
<thead>
<tr>
<th>#</th>
<th>회원명</th>
<th>대표상품 이름</th>
<th>대표상품 주문가격</th>
<th>대표상품 주문수량</th>
<th>상태</th>
<th>일시</th>
<th></th>
</tr>
</thead>
<tbody>
<tr th:each="item : ${orders}">
<td th:text="${item.id}"></td>
<td th:text="${item.member.name}"></td>
<td th:text="${item.orderItems[0].item.name}"></td>
<td th:text="${item.orderItems[0].orderPrice}"></td>
<td th:text="${item.orderItems[0].count}"></td>
<td th:text="${item.status}"></td>
<td th:text="${item.orderDate}"></td>
<td>
<a th:if="${item.status.name() == 'ORDER'}" href="#" th:href="'javascript:cancel('+${item.id}+')'"
class="btn btn-danger">CANCEL</a>
</td>
</tr>

</tbody>
</table>
</div>

<div th:replace="fragments/footer :: footer"/>

</div> <!-- /container -->

</body>
<script>
function cancel(id) {
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "/orders/" + id + "/cancel");
document.body.appendChild(form);
form.submit();
}
</script>
</html>

이 코드로 테스트 해보시겠어요?

섭섭님의 프로필 이미지
섭섭
질문자

주신 코드로 했는데도 똑같은 오류가 뜨네요ㅠㅠㅠ

섭섭님의 프로필 이미지
섭섭
질문자

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header"/>
<body>

<div class="container">

<div th:replace="fragments/bodyHeader :: bodyHeader"/>

<div>
<div>
<form th:object="${orderSearch}" class="form-inline">
<div class="form-group mb-2">
<input type="text" th:field="*{memberName}" class="form-control" placeholder="회원명"/>
</div>
<div class="form-group mx-sm-1 mb-2">
<select th:field="*{orderStatus}" class="form-control">
<option value="">주문상태</option>
<option th:each="status : ${T(jpabook.jpashop.domain.OrderStatus).values()}" th:value="${status}" th:text="${status}">option</option>
</select>
</div>
<button type="submit" class="btn btn-primary mb-2">검색</button>
</form>
</div>

<table class="table table-striped">
<thead>
<tr>
<th>#</th>
<th>회원명</th>
<th>대표상품 이름</th>
<th>대표상품 주문가격</th>
<th>대표상품 주문수량</th>
<th>상태</th>
<th>일시</th>
<th></th>
</tr>
</thead>
<tbody>
<tr th:each="item : ${orders}">
<td th:text="${item.id}"></td>
<td th:text="${item.member.name}"></td>
<td th:text="${item.orderItems[0].item.name}"></td>
<td th:text="${item.orderItems[0].orderPrice}"></td>
<td th:text="${item.orderItems[0].count}"></td>
<td th:text="${item.status}"></td>
<td th:text="${item.orderDate}"></td>
<td>
<a th:if="${item.status.name() == 'ORDER'}" href="#" th:href="'javascript:cancel('+${item.id}+')'" class="btn btn-danger">CANCEL</a>
</td>
</tr>

</tbody>
</table>
</div>

<div th:replace="fragments/footer :: footer"/>

</div> <!-- /container -->

</body>
<script>
function cancel(id) {
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "/orders/" + id + "/cancel");
document.body.appendChild(form);
form.submit();
}
</script>
</html>
섭섭님의 프로필 이미지
섭섭
질문자

복사해서 붙여놓고 한줄로 맞춰도 똑같은 에러가 뜨네요ㅠㅠㅠ

올려주신 코드가 제 환경에서 정상작동하는 것으로 보아 다른 부분에서 발생하는 문제인 것 같습니다.

전체 코드를 봐야 알 것 같네요. 강의 코드를 따라하시다 발생한 문제라면,

제공해드리는 완성된 프로젝트 코드로 진행하시고, querydsl도 알려드려서 해결한 설정(코드)을 적용하시면 될 것 같습니다.

 

완성된 코드를 제공해드리는 이유가 강의중 진행한 코드 오타 등의 문제로 영한님과 서포터즈가 도움 드리기 힘든 점이 있어 제공해드리고 있습니다.

양해부탁드려요

 

 

 

섭섭님의 프로필 이미지
섭섭
질문자

넵!!! 하나씩 비교해보면서 머가 문제인지 알아보겠습니다 감사합니다~!!!!!

원인을 발견하시게 되면 공유해주세요~^^

후에 동일한 에러가 발생하는 수강생분들에게 참고로 말씀드리면 큰 도움이 될 것같아서요 :)

섭섭님 안녕하세요.  이전 답변을 찾아보던 중 지금과 동일한 에러이지만 다른 상황에서 발생하는 것을 확인하였습니다.

아래 답변으로 해결될지는 모르겠지만 확인 부탁드립니다.

 

application.yml에 아래 설정이 있다면 지워주세요 :)

 open-in-view: false
섭섭님의 프로필 이미지
섭섭
질문자

와우....이게 문제였네요....충격...감사합니다..!!!!

0

 

 

option과 a 태그를 한줄로 해주세요

 

그래도 안될 경우, orderlist.html 코드를 복사 가능하도록 텍스트로 올려주시면 확인해보겠습니다.

 

0

섭섭님의 프로필 이미지
섭섭
질문자

알려주신 코드대로 해보니까 이렇게 뜨네요..

 

섭섭님의 프로필 이미지
섭섭
질문자

다른 코드로 하니까 검색이 됩니다!!!

근데 문제는 그 이후로 갑자기 orderList가 파싱하는 과정에서 에러가 뜹니다...ㅠㅠ아무것도 손댄거 없고 여태까지 잘 됐는데..

타임리프 태그에서 닫는 태그 전 줄바꿈 시 발생할 수 있는 문제입니다. 아래를 참고하여 줄바꿈 되어있는지 확인해주세요.

<여는태그> </닫는태그> 

줄바꿈이 있으면 위와 같이 한줄로 맞춰주세요.

https://www.inflearn.com/questions/362231

섭섭님의 프로필 이미지
섭섭
질문자

줄바꿈이랑 확인했는데 어디서 문제가 일어나는지 잘 모르겠습니다!

코드는 캡쳐해서 다 올렸습니다ㅠㅠㅠ확인 부탁드립니다 감사합니다!

 

 

1. orderList.html

 

 

2. OrderController

 

 

 

 

3. OrderStatus

 

 

 

 

 

 

 

 

0

어제 저녁에 답변을 남겼는데 글이 안올라갔네요 -,-;

제가 해결한 방법을 설명드릴테니 시도해주세요

 

0. 개발환경(자바11, 인텔리제이 얼티메이트(유료) 2021.1.2)

1. 동일한 프로젝트로 진행하기 위해 강의에서 제공해드리는 완성된 프로젝트 코드로 진행해주세요.(다운로드 및 실행 해주세요)

2.  build.gradle을 아래로 바꾼 후 코끼리 버튼 누르세요

//querydsl 추가
buildscript {
dependencies {
classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10")
}
}

plugins {
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}

group = 'jpabook'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

//apply plugin: 'io.spring.dependency-management'
apply plugin: "com.ewerk.gradle.plugins.querydsl"

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
// implementation 'org.hibernate:hibernate-core:5.4.13.Final'

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'

annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//추가
testImplementation("org.junit.vintage:junit-vintage-engine") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}

//querydsl 추가
implementation 'com.querydsl:querydsl-jpa'
//querydsl 추가
implementation 'com.querydsl:querydsl-apt'
}


//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
//querydsl 추가 끝

3.  compileQuerydsl을 클릭

4. 인텔리제이에서 shift 2번 클릭하여 QOrder 검색(All) 하여 검색되는지 확인

5. application.yml 주석 처리 해제 후 실행확인

 

여기까지 진행 후 결과를 공유해주세요

Q파일의 물리적 위치를 찾으려면 build 하위에서 찾으면 됩니다.

src/java/genereated로 지정한게 아니여서 찾아보니 build directory 하위에 있더라구요.

0

섭섭님의 프로필 이미지
섭섭
질문자

 

강사님처럼 밑에 뜨는게 아니고 위에 저렇게 파일이 만들어지긴해서 했는데 이제는 no session이 뜨더라구요ㅠ

크리스마스이브인데 귀찮게 해드리고 있네요

도와주세요 사랑합니다

 

0

안녕하세요. 섭섭님, 공식 서포터즈 OMG입니다.

올리신 이미지 우측에 보면 코끼리 버튼이 활성화 되어있습니다.

클릭하여 reload 해주세요.


감사합니다.

0

섭섭님의 프로필 이미지
섭섭
질문자

어제부터 계속 찾아보고 똑같이 해봤는데도 안되네요...

설명에 나와있는 것처럼 $buildDir로 된 코드로 만들면 generated는 아에 생성도 되지않아서 위 코드로만 해야하고 그렇게 했을 경우 Q파일들은 제대로 만들어지나 돌리면 결국 계속 cannot find symbol이라고 뜨네요..

답답ㅠ

 

섭섭님의 프로필 이미지

작성한 질문수

질문하기