inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

상품 수정

상품 삭제, CRUD

315

김태민

작성한 질문수 23

0

안녕하세요 현재 기능상 Create Update Read 밖에 없길래 Delete를 추가하려고 제가 한번 추가해봤는데요. 문제가 발생해서 질문 드립니다.

 

Controller는 이렇구요

@GetMapping("items/{itemId}/delete")
public String deleteItem(@PathVariable Long itemId) {
itemService.deleteItem(itemId);

return "redirect:/items";
}

 

Service 로직은 단순 Repository를 조회하여 쿼리를 날리는 로직입니다.

public void deleteItem(Long itemId) {
itemRepository.delete(itemId);
}

 

그리고 Repository는 

public void delete(Long id) {
em.createQuery("delete from Item i where i.id = :id", Item.class)
.setParameter("id", id);
}

이렇습니다.

 

그리고 삭제 버튼을 추가하기 위해 itemList.html에 

<a href="#" th:href="@{/items/{id}/delete (id=${item.id})}" class="btn btn-danger" role="button">삭제</a>

해당 코드를 추가하였습니다 그래서 순조롭게 Application Run을 하고 삭제버튼을 눌렀는데!

 

IllegalArgumentException : Update/delete queries cannot be typed

라는 Exception이 터지면서 HttpStatus 500이 터지네요 ㅠㅠ 해결방법이 뭘까요?

 

JPA 웹앱 spring-boot spring java

답변 2

0

OMG

아래와 같이 바꿔주세요.

0

OMG

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

 

에러메시지 검색하는데 Okky에 올리신 글 보고 '살짝' 놀랐네요 ㅎㅎ

아래의 링크를 보시면 아시겠지만 

 

em.createQuery("delete from Item i where i.id = :id", Item.class)

두번째 인자인 Item.class를 제거해주세요.

 

참고)

https://titanwolf.org/Network/Articles/Article?AID=8d1e27b8-9ceb-4873-97d0-69cec44c31a7



감사합니다.

0

김태민

답변 너무 감사드립니다 !! 하지만.. White Label 에러 페이지는 해결 되었지만 정상작동이 안되고 있습니다 ㅠㅠ 삭제를 해도 delete 쿼리가 날라가는것도 안보이고 form에도 그대로 유지되어있네요 ㅠㅠ

삭제 직후 redirect:/ 를 했을때 날라가는 쿼리입니다.

 

Hibernate: 

    select

        item0_.item_id as item_id2_3_,

        item0_.name as name3_3_,

        item0_.price as price4_3_,

        item0_.stock_quantity as stock_qu5_3_,

        item0_.artist as artist6_3_,

        item0_.etc as etc7_3_,

        item0_.author as author8_3_,

        item0_.isbn as isbn9_3_,

        item0_.actor as actor10_3_,

        item0_.director as directo11_3_,

        item0_.dtype as dtype1_3_ 

    from

        item item0_

2021-12-02 10:27:11.237  INFO 14679 --- [nio-8080-exec-8] p6spy                                    : #1638408431237 | took 0ms | statement | connection 18| url jdbc:h2:tcp://localhost/~/jpashop

select item0_.item_id as item_id2_3_, item0_.name as name3_3_, item0_.price as price4_3_, item0_.stock_quantity as stock_qu5_3_, item0_.artist as artist6_3_, item0_.etc as etc7_3_, item0_.author as author8_3_, item0_.isbn as isbn9_3_, item0_.actor as actor10_3_, item0_.director as directo11_3_, item0_.dtype as dtype1_3_ from item item0_

select item0_.item_id as item_id2_3_, item0_.name as name3_3_, item0_.price as price4_3_, item0_.stock_quantity as stock_qu5_3_, item0_.artist as artist6_3_, item0_.etc as etc7_3_, item0_.author as author8_3_, item0_.isbn as isbn9_3_, item0_.actor as actor10_3_, item0_.director as directo11_3_, item0_.dtype as dtype1_3_ from item item0_;

2021-12-02 10:27:11.238  INFO 14679 --- [nio-8080-exec-8] p6spy                                    : #1638408431238 | took 0ms | commit | connection 18| url jdbc:h2:tcp://localhost/~/jpashop

 

;

2021-12-02 10:27:12.184  INFO 14679 --- [io-8080-exec-10] p6spy                                    : #1638408432184 | took 0ms | commit | connection 19| url jdbc:h2:tcp://localhost/~/jpashop

 

;

2021-12-02 10:27:12.201  INFO 14679 --- [nio-8080-exec-1] j.jpashop.controller.HomeController      : home controller

 

삭제를 하려면 삭제하려는 id에 맞는 데이터들을 가지고 오기위해 select문이 나가는거 같기도 하지만 정작 중요한 delete쿼리가 날라가지를 않네요 ㅠㅠ.. 이유가 뭘까요? ItemRepository의 query가 잘못 된 걸까요? 혹시 CASCADE 로 연관된 Entity를 다 날려줘야 하는건가요? Abstract Entity라서 인가요?

0

OMG

itemService의 delete처리하는 메서드위에@Transactional 어노테이션을 추가하셨나요?

클래스 레벨에서 @Transactional readOnly=true로 되어있는지요?

0

김태민

확인 결과 적용되어있지 않아서 적용후 Re-run해서 테스트 해본결과 그대로입니다 ㅠㅠ

삭제 후 쿼리도 날라가지 않네요

2021-12-02 11:49:52.106  INFO 15050 --- [nio-8080-exec-6] p6spy                                    : #1638413392106 | took 0ms | commit | connection 9| url jdbc:h2:tcp://localhost/~/jpashop

 

;

2021-12-02 11:49:52.122  INFO 15050 --- [nio-8080-exec-7] j.jpashop.controller.HomeController      : home controller

 

삭제한 직후 찍은 LOG입니다

 

무엇이 문제일까요.. Mapping이 Get으로 되어있어서 그런건가요? @DeleteMapping으로 바꾸고 클래스레벨에 RequestMapping("/")을 추가해도 Get Not Support Exception이 뜨네요 ㅠㅠ

제 전체 소스코드 링크입니다 https://github.com/TeMlN/Real-JPA-EX1 

OrderServiceTest 상문주문 테스트 시 update 쿼리 문의

0

40

1

sdk 설정 오류

0

83

2

오탈자 - @Transactional

0

75

1

src/test/resources 테스트 경로 문제

0

74

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

74

1

MemberRepositoryTest 실행오류

0

98

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

204

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

160

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

61

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

89

1

기본 생성자

0

69

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

109

1

멤버서비스테스트 부분에서 막힙니다.

0

188

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

130

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

134

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

125

1

24분 27초 연관관계 편의 메서드 위치

0

120

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

119

2

빌드 툴, Gradle

0

71

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

85

2

Repository에서 EntityManager 주입 방식 차이

0

100

1

롬복과 사용자 정의 setter 메서드

0

79

1

주문 목록 조회 fetch join 질문드립니다

0

93

1

dirty checking 질문드립니다.

0

91

1