본문 바로가기

Spring/TroubleShooting8

WebClient OPEN API HTTP GET 호출 문제 상황 1공공데이터 포털의 OPEN API를 이용하여 원하는 데이터를 WebClient를 활용한 HTTP GET 방식으로 추출하려고 다음과 같이 시도하였지만 java.net.UnknownHostException: Failed to resolve 'http:' 오류 발생 원인 1UriBuilder의 path() 메서드에서 전체 URL을 사용한 것이 문제 → http:를 호스트명으로 잘못 해석 ※ UriBuilder.path()는 절대 경로가 아니라 상대 경로를 설정하는 데 사용 해결 방법 1다음과 같이 baseUrl에는 API의 기본 URL을 입력하고 나머지 상대경로는 UriBuilder.path()로 지정 상황 2해결 방법 1로 수정했으나 400 Bad Request 발생  원인 2OPEN API 접근 승.. 2024. 11. 20.
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<java.lang.Object>` from Object value (token `JsonToken.START_OBJECT`) 현상 - RestTemplate.postForEntity()를 통해 데이터를 전송할 때 데이터의 타입을 지정하는 세번째 파라미터에 List.class를 적용하였더니 해당 에러가 발생 원인 - 해당 에러는 RestTemplate.postForEntity()의 세번째 파라미터가 List.class일 경우 데이터 전송 시 List를 구성하는 데이터의 타입 정보가 유실되어 역직렬화에 대한 데이터 타입을 알 수 없어 에러가 발생 해결 방법 - 요청 수령 시 데이터를 처리하는 API를 하나로 개발하지 않고 DTO 종류별 API로 나눠 개발하여 각 API에서 @RequestBody의 데이터 타입을 제네릭에 와일드카드(?)를 사용하지 않고 List처럼 명확히 정의하여 해결 2024. 4. 12.
java.lang.IllegalArgumentException: Cannot generate variable name for non-typed Collection parameter type 현상 1. RestTemplate.postForEntity()를 통해 특정 URL(/receive)에 Client로부터 전송받은 값에 따라 DTO의 종류를 다르게 하여 List 객체를 전송하도록 로직을 구성 List carDtos = carRepo.findAll(); restTemplate.postForObject(".../api/car/receive", carDtos, Void.class); 2. 컨트롤러에 해당 요청 수령 시(/receive) 데이터를 처리하는 로직을 작성하였는데 이때, 하나의 API에서 DTO의 종류에 따라 처리 방식을 다르게 하기 위하여 @RequestBody의 데이터 타입을 List으로 설정하였더니 해당 에러가 발생 원인 - 해당 에러는 Spring에서 컬렉션의 제네릭 타입을 지.. 2024. 4. 11.
@Pathvariable 슬래시(/) 처리 방법 문제 - 슬래시(/)는 URL에서 구분자로 사용되기 때문에 @PathVariable로 불러오는 파라미터 데이터에서 오류가 발생 - 슬래시(/)를 인코딩(%2f)하여 입력하여도 Spring Boot에서 이를 자동으로 디코딩하기 때문에 인코딩 소용 X ※ 또한, Spring Boot는 //처럼 슬래시(/)가 중첩되어 있는 경우에 이를 합쳐서 단일 슬래시(/)로 인식 해결 방법 - @Pathvariable이 아닌 @RequestParam으로 쿼리 스트링을 이용 - 파라미터를 RequestBody에 담아서 받기 2024. 3. 12.
Sqlite LocalDateTime 적용 문제 문제 MySQL과 다르게 Sqlite는 Spring Data JPA를 통해 LocalDateTime을 적용하여 Entity 혹은 DTO의 필드(컬럼)를 정의하면 날짜 데이터가 아닌 알아보기 힘든 숫자 형식으로 데이터가 DB에 저장됨 해결 방법 LocalDateTime 데이터를 DateTimeFormatter를 이용하여 String으로 변환하여 저장 public class carDTO { @Column(columnDefinition = "text", updatable = false) private String createdDateTime; @Column(columnDefinition = "text") private String modifiedDateTime; @PrePersist protected void.. 2024. 2. 19.
SSLHandshakeException: PKIX ~ 인증서 관련 에러 에러 내용 - HTTPS 통신과 관련하여 인증서 문제가 발생했을 경우 나타남 에러 원인 1. 신뢰할 수 없는 CA 인증서 경우 - 새로운 CA로부터 가져온 인증서가 아직 신뢰할 수 없거나 애플리케이션이 CA가 없는 구형 버전에서 실행 중인 경우 - 해결 방법 InputStream에서 특정 CA 가져오기 → CA를 사용하여 keystore 생성 → keystore를 사용하여 TrustManager 생성 → TrustManager를 통해 SSLContext 초기화 → 인증서 확인을 위해 CA를 사용 (TrustManager에서 신뢰할 수 있는 유일한 CA) // Load CAs from an InputStream CertificateFactory cf = CertificateFactory.getInstanc.. 2024. 2. 15.
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name~ 원인 - Controller에서 API를 정의할 때 서로 메소드 명은 다르지만 같은 HTTP 메소드와 URL을 가지고 있는 API들이 존재했던 것이 원인 해결 방법 - 서로 HTTP 메소드와 URL이 겹쳤던 메소드 중에 하나를 삭제하니 해결됨 Ex @RestController @RequestMapping("/api") public class ShopController { @GetMapping("/a") public void buy { .... } @GetMapping("/a") public void purchase { .... } } 2024. 1. 8.
Bean 수동 주입 방법 (@Autowired로 빈 주입 실패 시) 사용 이유 (문제 상황) - JpaRepository 객체를 상위 패키지가 동일한 서로 다른 두 개의 클래스에 각각 @Autowired를 통해 Bean을 주입 받도록 설정 - 한 클래스에서는 정상적으로 주입되어 쿼리 메소드가 정상적으로 실행되었지만 다른 클래스에서는 Bean이 주입되지 않아 객체가 null로 조회되어 NullPointerException이 발생 해결 방법 - 다음과 같이 ApplicationContextProvider와 BeanUtils 정의 후 ApplicationContext의 getBean()을 통해 파라미터로 입력한 객체의 빈을 받아와 객체에 직접 Bean을 주입 private CarRepository carRepo; CarRepo = BeanUtils.getBean(CarRepo.. 2024. 1. 4.