개발/Spring 4

[Spring] json deserialize ClassCastException

내부 API 통신 중 T 타입으로 받은 DTO가 해당 DTO 객체가 아닌 LinkedHashMap으로 인식되는 문제를 겪었습니다. 이유를 찾아보니 WebClient의 bodyToMono(Class) 를 통해 역직렬화시 내부적으로 Jakson 라이브러리를 사용하며 json 데이터를 단순히 List로 지정시 "객체"가 어떤것인지 명확하게 알지못하기 때문에 기본 타입인 LinkedHashMap으로 변환하게 됩니다. 구글링에서 흔히 나오는 간단한 해결 방법은 다음과 같았습니다. ObjectMapper mapper = new ObjectMapper(); mapper.convertValue(타겟 클래스, new TypeReference()); 하지만 별도의 후처리가 번거롭다면 문제점 자체가 어떤 타입인지 명확히 알..

개발/Spring 2022.06.16

InvalidDefinitionException 에러

WebClient를 사용하여 크롤링할 데이터를 받는 도중 InvalidDefinitionException 에러가 발생했다. 에러 로그를 읽어보니 기본 생성자가 없다고 나오고 관련 검색을 해봐도 기본 생성자를 생성해봐라! 라는 답변이었다. 이는 불변 객체를 선언하고 싶은 나에게는 맞지 않는 해답이기 때문에 더 찾아보니 @JsonCreateor와 @JsonProperty를 사용하는 방법을 찾았고 다음과 같이 수정 후 정상 작동하는것을 확인했다. 참고 https://www.baeldung.com/jackson-deserialize-immutable-objects Deserialize Immutable Objects with Jackson | Baeldung Learn how to use Jackson to d..

개발/Spring 2022.06.08

Spring Data JPA - 2

패스트캠퍼스 강의를 보며 정리한 내용입니다. 1. @Repository persistence layer를 구현하는 클래스는 @Component와 마찬가지로 해당 클래스를 빈으로 등록해서 사용해야 합니다.@Repository로 등록을 하게되면 persistence layer에서 발생하는 에러를 DataAccessException으로 Spirng error로처리해주기 때문입니다. 하지만 JPA를 사용할 때 어노테이션 없이 extends 받는것만으로 사용하고 있는데 그 이유는 상속받는 JpaRepository의 구현체를 따라가보면 알 수 있습니다 따라서 Spring Data JPA를 사용하게 될 경우 직접 @Repository 어노테이션을 사용할 일은 없다고 봐도 무방합니다. JpaRepository의 상속 ..

개발/Spring 2022.02.25

Spring Data JPA - 1

1. JPA 개요 1-1. ORM Object Relational Mapping의 약자로 한글 해석은 객체 관계형 매핑입니다. 간단하게 말하면 관계형 데이터베이스의 테이블 데이터를 자바 객체와 매핑하는 기술을 뜻합니다. ORM을 통해 얻고자 하는 것들은 다음과 같습니다. 특정 DB에 종속된 표현이나 구현들을 할 필요가 없기에 DB 변경에 유연함. DB에 종속된 표현이 아닌 객체의 이점을 살릴 수 있기에 객체간 참조나 type-safety에 유리함. 연결 관리, 자원의 관리 등의 동작을 프레임워크에 맡겨 필요한 비즈니스 로직에만 집중할 수 있음. 1-2. JPA Jakarta(Java) Persistence API의 약자로 자바에서 ORM 기술을 활용하여 RDBMS를 다루기 위한 인터페이스의 집합입니다. ..

개발/Spring 2022.02.24