[오류]

주문를 할 경우 아래와 같은 오류로  화면이 랜딩되지 않는 오류 발생

 

아래 더 오류를 보니 주문상태 값을 가져오지 못해 발생한 것을 알 수있었다

Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "T(jpabook.jpashop.domain.OrderStatus).values()" (template: "order/orderList" - line 16, col 33)
	at org.attoparser.MarkupParser.parseDocument(MarkupParser.java:393)
	at org.attoparser.MarkupParser.parse(MarkupParser.java:257)
	at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:230)
	... 48 more

 

 

 

[오류 원인]

강의에서 html 부분은 복붙하여 사용하여 그대로 나도 복붙해서 사용했는데 경로가 달라서 발생하는 문제였다

복붙을 하더라도 한 번 확인했어야 하는 부분인데 시간을 너무 많이 잡아 먹었다.

여기서 사용한 T연산자는 Thymeleaf의 표현식인데 이렇게 풀경로를 적어서 왜 values() 메소드를 호출했는지 모르겠다.

그래서 T연산자를 사용하지 않고 불러오도록 수정하려고 한다.

 

[코드 수정]

1.컨트롤러에서 모델에 Enum 값 추가

먼저, OrderController 컨트롤러에서 OrderStatus enum의 values() 메소드를 호출하여 모든 enum 값을 가져온 후, 이를 orderList.html 뷰로 전달하기 위해 모델에 추가

model.addAttribute("orderStatuses", OrderStatus.values());

 

 

 

 

2. 컨트롤러에서 모델에 추가된 orderStatuses를 Thymeleaf 템플릿에서 사용하여 옵션을 생성

T연산자사용한 부분을 지우고 아래와 같이 수정해주었다

<option th:each=
                "status : ${T(jpabook.jpashop2.domain.OrderStatus).values()}"

수정 전

status : ${orderStatuses}

 

수정 후

 

3. 정상작동

프로젝트 수행 중 html 복붙을 하였는데 아래와 같은 오류가 발생하였다 

 

org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/item/createItemForm.html]") 에러상황

 

TemplateInputException: An error happened during template parsing 에러 내용을 검색해보니 html를 가져오는 중에 깨지는 것이라고 하여

 

[오류 해결 시도]

1.  class간 연결관계에 문제가 있을 수 있으므로, 우선  creatItemform.html에서 복붙했던 코드를 지우고 <body>에 간단한 코드를 작성한뒤 다시 연결해보니 정상출력됨

 

2.복붙한 html에서 쓰는 필드명 오타난거 있나 확인

Bookform.java에서 저자 필드명 오타 확인

 

3. author 관련 코드 모두 수정

 

4.재실행

 

5. 해결

 

html를 복붙하였는데 왜 오류가 발생하는지 이해할 수 없었는데 결국 천천히 관련 코드를 보니 내가 직접 코딩하면서 발생한 오타 때문이였다.

TEST 진행 중 아래와 같은 this.em NullPointException 오류발견

java.lang.NullPointerException: Cannot invoke "jakarta.persistence.EntityManager.createQuery(String, java.lang.Class)" because "this.em" is null

	at jpabook.jpashop2.repository.MemberRepository.findByName(MemberRepository.java:31)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)

 

 

 

@Autowired를 사용하지 않고 

@RequiredArgsConstructor 로 변경하면서  final 을 붙이지 않아 오류 발생

 

 

@RequiredArgsConstructor 이란?

final 키워드를 사용한 인스턴스만  Bean 객체로 등록한다

final 키워드를 사용하지 않았을 경우 NullPointException 오류 발생

 

 

@Autowired 사용하지 않고 @RequiredArgsConstructor 변경이유 :

 

@Autowired  어노테이션과 생성자를 사용하여 의존성 주입 3가지 방법

1)필드 주입

2) setter 주입

3)생성자 주입

 

스프링이 공식적으로 추천하는 방법은 생성자 주입이다. 한번 의존성을 주입받은 객체는 프로그램이 끝날때까지 변하지 않는 특징을 가지므로 [불변성]을 표시해주는 것이 좋기 때문이다

 

그래서 의존성을 주입할 객체는 final 키워드를 사용하는 것

 

 

 

 

Spring Boot 2.2.x 버전부터는 junit5가 기본으로 설정되어있음

해당 프로젝트에서는 junit4를 사용하기 위해 변경

 

 

1. build.gradle -> dependencies 안에 아래 코드 넣기

testImplementation("org.junit.vintage:junit-vintage-engine") {
    exclude group: "org.hamcrest", module: "hamcrest-core"
}

 

2.Reload

+ Recent posts