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

섭섭님의 프로필 이미지

작성한 질문수

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

queryDsl Cannot find symbol이라고 뜹니다

21.12.22 18:41 작성

·

5.3K

0

 

 

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

 

또한 

 

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

답변 9

1

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

2021. 12. 24. 11:35

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

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

1

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

2021. 12. 22. 20:39

안녕하세요. 섭섭님

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

다음을 참고해주세요.

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

감사합니다.

0

OMG님의 프로필 이미지

2021. 12. 27. 21:37

<!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>
OMG님의 프로필 이미지

2021. 12. 27. 21:38

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

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

2021. 12. 27. 21:44

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

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

2021. 12. 27. 22:14

<!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>
섭섭님의 프로필 이미지
섭섭
질문자

2021. 12. 27. 22:15

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

OMG님의 프로필 이미지

2021. 12. 27. 22:19

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

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

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

 

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

양해부탁드려요

 

 

 

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

2021. 12. 27. 22:58

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

OMG님의 프로필 이미지

2021. 12. 27. 23:53

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

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

OMG님의 프로필 이미지

2021. 12. 29. 23:57

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

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

 

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

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

2021. 12. 30. 00:03

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

0

OMG님의 프로필 이미지

2021. 12. 27. 21:34

 

 

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

 

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

 

0

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

2021. 12. 27. 09:44

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

 

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

2021. 12. 27. 10:04

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

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

OMG님의 프로필 이미지

2021. 12. 27. 20:50

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

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

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

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

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

2021. 12. 27. 21:25

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

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

 

 

1. orderList.html

 

 

2. OrderController

 

 

 

 

3. OrderStatus

 

 

 

 

 

 

 

 

0

OMG님의 프로필 이미지

2021. 12. 25. 07:51

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

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

 

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 주석 처리 해제 후 실행확인

 

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

OMG님의 프로필 이미지

2021. 12. 25. 09:09

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

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

0

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

2021. 12. 24. 13:00

 

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

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

도와주세요 사랑합니다

 

0

OMG님의 프로필 이미지

2021. 12. 23. 23:33

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

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

클릭하여 reload 해주세요.


감사합니다.

0

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

2021. 12. 23. 11:32

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

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

답답ㅠ

 

섭섭님의 프로필 이미지

작성한 질문수

질문하기