Spring Cloud Stream으로 RabbitMQ 샘플 구축하기
2023. 4. 1. 19:57
Spring
🧨 RabbitMQ란 AMQP를 따르는 오픈 소스 메시지 브로커이다. 요청에 대한 처리 시간이 길 때, 해당 요청을 Queue에 위임하고 빠르게 응답할 때 사용한다. 또한, MQ를 사용하여 애플리케이션 간 결합도를 낮출 수 있다. 🧨 AMQP란 Advaced Message Queing Protocol의 약자로써, MQ의 표준 프로토콜이다. 이를 기반으로 나온 제품 중 하나가 RabbitMQ이다. 등장 배경 이전에는 각 플랫폼에 종속적인 제품들이었기 때문에 이기종 간 메시지 교환을 위해서 포맷 컨버전을 해야 했기 때문에 메시지 브릿지를 이용하거나(속도 저하 발생) 시스템 자체를 통일 시켜야 하는 불편함과 비효율성이 있었다.이러한 단점을 보완하기 위해 나온 표준 프로토컬이 AMQP이다. 즉, AMQP가 나온..
SpringBoot Request 받는 여러가지 방법
2022. 12. 4. 22:08
Spring
해당 내용은 POST 방식만을 고려한 내용이다. Multipart/form-data의 HTTP 간단한 구조 알기 이미지를 업로드를 할 때 이미지만 업로드하는 것이 아닌 부가적인 정보들도 같이 업로드 해야하는 경우가 많다. 헤더는 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW와 같이 요청을 하고, boundary로 각각의 정보를 구분하여 전송하게 된다. HTTP Reqeust POST /urls/url/test Host: localhost:8080 Cache-Control: no-cache Postman-Token: f15dcf2b-ffdf-6e53-3411-a7bf27226668 Content-Type: ..
@JsonFromat, @DateTimeForamt이 계속 헷갈린다!
2022. 11. 19. 19:15
Spring
@JsonFormat, @DateTimeFormat Request일 경우 @ModelAttribte, @RequestParam 두 애노테이션은 요청 query string(message body form Data 동일)에 대한 값을 매핑해준다. @DateTImeFormat을 사용한다. @JsonFormat은 사용할 수 없다. @RequestBody 이번에는 message body JSON 요청이 올 경우이다. @DateTimeFormat을 사용한다. @JsonFormat도 사용한다. 우선 순위 @JsonFormat이 우선 순위를 갖는다. @JsonFormat이 틀렸다면, @DateTimeFormat이 맞아도 실패한다. @JsonFormat이 우선 순위이기 때문에 당연한다. @JsonFormat, @Dat..
Redis 동시성 이슈 개선하기
2022. 5. 14. 13:32
Spring
Redis에서 조회수 증가 동시성 이슈 조회수를 Redis에 캐싱하고 나중에 RDB로 write back해야하는 일이 있었다. Redis에서 해야하는 일은 게시물이 조회되면 → 해당 게시물의 id를 key로하여 조회수를 저장하는 일이다. 이슈 사항 먼저 조회수에 대한 상세 로직은 아래와 같다. Transaction1(T1)이 게시글 1번의 조회수를 조회한다. T1은 조회수를 1 증가한다. 조회수는 최종적으로 1증가 되어 Redis에 저장된다. 하지만 T2가 동시에 요청을 하면? 아래와 그림과 같은 이슈가 발생한다. T1과 T2가 조회수를 조회한 후 T1이 변경하고 T2가 변경했을 때 각자 조회한 조회수가 동일했기 때문에 동기화가 안되는 현상이다. 즉, 최종적으로는 조회수가 12가 되어야 하는 것이다. 이..
스프링 부트 Logger 사용법 및 팁
2022. 5. 11. 18:13
Spring
스프링 부트에서 로깅 사용법 스프링 부트는 spring- boot-starter-logging을 기본적으로 제공함 import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Configuration public class RedisScheduler { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private void log(String name) { logger.trace("trace log={}", name); logger.debug("debug log={}", name); logger.info(" info log={}", name); logger.warn(" warn lo..
스프링 순환 참조와 생성자 주입을 사용해야 하는 이유
2022. 4. 20. 16:59
Spring
스프링에는 3가지 빈 주입을 제공한다. 필드 주입, 수정자 주입, 생성자 주입이다. 대부분 스프링을 한다면, 알고 있는 내용일 것이다. 하지만 조금 더 알아 보자. 생성자 주입을 사용해야 하는 이유 필드 주입 장점 사용하기 가장 편하다. 단점 순환 참조를 컴파일 타임에 알 수 없다.(스프링 부트 2.5이하) 런타임에 로직 호출 시에 알 수 있다. 컴파일 시점에는 각자 주입만할 뿐 누가 자신을 사용하고 있는지는 알지 못하기 때문이다. 하지만 2.6이상 부터는 이를 개선하여 컴파일 타임에 알 수 있다. 객체를 바꿀 수 없다. 즉, 테스트 할 때 불편하다. 수정자 주입 장점 객체를 바꿀 수 있다. 즉, 테스트 할 때 편하다. 단점 순환 참조를 컴파일 타임에 알 수 없다.(스프링 부트 2.5이하) 런타임에 로직..
JPA Auditing으로 생성시간, 수정시간 자동화하기
2022. 4. 19. 12:18
Spring
BaseTimeEntity.java @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseTimeEntity { @CreatedDate private LocalDateTime createDate; @LastModifiedDate private LocalDateTime modifiedDate; public LocalDateTime getCreateDate() { return createDate; } public LocalDateTime getModifiedDate() { return modifiedDate; } } @MappedSuperclass → JPA Entity 클래스들이 BaseTimeEntity를 상속할..
스프링에서 Enum과 Bean Validation으로 예외 관리하기
2022. 4. 18. 23:41
Spring
서론 개인 프로젝트를 진행하던 중 예외 코드가 하드 코딩으로 관리되고 있어서 방법을 찾아보던 중 세 가지 후보를 고민했다. 설정 파일 DB enum 비지니스 커스텀 예외는 Enum 실무에서는 설정 파일과 DB를 사용했었다. 이미 그렇게 되어있어 고민없이 사용하게 되었다. 이 때 느낀 것은 아래와 같았다. 비지니스 커스텀 예외란 직접 개발자가 throw new 하는 것으로 정의했다. 설정 파일 코드를 직접 문자열로 매핑을 해야한다. 생산성 저하 객체에 매핑하여 사용할 수 있지만 설정 파일을 읽어오기 위한 빈 주입이 필요하기 때문에 번거로울 수 있다. DB 네트워킹이 필요하다. 하지만 처음 메인화면 오픈 시 캐싱해두면 되기 때문에 문제는 아니다. 재적용이 아주 쉽다. 배포가 필요가 없다. 최고의 장점이다. ..