문제가 되는 부분
/* 삭제 */
$('button[data-action="deleteList"]').on('click', function() {
var selectedCrsCdList = $('.item-checkbox:checked').map(function() {
return { crsCd: $(this).val() };
}).get();
if (selectedCrsCdList.length === 0) {
alert("삭제할 항목이 없습니다.");
return;
}
ajaxRequest2('/deleteCrs', 'POST', JSON.stringify({ selectedCrsCdList: selectedCrsCdList }), function(data) {
alert("삭제 완료 !");
appendTbody($('#list table'), data);
});
});
삭제 버튼을 누르면 계속 415 (Unsupported Media Type) 오류가 발생했다.
ajaxRequest2에서도 분명히 content-type을 아래와 같이
contentType: 'application/json; charset=UTF-8',
잘 설정했는데도 계속 같은 오류가 발생했다.
해당 오류에 대해 여기 저기 찾아보니 @RequestBody 설정 문제이거나, Jackson 라이브러리 의존성 문제라고하는데,
나는 @RequestBody도 잘 되어있고, Jackson 라이브러리도 pom.xml에 있었다.
그런데도 자꾸 같은 오류가 발생해 컨트롤러에도 method와 consumes를 추가해주었다.
@RequestMapping(value = "/deleteCrs", method = RequestMethod.POST, consumes = "application/json")
public @ResponseBody String deleteList(@RequestBody Map<String, List<SelectVo>> requestBody, SelectVo vo) throws Exception {
List<SelectVo> list = requestBody.get("selectedCrsCdList");
cou1100eService.deleteList(list);
List<SelectVo> selectList = cou1100eService.getSelectList(vo);
return objectMapper.writeValueAsString(selectList);
}
그런데도 계속 같은 오류가 발생했다....

또 다시 찾아보던 중 spring-servlet.xml 에 <mvc:annotation-driven/> 태그를 추가해야한다는 것을 발견했다.
해당 태그는 spring MVC에서 어노테이션 기반의 웹 애플리케이션을 설정하는 것으로
주로 @Controller, @RequestMapping, @ResponseBody, @RestController와 같은 어노테이션을 사용할 수 있도록 지원한다고 한다.
<context:component-scan>으로 컨트롤러 및 서비스 클래스를 자동으로 등록하고,
<mvc:annotation-driven/>으로 MVC 기능을 활성화해야 한다.
<mvc:annotation-driven/>을 사용하면 내부에서 자동으로 RequestMappingHandlerMapping 과 RequestMappingHandlerAdapter를 구성해주어 Handler 역할을 쉽게 구현시켜준다.
HandlerMapping : HTTP 요청 정보를 이용해서 컨트롤러를 찾아주는 기능으로 요청 URL을 보고 어떤 Controller가 처리할지 결정
HandlerAdapter : HandlerMapping을 통해 찾은 컨트롤러를 직접 실행하는 기능을 수행
그래서 spring-servlet.xml에 해당 태그를 넣어주고 다시 시도해봤더니 이번에는 415 오류가 아닌 아래와 같은 서버 오류가 발생했다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/ValidationException
gpt에 물어보니 해당오류는 Java 9 이상에서 발생할 수 있으며, javax.xml.bind 패키지가 기본 JDK에서 제거되었기 때문에 발생한다고 한다. 이를 해결하기 위해서는 JAXB API를 명시적으로 의존성으로 추가해야 한다고 한다.
그래서 mvn repository에서 아래와 같이 의존성을 추가해주었다.
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb.version}</version>
</dependency>
그리고 다시 해보니 잘 삭제되는 것을 확인할 수 있었다.
'공부할 것 !' 카테고리의 다른 글
Entity <-> DTO 변환 (1) | 2025.02.05 |
---|---|
[오류] java.lang.IllegalStateException (0) | 2024.09.20 |
chart.js를 이용해 데이터 시각화하기 (0) | 2024.08.23 |
AOP (0) | 2024.08.22 |
Maven, 형상관리 (0) | 2024.08.20 |