본문 바로가기
반응형

Develop/Spring+JPA59

[SpringDoc] 쿼리 파라미터가 이상하다? SpringFox에서 SpringDoc으로 마이그레이션하던 와중, 몇가지 이슈가 발생했다. (참고글: [SpringDoc] SpringFox -> SpringDoc 마이그레이션 일지) 그 중에서도 쿼리 파라미터와 관련된 이슈들을 해당 글에서 정리해보고자 한다. ❓ Swagger에서 @ModelAttribute request를 json 형태로 받는 현상 스프링에서 @ModelAttribute를 이용하면 쿼리 파라미터 목록을 DTO로 받을 수 있다. 이때 SpringFox에서는 아래와 같이 필드 하나하나를 따로 입력받을 수 있었다. 하지만 SpringDoc에서는 아래와 같이 json 형태로 입력하도록 변경되었다. 쿼리 파라미터를 따로 입력하고 싶다는 요구사항이 들어와서 방법을 고민하게 되었다. 💡 해결방법.. 2024. 2. 18.
[SpringDoc] 우리 enum이 달라졌어요 SpringFox에서 SpringDoc으로 마이그레이션 하던 와중, 몇 가지 이슈가 발생했다. (참고글: [SpringDoc] SpringFox -> SpringDoc 마이그레이션 일지) 그중에서도 enum과 관련된 이슈가 많았는데, 어떤 이슈가 발생했고 어떻게 해결했는지 그 방법에 대해 공유하고자 한다. 이모티콘 설명 - ❓ 이슈 - ✅ 선택한 방법 - ⬜️ 선택되지 않은 방법 ❓ name()이 아닌 toString() 값이 노출되는 현상 SpringFox에서 SpringDoc으로 전환하자, enum 타입의 필드들이 이상한 형태로 조회되었다. 예를 들어, 아래와 같이 Color라는 enum이 있다고 가정해 보자. @ToString public enum Color { ORANGE("red", "yello.. 2024. 1. 28.
[SpringDoc] SpringFox -> SpringDoc 마이그레이션 일지 목차 0. 서론 1. Swagger vs SpringFox vs SpringDoc 2. 왜 SpringFox보다 SpringDoc일까? 3. SpringDoc으로 마이그레이션하기 4. 트러블슈팅 0. 서론 최근 팀 코드에 SpringFox를 SpringDoc으로 전환하는 작업을 진행하고 배포까지 무사히 마쳤다. 해당 글에서는 SpringDoc이란 무엇이고, 왜 SpringDoc 마이그레이션 하게 되었는지, 어떻게 마이그레이션 했고 그 과정 중 어떤 이슈가 있었는지 내용을 정리하려 한다. 1. Swagger vs SpringFox vs SpringDoc 🟢 Swagger API 설계, 테스트, 문서화 등을 편리하게 이용할 수 있게 돕는 프레임워크 Swagger UI: OenAPI를 기반으로 시각적 문서.. 2024. 1. 14.
@Async와 함께 사라지다 (feat. TaskDecorator) 목차 1. 스레드가 가진 데이터, ThreadLocal 2. 데이터가 사라졌어요 (예제코드) 3. 비동기와 사라진 데이터 3. ThreadLocal 유지하기 1. 스레드가 가진 데이터, ThreadLocal ThreadLocal는 각 스레드마다 별도의 내부 저장소를 지원해준다. 일반적으로 지역 변수는 해당 변수를 선언한 코드 블록 내에서만 사용 가능하지만, ThreadLocal를 이용해 저장한 데이터는 데이터를 저장한 스레드 내에서라면 어디서든 사용 가능하다. 예를 들어 아래와 같이 ThreadLocal에 자주 사용되는 사용자 정보 등을 저장할 수도 있다. 사용자 정보를 저장하고 싶을때는 UserSessionContext.set(), 꺼내오고 싶다면 UserSessionContext.currentSe.. 2023. 10. 29.
[Spring Batch] JobExecutionAlreadyRunningException 에러 🤯 에러 발생 Spring Batch에서 job을 실행하다가 아래와 같은 에러와 마주쳤다. java.lang.IllegalStateException: Failed to execute ApplicationRunner ... Caused by: org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running: JobExecution: id=4223, version=1, startTime=2023-08-21 19:14:19.0, endTime=2023-08-22 15:38:48.0, lastUpdated=2023-08-21 19:14:19.0, st.. 2023. 10. 16.
[JPA] @Where 무시하기 DB에서 데이터 삭제를 하기 위해서는 크게 hard delete와 soft delete가 존재한다. hard delete: SQL의 DELETE문을 이용해 직접 데이터를 삭제하는 방법. soft delete: SQL의 UPDATE문을 이용해 삭제 여부를 저장하는 컬럼을 변경하는 방법. 표준으로 정해진 것은 아니지만 soft delete는 일반적으로 deleted라는 컬럼에 true/false를 알 수 있는 값을 저장한다. soft delete의 단점은 조회할 때마다 조회 조건을 추가하는게 매우 귀찮다. (일반적으로 조회는 삭제되지 않은 데이터들을 조회해야하니 where deleted = 0 같은 조건을 넣어야 한다.) 헌데 JPA에서는 정말 편리하게도 @Where라는 어노테이션을 제공해준다. @Where.. 2023. 9. 11.
[Spring Batch] 개념부터 코드까지 목차 1. Spring Batch란? 2. Spring Batch 구조 3. 기본적인 세팅 4. Job, Step 5. ItemReader, ItemProcessor, ItemWriter 1. Spring Batch란? 배치란 언제, 왜 쓰는걸까? 비즈니스 로직을 작성하다 보면 대량 처리(bulk processing)가 필요한 경우가 많다. 이런 대량 처리가 반복적으로 일어나야 하는 경우, 배치 애플리케이션을 생성 및 실행하여 처리할 수 있다. 그 중에서도 Spring Batch는 엔터프라이즈 시스템에서 일상적인 운영에 필요한 배치 애플리케이션을 개발할 수 있도록 설계된 배치 프레임워크이다. 여기서 주의할 점은 배치는 대량의 데이터를 일괄적으로 처리할 뿐, 특정 주기마다 자동으로 돌아가는 스케줄링과는 .. 2023. 7. 21.
[Spring] 스프링 캐시 간단하게 사용해보기 목차 1. 스프링의 캐싱 방법 2. 사전 준비 3. 예제 코드 1. 스프링의 캐싱 방법 캐싱 자주 사용하는 데이터를 어딘가 임시로 저장하고, 빠르게 꺼내 쓰기 위해 사용할 수 있게 하는 프로세스 서버의 부담을 줄여 성능을 높이기 위해 사용하기도 함 ex: DB에서 조회하는게 굉장히 오래 걸리는 데이터를 캐싱해두면, 다음에 조회할 때 DB의 조회 결과를 기다리지 않고 캐싱 영역에서 빠르게 가져다 쓸 수 있음 스프링의 캐싱 @Cacheable, @CacheEvict 같은 어노테이션을 통해 AOP 기반으로 동작 이를 위해서는 @EnableCaching 설정이 필수 2. 사전 준비 이 글에서는 Redis를 이용해 예제 코드를 작성하기 때문에 사전 준비가 필요하다. 별도의 Redis를 사용하지 않는 경우에는 생략.. 2023. 5. 31.
[Spring] '/', 문자열인가 경로인가 그것이 문제로다 🤔 문제의 시작 API를 호출하면 json이 아닌 html 코드로 응답이 오고 있다는 이슈를 제보받았습니다. 해당 html 코드를 열어보니 아래와 같이 HTTP 상태 코드 400을 보여주고 있었습니다. 상태 코드 400은 Bad Request라는 의미로, 클라이언트의 요청이 잘못되어 서버가 요청을 처리할 수 없거나 처리하지 않을 것임을 나타내는 코드입니다. 🧐 원인 분석 문제가 발생하는 정확한 케이스를 파악하기 위해 현상 재현을 시도하였습니다. API를 호출해봤더니 애플리케이션에 요청이 들어오지도 않는 것처럼 보였습니다. 400이라는 응답값만 생각해보면 어디선가 예외가 발생했을 것 같은데, 예외가 발생했다는 에러 로그가 남지 않았거든요. 어떤 API인지 설명하기 위해 가상의 예제 API를 만들어보았습니.. 2023. 5. 12.
반응형