Redis Stream의 구조적 특징(Message Queue)
·
미분류글
1. Redis Stream 개요소개Redis 5.0에서 주요한 기능으로 등장했다. ( 18년 10월)Message Queue (MQ)로 사용할 수 있는 스택 중 하나이다.   Redis Stream MQ는 이런 특징을 가진다. (Rabbit MQ, Active MQ도 마찬가지)- 중복 없이 동시처리 가능- 재처리 가능 이 특징들은 Redis Stream 구조에서 기인한다.1. 중복 없이 동시처리 가능한 이유는 consumer group이 single stream을 두고 메시지를 각 consumer가 하나씩 빼와서 처리하기 때문이다.2. 재처리가 가능한 이유는 메시지마다 id를 두고 관리하며, ACK 명령을 통해 메시지 처리완료를 지원하고, 만약 ACK를 받지 못한 메시지는 PENDING 처리하기 때문이..
[Java] ObjectMapper에 TypeReference를 사용할 때
·
JAVA
TypeReferenceJackson 라이브러리를 사용하여 JSON을 역직렬화할 때, 제네릭 타입 정보를 보존하기 위해 사용한다.  ∨ ObjectMapper.readValue() 에서 안전한 매핑 가능ObjectMapper.readValue(arg, type) 의 두번째 인자에 타입정보를 표기할 수 있다.변환대상인 arg를 어떤 타입으로 매핑할 것인가의 정보를 주는 것이다. 만약 json을 어디선가 받아와서 변환하고 싶다면, type에는 Class 타입 또는 TypeReference가 온다.특히 TypeReference를 ObjectMapper에 사용하면 경고(ClassCastException 발생 가능 경고)가 나지 않게 할 수 있다.mapper.readValue(json, ArrayList.clas..
[Java] Generic Type erasure / 제네릭 타입 소거
·
JAVA
Generic Type erasure자바에서 Generic Type erasure 프로세스는 말 그대로 제네릭 타입을 지워버리는 프로세스다. 자바에서 제네릭은 런타임에 소거된다. 제네릭은 타입 검사 이점이 있으므르 컴파일때 타입 검사를 보장한다. 그러나 런타임에는 타입 정보를 삭제한다.  런타임에 타입을 삭제한다?모든 타입을 Object 타입으로 바꾼다.또는 명시된 바운드로 바꾼다. 즉 컴파일 / 런타임 때 아래와 같이 다르다.// 컴파일시 타입 체크public class Test { public void test(T test) { ... }}// 타입 소거가 된 런타임public class Test { public void test(Object test) { ...
[IntelliJ] 폐쇄망 개발환경 세팅
·
미분류글
■ Intro일반적인 네트워크에서 springboot 프로젝트를 세팅할때는intellij가 필요한 gradle을 자동으로 설치해서 문제가 없었다. 그러나 사내망에서는 gradle 설치 100% 시점에서 차단이 되는 것을 확인할 수 있다.gradle 설치파일을 어떻게 가져와서 잘 잡아도 아래 두 문제가 발생 가능하다.- build.gradle에서 distributionUrl에 접근하지 못하는 문제가 있어서 조금 변경해줘야 함- root 인증서를 jdk keystore에 등록해주어야 함 그래서 해결 방법을 기록해둔다. ■  요약- 필요한 버전의 gradle 수동설치를 해야 한다. 초기세팅할 시점에 Settings에서 gradle을 확인했을 때 Use Gradle From이 gradle-wrapper.prop..
상시 업데이트함 -- Effective java 스터디
·
JAVA/Effective Java
(24.07.00) ItemXX: ~~~ ~~  (24.07.00) Item77: 예외를 무시하지 말라~~   (24.07.00) Item76: 가능한 한 실패 원자적으로 만들라~~   (24.07.00) Item75: 예외의 상세 메시지에 실패 관련 정보를 담으라~~    (24.07.00) Item74: 메서드가 던지는 모든 예외를 문서화하라~~   (24.07.22) Item73: 추상화 수준에 맞는 예외를 던지라 ## 예외 번역이란너무 저수준 예외를 계속 전파하면, 내부 구현 방식도 드러나고 혼란스러워진다. 그래서 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다.try { ...} catch (LowerLevelException e) { // 추상..
[Web][Docker] 동일 ip, 서로 다른 도메인 80포트에 대한 포트포워딩 설정
·
미분류글
접속 도메인에 따라 포트포워딩 우리 파이서버에는 두개의 웹 애플리케이션이 돌아가고 있다. 둘 다 브라우저를 통해 80포트로 접속하게 되어있었기 때문에, 접속 도메인에 따라 포트포워딩(혹은 다른 컨테이너로 매핑)을 해줄 필요가 있었다. 다음 예제처럼 Nginx 세팅을 함으로써 가능하다. server_name에 도메인 지정해서 분류가 되는 구조이다. 단! 중요한 것은 Nginx 컨테이너와 AAAAA, BBBBB 컨테이너가 동일한 도커 네트워크로 존재해야 한다는 것이다. 만약 서로 다른 네트워크에 있어서 Nginx에서 AAAAA 컨테이너를 찾지 못한다면 Host not found in upstream 오류가 뜬다. Nginx가 다른 컨테이너를 스캔할 수 있는 구조인지 미리 검토해보도록 하자.# AAAAA 컨테..
java.rmi.server.ExportException: Listen failed on port: 0;
·
미분류글
스프링부트 프로젝트 실행이 아래와 같은 이유로 되지 않았다. 처음 보는 오류![1]오류: 에이전트에 예외사항이 발생했습니다. : java.rmi.server.ExportException: Listen failed on port: 0; nested exception is: java.net.SocketException: Bad address: listen jdk.internal.agent.AgentConfigurationError: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is: java.net.SocketException: Bad address: listen at jdk.management.agent/sun.ma..
하나의 서버 인스턴스에 운영 및 테스트서버 두기
·
미분류글
운영서버와 테스트 서버는 독립된 서버에 각각 두는 것이 기본적으로 권장사항이라고 한다.그렇지만 인스턴스를 단 하나만 가지고 있는 상황에서 테스트 서버가 필요했다. 🪄한 인스턴스에 운영서버와 테스트서버 두는 구조하나의 인스턴스에 운영서버, 테스트서버를 구축하려면 어떻게 해야 할까?나는 운영서버와 테스트경로의 접속 path로 구분하는 방법을 적용했다.아래와 같은 구조다. 프론트 서버에 대해 할 이야기가 있다.테스트 서버를 구축하던 중, 리액트 서버를 nginx 안에 뒀을 때 장점을 배우게 되어서 테스트서버는 nginx 안에서 빌드하여 사용하기로 했다. 이제 운영서버도 그렇게 하는 것이 낫겠다. 결국 이렇게 테스트서버, 운영서버를 분리해서 띄워놓았다.이렇게 동일서버에 뒀을 때 단점은, 호스트에 트래픽이 몰릴..
MSA에서 분산트랜잭션
·
Database
https://tech.kakaopay.com/post/msa-transaction/ MSA 환경에서 네트워크 예외를 잘 다루는 방법 | 카카오페이 기술 블로그결제시스템(페이상품권)에서 분산 트랜잭션을 보장하고 안전하게 다루기 위해 고민한 내용을 공유합니다.tech.kakaopay.com 위 kakaopay 페이지를 참고하여 정리하였다. ✨ MSA의 트랜잭션하나의 시스템은 수십여개의 MSA로 구성될 수 있다. MSA 환경에서 중요한 것은 연결된 서비스마다 DB를 관리하고 있을 때 일관성을 보장해야 한다는 것이다. 예를 들어 포인트, 상품권 등 여러 서버가 엮인 결제 트랜잭션이 그렇다.결제 트랜잭션에서의 예외는 이런 것들이 있다.[고객 입장] 두 번 결제됨 / 결제취소 안됨 / 결제 성공했는데 잔액 안빠져..
[상속관계 매핑] 싱글 테이블 전략을 선택한 이유
·
Database
지도에 마킹이 가능한 두개의 엔티티, CultureEvent와 CulturePlace는 Mark 엔티티를 상속하고 있다.이러한 상속관계에서 선택하기 적절한 상속관계매핑전략은 조인 전략, 싱글테이블 전략 두가지가 있는데 이번에 나는 싱글테이블 전략을 선택하기로 했다. 먼저 총 3개의 상속관계 매핑 전략을 읊고 가자.🪄상속관계 매핑 전략조인 전략: 자식테이블이 부모테이블의 PK를 참조한다. 즉 자식테이블의 PK는 FK다.부모테이블은 DTYPE (구분 컬럼)을 가진다. 어떤 자식테이블을 조회해야할지 알아야 하기 때문.장점: 가장 정규화된 방법이다. 외래키 참조 무결성 제약조건도 활용 가능하고, 저장공간도 효율적으로 사용 가능하다.단점: 조회시 Join이 잦아 성능저하를 검토해야 한다. Join을 하기에 조회..