no image
[JPA] Querydsl LocalDateTime 에서 Date 로 변환할 때 오류나는 경우 (feat. Oracle)
@Entity @Table(name = "SOME_ENTITY") public class SomeEntity { @Id @Column(name = "id") private Long id; @Column(name = "created_at") private LocalDateTime createdAt; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class SomeDto { private LocalDateTime createdAt; } 위와 같은 Entity와 결과를 받아올 클래스가 있다고 가정하자. 여기서 Querydsl 의 Projections를 이용하여 createdAt 이라는 값을 select 한다고 해보자. 그러면 아래와 같이 작..
2024.03.06
no image
[JPA] QueryDSL 에서 enumPath 사용하기
회사에서 SQL 쿼리를 작성하다 보니 CASE WHEN을 사용해야 하는 경우가 있었는데(안티패턴으로 취급되기도 하지만) QueryDSL에서 CASE WHEN 과 함께 enum 으로 받고 싶어서 사용해보다가 뭔가 이상한 구석이 있어서 한번 기록으로 적어보았다. QueryDSL에서 CASE WHEN 사용법의 경우 이곳에 잘 정리되어 있다. 사용법 우선 EnumPath 를 사용할 경우 예시로 아래와 같이 사용할 수 있다. @RequiredArgsConstructor public class PartnerSubAccountRepositorySupportImpl implements PartnerSubAccountRepositorySupport { private final JPAQueryFactory queryFac..
2023.11.30
no image
[Spring] RestTemplate 과 MessageConverter 순서의 관계
회사에서 내가 만들어둔 라이브러리를 다른 팀에서 사용하고 있는 경우가 있었는데, 어느 날 갑자기 다른 팀에서 아래와 같은 메세지가 나타난다고 확인 요청이 왔다. java.lang.IllegalStateException: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: "{"errors":["failed to parse JSON input: invalid character '\u003c' looking for beginning of value"]}" 이게 갑자기 나타날리가 없어서 어떤 작업을 한 후에 나타났냐고 물으니, build.gradle 에 아래와 같은 의존성을 추가하면 위와 같은 에러가 나타난다고..
2023.02.05
no image
[Spring] ConversionService 활용해보기
배경 회사에서 100개가 넘는 컬럼들을 다루어야 하는 경우가 있었다. 100개가 넘는 컬럼들 중 섹션별로 일부의 데이터를 추가하거나 수정할 수 있어야 했고, 기존의 데이터와 서로 다른지 판단할 수 있어야 하며 이를 로그로도 남겨야 하는 요구사항이 있었다. 예를 들면 Entity 가 아래와 같은데, @ExampleSection 이라는 Annotation 으로 섹션을 분리한 뒤 사용자가 원하는 Section 별로 데이터를 저장하거나 수정할 수 있어야 하는 것이다. @Entity(name = "exampleEntity") @Table(name = "EXAMPLE_ENTITY", schema = "GREATSCHEMA") @DynamicInsert @DynamicUpdate @Builder @Getter @No..
2022.11.21
no image
[Spring] AutoConfiguration 직접 만들어서 라이브러리로 만들어보기
Spring 에서는 상당히 많은 AutoConfiguration 을 제공해주고 있는데, 따로 라이브러리를 만들면서 직접 만들 수도 있다. 테스트로 하나 만들어보자 구성 우선 구조는 아래처럼 잡고 멀티모듈로 구성했다. autoconfigure - Spring Boot 에서 자동으로 AutoConfiguration 이 적용되는 로직 관련 somelogic - 비즈니스 로직 // root - build.gradle buildscript { ext { projectVersion = '1.0.0' projectGroup = 'kr.pe.karsei' springBootVersion = '2.7.5' springDependencyVersion = '1.0.15.RELEASE' } repositories { mave..
2022.11.11
[JPA] QueryDSL 에서 오늘 날짜 활용해서 사용하기 (feat. Oracle)
아래와 같은 클래스가 있다. @Entity @Builder @Getter @NoArgsConstructor @AllArgsConstructor public class PremiumPrice { @Id private Long id; @Column private BigDecimal usdPrice; @Column @CreationTimestamp private LocalDateTime registDate; } 만약, 데이터를 찾을 때 registDate 를 기준으로 오늘 이후의 데이터를 찾고 싶으면 어떻게 할까? 여러 가지 방법이 있겠지만 이 글에서는 두 가지 방법을 소개한다. Expressions.dateTemplate Expressions.dateTemplate(LocalDateTime.class, "s..
2022.10.24
no image
[JPA] QueryDSL 에서 문자열을 숫자로 뽑아서 변환하기
Entity 안에서 String 으로 관리되고 있는 값을 다른 DTO 클래스에서 받을 때 BigDecimal 과 같은 데이터 타입으로 받고 싶다면 어떻게 할까? 물론, Entity 안에 있는 필드 데이터 타입과 똑같이 관리되면 좋겠지만 뭔가 크롤러 같은 프로그램에서 어딘가의 가격 데이터를 가져올 때 아래와 같은 데이터들이 포함된다고 해보자. '판매중이지 않음' '1200000' '없음' 만약, 위 데이터 중에서 숫자만 이루어진 것을 뽑아내려면 어떻게 해야 할까? 충분히 있을 수 있는 상황이다. 우선 아래와 같은 클래스가 있다고 하고, renewalPrice 라는 필드 값에 위와 같은 데이터들이 포함된다고 생각해보자 @Builder @Getter @NoArgsConstructor @AllArgsConstr..
2022.10.24
[JPA] Oracle 을 사용해서 Native Query 로 출력 개수까지 다 가져와보기
예를 들어, 아래와 같은 복잡한 질의가 있다. SELECT so.seqno , ... , CASE WHEN SYSDATE BETWEEN MIN(ev.startdate) AND MIN(ev.enddate) THEN 'Y' ELSE 'N' END AS event_flag , TO_CHAR(MIN(so.display_start), 'yyyy-mm-dd hh24:mi') AS display_start , TO_CHAR(MAX(so.display_end), 'yyyy-mm-dd hh24:mi') AS display_end , TO_CHAR(MIN(ev.startdate), 'yyyy-mm-dd hh24:mi') AS event_start_date , TO_CHAR(MAX(ev.enddate), 'yyyy-mm-d..
2022.10.17
no image
[Spring] 라이브러리 등록 시 라이브러리를 외부에서 소스를 볼 수 있도록 하기
예를 들어, Intellij 에서 직접 External Libraries 또는 어떤 객체의 사용 위치를 참조하여 파일을 살펴볼 때 아래와 비슷하게 메세지가 나타나는 경우가 있다. Decompiled .class file, bytecode version: 57.0 (Java 13) 보통 개발을 하면서 문제가 생겼을 때 디버깅을 찍어보면서 Spring 과 같은 다른 라이브러리의 내부 코드를 들여다보던지 아니면 평소대로 라이브러리에서 지원하는 메서드를 사용하려고 할 때 주석이라던지를 참조를 하게 되는데 자기가 직접 스스로 라이브러리를 만들면서 Maven 또는 직접 운영하는 Nexus 에 라이브러리를 등록하여 사용을 할 때 만약 아무런 빌드 옵션을 주지 않고 등록을 하게 되면 위와 같이 바이트 코드만 볼 수 있..
2022.10.13