반응형
문제 상황
Spring과 MyBatis를 사용해 애플리케이션 개발 중,
Java의 Map 객체를 PostgreSQL 데이터베이스에 저장하려고 하면 다음과 같은 에러를 만날 수 있습니다:
org.postgresql.util.PSQLException: No hstore extension installed.
이 에러는 PostgreSQL에서 hstore 확장이 설치되지 않았거나,
Map 객체를 저장할 적절한 방식으로 변환하지 않았기 때문에 발생합니다.
responseBody = Map.of(
"status", "error",
"error_code", e instanceof HttpClientErrorException ? ((HttpClientErrorException) e).getStatusCode().value() :
e instanceof HttpServerErrorException ? ((HttpServerErrorException) e).getStatusCode().value() : 500,
"message", e.getMessage()
);
map.put("content", responseBody);
sqlSession.insert(namespace + ".insert", map); // 데이터베이스에 저장
이 코드에서 responseBody는 Java의 Map 객체입니다.
PostgreSQL은 Map 객체를 직접 처리할 수 없기 때문에, 에러가 발생합니다.
원인 분석
- PostgreSQL의 데이터 타입 제한 PostgreSQL은 Map 객체를 저장할 수 없으며, hstore 또는 jsonb와 같은 데이터 타입을 사용해야 합니다.
- Java 객체 변환 필요 Java의 Map 객체를 PostgreSQL에 저장하려면, JSON 문자열로 변환하거나 PostgreSQL의 hstore 타입에 맞게 변환해야 합니다.
- hstore 확장 미설치 hstore를 사용하려면 PostgreSQL에서 해당 확장이 설치되어 있어야 합니다. 그렇지 않으면 No hstore extension installed 에러가 발생합니다.
해결 방법
Map을 JSON 문자열로 변환
Java의 Map 객체를 PostgreSQL에 저장하기 전에
JSON 문자열로 변환하면, PostgreSQL의 json 또는 jsonb 타입에 저장할 수 있습니다.
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper objectMapper = new ObjectMapper();
responseBody = Map.of(
"status", "error",
"error_code", e instanceof HttpClientErrorException ? ((HttpClientErrorException) e).getStatusCode().value() :
e instanceof HttpServerErrorException ? ((HttpServerErrorException) e).getStatusCode().value() : 500,
"message", e.getMessage()
);
try {
// Map을 JSON 문자열로 변환
String responseBodyJson = objectMapper.writeValueAsString(responseBody);
map.put("content", responseBodyJson);
// 데이터베이스 저장
sqlSession.insert(namespace + ".insert", map);
} catch (Exception e) {
e.printStackTrace();
}
위와같이 Map을 JSON 문자열로 변환하여 DB에 저장할 수 있습니다.
objectMapper.writeValueAsString 은
Java 객체를 JSON 형식의 문자열로 변환하는 메서드입니다.
변환된 데이터는 String 타입이지만, 그 내용은 JSON 형식입니다.
이를 데이터베이스나 API 응답으로 사용할 수 있습니다.
이번에 회사에서 API를 연동시키고있는데, 에러 로그를 저장하다 알게된 사실입니다 :>
반응형
'Java' 카테고리의 다른 글
Java | JAVA의 컴파일 과정 (2) | 2024.12.20 |
---|---|
Java | ExecutorService와 Future를 활용한 병렬 처리 이해 (0) | 2024.12.19 |
Java | JIT 컴파일러에 대해 (0) | 2024.12.18 |
Java | HashSet이란? HashSet을 사용하기 좋은 상황(CT) (1) | 2024.12.09 |
Java | 내장 메서드를 활용한 진법 변환 정리 (0) | 2024.12.09 |