인프런 커뮤니티 질문&답변
일정 삭제 시 예외 발생 질문과 이전 질문에 대한 추가질문드립니다.
작성
·
13
0
// 컨트롤러 메서드
@DeleteMapping("/plan/{no}")
public ResponseEntity<Map<String, Object>> removePlan(@PathVariable(value = "no") int no){
Map<String, Object> resultMap = plannerService.removePlan(no);
return ResponseEntity.ok(resultMap);
}
// 서비스 메서드
@Transactional
public Map<String, Object> removePlan(int no) {
System.out.println("no :" + no);
log.info("removePlan");
Map<String, Object> resultMap = new HashMap<>();
int result = plannerRepository.deleteByPlanNo(no);
if(result > PLAN_DELETE_FAIL){
log.info("REMOVE PLAN SUCCESS");
}else{
log.info("REMOVE PLAN FAIL");
}
resultMap.put("result", result);
return resultMap;
}
// 레퍼지토리 메서드
int deleteByPlanNo(int planNo); // 삭제된 행의 개수
첫번째 질문
위 코드처럼 작성을 하고 delete 버튼을 클릭하면
2025-12-21 20:36:32 ERROR [[dispatcherServlet]] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.ClassCastException: class com.office.calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer (com.office.calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap')] with root cause
java.lang.ClassCastException: class com.office.calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer (com.office.calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap')
at jdk.proxy4/jdk.proxy4.$Proxy153.deleteByPlanNo(Unknown Source) ~[?:?]
at com.office.calendar.planner.PlannerService.removePlan(PlannerService.java:124) ~[main/:?]
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) ~[?:?]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360) ~[spring-aop-6.2.11.jar:6.2.11]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.2.11.jar:6.2.11]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.2.11.jar:6.2.11]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) ~[spring-tx-6.2.11.jar:6.2.11]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.2.11.jar:6.2.11]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.2.11.jar:6.2.11]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) ~[spring-aop-6.2.11.jar:6.2.11]
at com.office.calendar.planner.PlannerService$$SpringCGLIB$$0.removePlan(<generated>) ~[main/:?]
at com.office.calendar.planner.PlannerController.removePlan(PlannerController.java:123) ~[main/:?]
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) ~[?:?]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.11.jar:6.2.11]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.11.jar:6.2.11]
at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936) ~[spring-webmvc-6.2.11.jar:6.2.11]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596) ~[tomcat-embed-core-10.1.46.jar:6.0]
at
...
위 예외가 발생하면서
planner_fetch.js의 fetchRemovePlan 함수에서 catch 문에 걸리면서
alert('일정 삭제 중 오류가 발생했습니다.'); 이 실행됩니다.
서비스에서 deleteByPlanNo를 호출할 때 문제가 발생한 것 같은데
찾아보니 레퍼지토리 메서드에 @Modifying을 붙여보라고 해서 해봤는데 해결은 안됐습니다.
어떤 원인으로 위 같은 예외가 발생한거고, 어떻게 해결할 수 있는지 질문드립니다.
두번째 질문
이전 질문에서
<script src="planner_fetch.js"></script>
<script src="planner.js"></script>
위 코드는 브라우저에서 다음과 같이 처리됩니다.
1. planner_fetch.js를 읽고 실행
2. 그 다음 planner.js를 읽고 실행
3. 이 두 파일은 각각 다른 파일이지만, 브라우저에서는 하나의 JavaScript 실행 공간에서 실행
결과적으로 파일이 나뉘어 있어도 "같은 공간"에서 실행되기 때문에 서로의 전역 변수, 함수 등을 공유할 수 있습니다.
하나 더 중요한 사실이 있는데요, 로딩 순서가 중요합니다.
<script src="planner_fetch.js"></script>
<script src="planner.js"></script>
위와 같은 순서라면, planner_fetch.js가 먼저 실행되고 planner.js에서 planner_fetch.js 안의 함수를 사용할 수 있습니다.
하지만, 로딩 순서를 변경하면
<script src="planner.js"></script>
<script src="planner_fetch.js"></script>
다음과 같은 에러가 발생할 수 있습니다.
fetchPlans(); // 에러 (아직 정의되지 않음)
즉, 먼저 로드 된 파일의 함수만 사용할 수 있습니다.
이렇게 답변을 주셨는데
추가적으로 궁금한 점은
planner.js가 나중에 로드 되어서 planner.js에 있는 함수나 변수를 planner_fetch.js에서 사용하면 정의 되지 않아서 사용을 못해야 할텐데 코드에서는 planner.js에 있는 showDetailPlanView 함수라든지 current_year같은 변수를 사용하고 있는데 에러가 발생하지 않습니다. 이 부분 질문드립니다.
답변




