전체 글

전체 글

    [Spring] JacksonAnnotationsInside에 대해

    JacksonAnnotationsInside에 대해 @JsonDeserialize(converter = 컨버터 클래스) @JsonSerialize(converter = 컨버터 클래스) @JacksonAnnotationsInside @Retention(RetentionPolicy.RUNTIME) public @interface JacksonBoxAnnotation { } jackson 관련 어노테이션들을 하나의 어노테이션에 한데모아 선언하고 @JacksonAnnotationsInside 어노테이션을 붙여서 완성시킨다. 그렇게 만들어진 어노테이션이 붙은 곳에는 해당 어노테이션 내부에 선언되어진 다른 어노테이션들에 적용받게 된다. 가령 위의 코드를 예시를 들면 dto 필드 위에 해당 어노테이션을 붙이면 ser..

    [ES] rollup 간략 정리

    ElasticSearch rollup에 대해 특정 정보를 es에 계속해서 쌓고있는 상황이라고 하자, 정보를 계속해서 인덱싱하다보면 용량이 점점 늘어나게 될것이고 이는 리소스 비용의 증가로 이어질 것이다. 이 정보들을 summary/압축하여 가볍게 보관하면서 이전의 데이터를 사용하기 위해 롤업을 사용한다. 예시로 사용할 인덱스와 도큐먼트 정보는 아래와 같다. PUT rollupexample-2022.01.01 { "mappings": { "properties": { "updateType": {"type": "keyword"}, "age": {"type": "long"}, "date": {"type": "date", "format": "epoch_millis"} } } } POST _bulk {"index"..

    [Java] AttributeConverter를 이용하여 DB에 Entity의 컬렉션 필드 저장하기

    AttributeConverter를 이용하여 DB에 Entity의 컬렉션 필드 저장하기 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class TimeTravel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Convert(converter = TravelListToJsonConverter.class) private List travels; public TimeTravel(List travels) { this.travels = travels; } @Getter @NoArgsConstructor(access = AccessLevel..

    [Redis] RedisTemplate, RedisCacheManager 설정에 대해

    RedisTemplate, RedisCacheManager 설정에 대해 레디스를 캐시서버로 이용하려고 하는 상황이다. @Configuration @RequiredArgsConstructor public class RedisConfig { // spring.data.redis yaml에 정의하고 이걸 토대로 자동으로 생성되는 RedisConnectionFactory 빈을 사용 추천 private final RedisProperties redisProperties; @Bean public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisC..

    [Docker] 계속 잊어버려서 작성하는 도커 사용 간단 정리

    계속 잊어버려서 작성하는 도커 사용 간단 정리 도커에서 사용하는 이미지의 이름 형식 [저장소 이름] / [이미지 이름] : 태그 ex) alicek106/ubuntu:14.04 컨테이너 생성 docker run -i -t ubuntu:14.04 docker run 명령어는 컨테이너를 생성하고 실행하는 역할을 한다. -i -t 옵션은 컨테이너와 상호(interactive) 입출력을 가능하게 한다. ubuntu:14.04 이미지가 로컬 도커엔진에 존재하지 않는다면 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려 받게된다. 태그 미지정 시, latest 한 것으로 내려받음. docker images 를 입력하면 도커 엔진에 존재하는 이미지의 목록을 출력한다. 컨테이너 생성 시에는 run 이 아..

    [JPA] Specification을 이용한 DataJPA 조회

    Specification을 이용한 DataJPA 조회 Specification을 이용하면 쿼리를 이용하는데 있어 여러 조건들을 손쉽게 처리할 수 있고 동적인 처리가 가능하다. Specification을 사용하지 않을 때의 코드를 먼저 살펴보겠다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; private int age; private LocalDate birth; public Member(String name, int age,..

    [Spring] @FeignClient 에 대해

    @FeignClient 에 대해 Feign은 netflix에서 개발한 REST client 다. 현재는 스프링으로 포함된 것 같다. 기존에 RestTemplate 을 사용한 API 호출을 코드양을 줄이고 굉장히 간편하게 호출할 수 있게끔 도와준다. ext { set('springCloudVersion', "2021.0.0") } implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } 다..

    [Spring] @Validated vs @Valid

    @Validated vs @Valid @Valid는 이전에도 자주썼었기에 어떤 역할을 갖고 있는지 알고있었지만, @Validated는 생소했다. 특히 object가 아닌 파라미터에 대한 valid 작업이 인상깊었는데 이 글을 통해 정리해보도록 하겠다. @PostMapping("/check") public String check(@RequestBody @Valid CheckRequest request) { return "ok"; } --- @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class CheckRequest { @Positive private int num; } @Valid는 javax.validation.constraint..