본문 바로가기

Spring28

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.
SseEmitter 정의- org.springframework.web.servlet.mvc.method.annotation.SseEmitter- Spring에서 SSE(Server-Sent Event)를 구현하기 위한 클래스 특징- 클라이언트로 텍스트 기반의 이벤트 전송 (String이 아닌 데이터들 toString() 필수)- 클라이언트와의 연결 유지, 데이터 전송, 연결 종료 기능을 제공- 실시간 업데이트 혹은 클라이언트에서 서버로부터 비동기적으로 데이터 수신 시에 주로 사용 주요 메소드- send() = 클라이언트로 이벤트 전송- complete() = SSE 연결 종료- completeWithError() = SSE 연결을 오류 상태로 종료- onCompletion() = SSE 연결이 종료될 때 수행할 작업 정의 .. 2024. 4. 29.
Spring Data Redis 정의- Spring Boot와 Redis 간의 상호작용이 가능하도록 제공하는 Spring Boot 외부 라이브러리- Redis를 DB 또는 캐시로 사용하는 경우에 사용 (세션 관리일 경우에는 Spring Session Data Redis 사용)- RedisTemplate 클래스를 사용하여 Redis와의 상호작용을 지원implementation 'org.springframework.boot:spring-boot-starter-data-redis' RedisTemplate정의 및 특징- Redis에 데이터를 저장, 검색, 갱신 및 삭제하는 데 사용 (CRUD)- 직렬화/역직렬화, 트랜잭션 처리, 파이프라인 지원 등을 포함한 다양한 기능을 제공 - Redis 트랜잭션 지원- Redis 파이프라인 지원- 제네릭.. 2024. 4. 18.
Session 타임 아웃 설정 필요성 - 사용자가 웹 사이트를 떠나거나 일정 시간 동안 아무런 활동을 하지 않을 때 세션을 자동으로 종료시켜 보안을 강화하고 서버 리소스를 효율적으로 관리할 수 있음 → 일정 시간이 지나면 자동 로그아웃 - 세션은 서버의 메모리에 저장되는데 별도의 타임 아웃 설정 없이 무한정 보관하게 되면 메모리 초과로 인하여 서버에 과부하가 올 수 있음 - 유저의 세션을 해커가 탈취했을 때 서버쪽에서 해당 유저의 세션이 살아있다면 악의적인 접근 및 공격이 가능함 적용 방법 - HTTP Session은 기본 생명 주기가 30분 - application.properties에서 다음 설정을 입력 ※ 두 속성 모두 기본 단위는 초(s)이며 m(분), h(시) 입력 가능 server.servlet.session.timeout.. 2024. 4. 15.
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.
JPQL(Java Persistence Query Language) 정의 - 객체 지향 DB의 엔티티에 대한 쿼리를 정의하기 위한 객체 지향 쿼리 언어로 JPA의 일부분 중 하나 - DB의 테이블(Table)이 아닌 Spring에서 정의한 엔티티(Entity)를 기준으로 함 테이블과 엔티티의 차이 - 테이블 = DB 혹은 SQL 상에 실제로 존재하며 행과 열의 물리적인 구조를 가지고 있음 - 엔티티 = DB나 SQL 상에 실제로 존재하지 않고 OOP에서 개체를 나타내는 추상적인 개념이며 Java와 같은 객체 지향 언어에서 필드와 메소드를 포함하는 클래스로 정의됨 주의 사항 1. 쿼리문에 *를 사용할 수 없음 2. 오류는 발생하지 않지만 엔티티명의 첫 글자는 대문자로 입력하는 것이 일반적인 관례 3. @Entity(name=)을 통해 엔티티명을 별도로 지정하지 않는 경우 .. 2024. 4. 5.
spring.jpa.hibernate.ddl-auto ddl-auto 속성 - DB 스키마 생성 및 갱신과 관련된 설정 - 개발자가 어플리케이션을 실행할 때 JPA가 데이터베이스 스키마를 자동으로 생성, 갱신 또는 유지하도록 할지를 결정함 spring.jpa.hibernate.ddl-auto=update create - 애플리케이션을 실행할 때마다 DB 스키마를 새로 생성 - 만약 DB에 테이블이 있는 상태라면 기존 테이블을 모두 삭제하고 새로 생성함 create-drop - create와 같이 애플리케이션을 실행할 때마다 DB 스키마를 새로 생성하지만 애플리케이션이 종료되면 스키마를 다시 삭제함 - 주로 테스트 환경에서 사용하며, 애플리케이션의 실행 사이에 스키마를 생성하는 것이 효율적일 때 유용 update - 현재 DB 스키마를 기준으로 JPA 엔티티.. 2024. 3. 19.
JDBC와 DB 연동 JDBC (Java DataBase Connectivity) - Java를 통해 관계형 데이터베이스(RDB)와 통신할 수 있도록 해주는 자바 API JDBC Driver - Java 프로그램이 관계형 데이터베이스와 통신할 수 있도록 해주는 소프트웨어 모듈 DB 종류별 JDBC Driver MySQL = com.mysql.cj.jdbc.Driver MariaDB = org.mariadb.jdbc.Driver Oracle = oracle.jdbc.driver.OracleDriver SQLite = org.sqlite.JDBC PostgreSQL = org.postgresql.Driver MSSQL = com.microsoft.sqlserver.jdbc.SQLServerDriver DB 종류별 의존성 설정 (.. 2024. 3. 19.
@Pathvariable 슬래시(/) 처리 방법 문제 - 슬래시(/)는 URL에서 구분자로 사용되기 때문에 @PathVariable로 불러오는 파라미터 데이터에서 오류가 발생 - 슬래시(/)를 인코딩(%2f)하여 입력하여도 Spring Boot에서 이를 자동으로 디코딩하기 때문에 인코딩 소용 X ※ 또한, Spring Boot는 //처럼 슬래시(/)가 중첩되어 있는 경우에 이를 합쳐서 단일 슬래시(/)로 인식 해결 방법 - @Pathvariable이 아닌 @RequestParam으로 쿼리 스트링을 이용 - 파라미터를 RequestBody에 담아서 받기 2024. 3. 12.
@AllArgsConstructor 지양 이유 및 대책 @AllArgsConstructor의 문제점 - @AllArgsConstructor는 모든 필드를 파라미터로 받아 객체를 생성하기 때문에 일부 필드만 사용하는 경우에 불필요한 의존성을 발생 시킬 수 있음 - @AllArgsConstructor는 정의한 모든 필드를 가진 생성자를 생성해주는데 다음과 같이 같은 타입의 파라미터를 서로 바꿔 입력하였을 경우에도 에러가 발생하지 않는 문제가 발생함 @AllArgsConstructor public class carDto { private String carId; private int carNum; private String carUser; } // new carDto("Tom", 4123, "n1309afc2") 대책 (@Builder) - 원하는 필드를 설정할 .. 2024. 2. 26.
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.
https 통신 방법 (SSL 인증서) 순서 1. SSL 인증서 생성 2. 프로젝트에 SSL 인증서 적용 인증서 생성 1. Keystore 생성 keytool -genkey -alias [keystore 별칭] -keyalg RSA -storetype PKCS12 -keystore [keystore 파일] 2. 생성한 Keystore로부터 인증서 추출 keytool -export -alias [keystore 별칭] -keystore [keystore 파일] -rfc -file [인증서 파일] 3. java 폴더의 lib/security/cacerts에 추출했던 인증서 등록 프로젝트에 인증서 적용 application.properties에 다음 정보 입력 server.ssl.key-store=키스토어 경로 server.ssl.key-store.. 2024. 2. 14.
The import org.springframework cannot be resolved 에러 (Gradle) 문제 현상 외부에서 작업하던 Spring Boot(Gradle) 프로젝트를 IDE에서 별다른 import 없이 열었을 경우 해당 에러가 발생 해결 방법 - 수동으로 다시 import Eclipse 해당 프로젝트 폴더 우클릭 - import - Existing Gradle Project - 해당하는 Gradle 프로젝트 폴더 선택 후 완료 Intellij Import Project - 해당 프로젝트 폴더의 buiild.gradle 선택 후 완료 2024. 2. 12.