Framework
-
[Spring] Java 8 LocalDateTime 직렬화/역직렬화 오류 해결Framework/Spring 2023. 5. 30. 23:30
상황 스프링 부트를 사용하다가 ObjectMapper objectMapper = new ObjectMapper(); 방식으로 사용하려고 하였는데 다음과 같은 에러가 발생하였다. Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling 메세지를 파악하고 구글링 해보니 jackson-datatype-jsr310 모듈을 사용하면 된다는 거 같은데 스프링 부트를 기본적으로 사용하는 경우 ObjectMapper가 자동 빈 주입되는 것으로 아는데 굳이 이걸 해줘야 하나? 라는 생각이 들었..
-
[Spring] Querydsl select null 처리Framework/Spring 2023. 3. 17. 21:00
스프링에서 querydsl(5.0.0 기준)을 사용하다보면 테이블에 있는 값이 아닌 테이블의 특정 값으로 projection해야 될 때가 있다. select절만 예시로 보면 select(new QDto(user, info)).from(user).leftJoin(info)... 이렇게 되어 있다고 할 때 공통의 querydsl을 사용해야 할 때 info 부분만 null로 사용할 때 다음과 같은 에러를 볼 수 있다. 아래의 예시처럼 한 개의 쿼리로 동일한 dto로 사용할 때이다. 1. select(new QDto(user, info)).from(user).leftJoin(info)... 2. select(new QDto(user, null)).from(user).leftJoin(info)... 리턴값에 nu..
-
[Spring] Test 코드에서 @Slf4j 사용하기Framework/Spring 2022. 5. 3. 21:57
스프링으로 서버를 작성하다가 테스트 코드 작성할 때 로그를 출력해야할 때가 있다. 일반적으로 스프링 부트로 개발을 할 때 lombok 라이브러리는 거의 필수이므로, @Slf4j를 쉽게 어노테이션 형식으로 사용하곤 한다. (@Slf4j는 Simple Logging Facade for Java의 줄임말로 로깅을 위해서 사용된다고 보면 된다.) 사용법은 간단하다. 일반 클래스에서는 다음과 같이 사용한다. @Slf4j @RequiredArgsConstructor @RequestMapping("/v1/api/members") @RestController public class MemberController { @PostMapping public String createMember(@RequestBody @Vali..
-
[Spring] Domain time mappingFramework/Spring 2022. 4. 25. 23:16
도메인 작업을 할 때 어떤 데이터든지 시간 데이터는 필수 값이다. 스프링에서 도메인 엔티티를 생성할 때 db 컨벤션에 따라 createdAt, updatedAt을 자주 사용하곤 하는데 이 때 다음과 같은 어노테이션을 자주 사용하곤 한다. @CreationTimestamp, @UpdateTimestamp 우선, @CreationTimestamp는 insert와 같은 DML(Data Manipulation Language)이 이루어질 때 자동적으로 현재시간을 입력해주는 어노테이션이다. 그리고 @UpdateTimestamp는 DML중 update 쿼리가 발생할 때, 자동적으로 현재시간을 입력해주는 어노테이션이다. 예시코드는 다음과 같다. @CreationTimestamp @Column(name = "creat..
-
[Spring] request에서 enum으로 값 전달받기Framework/Spring 2022. 3. 15. 23:27
모든 소스 코드는 github를 통해서 확인하실 수 있습니다. Controller에서 request 값을 받을 때 보통 String값을 많이 쓴다. 그렇다면 String이 아닌 enum 값이 포함된 값은 어떻게 받을까? @Slf4j @RestController public class ProductController { @PostMapping("/") public String createProduct(@RequestBody CreateProductDto dto) { log.info("ProductStatus = {}", dto.getProductStatus()); log.info("ProductName = {}", dto.getProductName()); log.info("Count = {}", dto.g..
-
[Spring] Querydsl 동적 쿼리Framework/Spring 2022. 3. 4. 22:22
이번에는 Querydsl로 동적 쿼리를 작성하여 다양한 상황에 대응하는 법에 대해서 알아보고자 한다. jpa나 querydsl을 사용하기 전에는 si업계를 주름잡고 있는 mybatis를 사용했었다. mybatis에서도 동적쿼리를 작성할 수는 있지만 읽기가 굉장히 복잡했었다. 그렇기에 querydsl을 통해서 동적쿼리를 익혀서 어려운 쿼리에 대응해보도록 하자. 우선 동적쿼리를 작성하는 방법은 2가지이다. BooleanBuilder사용 BooleanExpression을 통한 메소드 사용 우선 1번부터 알아보도록 하자. QMember member = new QMember(); void dynamicQuery_BooleanBuilder() { String username = "member1"; Integer a..
-
[Spring] QueryDsl projection(2)Framework/Spring 2022. 3. 2. 21:53
2022.03.01 - [Framework/Spring] - [Spring] QueryDsl projection [Spring] QueryDsl projection 이번 시간에는 QueryDsl을 사용하여 projection하는 방법을 알아보도록 한다. 실무에서 보통 전체 필드에 대한 조회보다는 특정한 필드만 select 하고 싶을 때가 많다. 그럴 때 JPA보다는 QueryDsl을 쓰는 developia.tistory.com 지난번에 QueryDsl projection을 해보았는 데 이번에는 Q 파일을 생성하여 projection하는 방법에 대해서 알아보도록 한다. 바로 코드로 알아보자. List result = queryFactory .select(new QMemberDto(member.usernam..
-
[Spring] QueryDsl projectionFramework/Spring 2022. 3. 1. 21:18
이번 시간에는 QueryDsl을 사용하여 projection하는 방법을 알아보도록 한다. 실무에서 보통 전체 필드에 대한 조회보다는 특정한 필드만 select 하고 싶을 때가 많다. 그럴 때 JPA보다는 QueryDsl을 쓰는게 좋은 그 예시를 보도록 하자. EntityManager em; List result = em.createQuery("select new study.developia.querydsl.dto.MemberDto(m.username, m.age)" + " from Member m", MemberDto.class).getResultList(); 우선 순수 JPA로 작성하였을 때는 다음과 같다. 쿼리 부분을 보면 select절에 dto 패키지명을 전부 다 적어야하는 것을 알 수 있다. 물론..