안녕하세요. 백엔드 개발자 황보규민입니다.
운영 환경에서 마주친 병목, 장애 가능성, 데이터 정합성 문제를 정리해두는 개인 기록입니다. 나중에 다시 빠르게 찾아보고, 비슷한 문제를 겪는 사람에게 공유하기 위해 남깁니다.
단순한 사용법보다는 왜 문제가 생겼고, 어떤 기준으로 해결책을 골랐는지를 남기려고 합니다.
[ {"date":"2026-05-12","title":"Kafka KIP-848 는 왜 등장했는가","url":"/portfolios/docs/Java/51/","summary":"서론 Sharding 관련 리밸런싱 알고리즘을 설계하다보니 자연스럽게 Kafka 리밸런싱 레퍼런스를 찾아보게되었다."}, {"date":"2026-05-03","title":"Redis Stream Sharding","url":"/portfolios/docs/Java/50/","summary":"최근에 계속 관심있게 보고있는건 Redis 5.0 부터 추가된 stream 큐이다. (6.2) autoclaim 추가되면서 idletime 기반 claim 편의성이 증가했고 (8.2) 에서 xackdel 추가 및 ACKED 옵션으로 큐 용량관리가 빨리지고 용이해졌다. (8."}, {"date":"2026-02-11","title":"Coroutine and VirutalThread","url":"/portfolios/docs/Java-Kotlin/51/","summary":"코루틴 매우 편리하고 콜백 지옥도 크게 해소되었다. 그런데 기존 Virtual Thread 와는 어떤 성능적 차이가 있는지 궁금해져서 찾아보았다. 에서 아래와 같이 말한다."}, {"date":"2026-02-05","title":"cloudflare tunnel 로 댓글 홈서버 운영 및 자동화","url":"/portfolios/docs/Java/49/","summary":"방명록 홈서버 구축 과정 도메인 구매 및 네임서버를 cloudflare 로 두고 홈서버에 tunnel 설정 FastAPI + SQLite 방명록 서버 github action self hosted runner 홈서버로 배포 자동화 로컬에서도 테스트 가능하도록 설정 원격작업..."}, {"date":"2026-01-24","title":"Hotspot VM 의 JIT 컴파일러와 GraalVM","url":"/portfolios/docs/Java-Kotlin/50/","summary":"JIT 컴파일러 탄생배경 및 정의 자바는 bytecode 명령어로 이루어진 .class 까지 javac 로 컴파일링 한 뒤 JVM 위에서 한 줄씩 bytecode binary code 로 interpreting 한다."}, {"date":"2026-01-18","title":"최종 정리","url":"/portfolios/docs/toss/16/","summary":"이번에 토스 러너스 하이 2기 프로그램에 참여하게 되었고, 결과 발표 시점에 이전 직장에서 경영 악화로 개발 조직이 해체되는 상황을 겪었습니다."}, {"date":"2026-01-17","title":"메모리 사용률 50% 임계값 alert 및 파티셔닝 전/후 메모리 부하 분산 확인","url":"/portfolios/docs/toss/15/","summary":"SUMMARY 파티셔닝 전/후 메모리 부하 분산 확인 임계치 초과 시 slack alert 과정 maxlen 근사치면, produce 하기전에 에러 반환하도록 하였습니다."}, {"date":"2026-01-14","title":"컨슈머 재정리 로직 개선 및 cdl 개별 interval/retry 설정값 적용","url":"/portfolios/docs/toss/14/","summary":"메인로직에서 CDL 분리시키고 해당 큐에선 좀 더 retry 해본 뒤 느리게 천천히 소비되도록 설정하였습니다. 또한 /actuator/prometheus 에 값 갱신 업데이트 및 scrap 해상도를 임시로 1초로 설정해서 테스트에 용이하도록 하였습니다."}, {"date":"2026-01-12","title":"aws-secret/bus-refresh 직접구현은 매우 비효율적. CDL 로 max retry 이후 전송되는 것 관측","url":"/portfolios/docs/toss/13/","summary":"summary 1. redis pub/sub 으로 실무 busrefresh 구현의 한계점으로 인한 3가지 대안 모색 2. 큐 - CDL 데이터 넘어가는 것 관측 3."}, {"date":"2026-01-09","title":"추가적인 모니터링 지표들과 stream 크기 동적 확장을 위한 버스 리프레시 구현(redis pub/sub)","url":"/portfolios/docs/toss/12/","summary":"Stream group 별 pending 개수, lag 개수 XADD/sec, XACK/sec consume 처리지연시간(consuming 하는 시점에서 현재시간과 produced 시간대 - 한 지표 쏘기)."}, {"date":"2026-01-05","title":"실패 메세지 재처리 시 중복방지를 위한 XAUTOCLAIM lua 구현","url":"/portfolios/docs/toss/11/","summary":"Spring Boot Data Redis 3.5.6 XAUTOCLAIM 미지원으로 인한 lua 구현 2022년부터 xautoclaim 지원 요청이 있었지만 아직 지원하고 있지 않습니다."}, {"date":"2026-01-03","title":"stream key size 확인","url":"/portfolios/docs/toss/10/","summary":"stream 10MB 증가량 만큼 정상적으로 노드 메모리 집계되는 것을 확인할 수 있습니다."}, {"date":"2026-01-01","title":"Consumer 제거 필요 및 stream 별 redis node 메모리 사용량 모니터링 추가","url":"/portfolios/docs/toss/9/","summary":"현재 서버 배포 시 consumer 재기동 하며 이 떄 consumer-id 가 변하도록 설정하였습니다."}, {"date":"2025-12-31","title":"Redis Stream 모니터링 API 안에 lag 데이터까지 가져와서 확인하기","url":"/portfolios/docs/toss/8/","summary":"redis 8.2 버전에선 lag 데이터를 같이 전달해주지만, 최신의 spring data redis 에선(3.5.x or 4.0.x) lag 정보를 파싱해주지 않아서 직접 lua script 로 lag 정보를 가져온 뒤 파싱해주어야합니다. spring data redis 4."}, {"date":"2025-12-30","title":"Redis Stream 내부 메세지 모니터링 pagination","url":"/portfolios/docs/toss/7/","summary":"Cursor pagination 메세지 조회 모니터링 페이지 제작 기존에 redis stream 메세지 모니터링이 너무 불편했습니다. Intellij 로 redis cluster 접속해서 stream 확인하는데 메세지 수가 많으면 뒤에 메세지 확인하는게 너무 느렸습니다."}, {"date":"2025-12-29","title":"Arxiv 서버 헬스체크","url":"/portfolios/docs/toss/6/","summary":"Arxiv API 는 꽤 자주 다운되는 편입니다. 차후 이중화가 필요할 것 같습니다. 일단 현재는 헬스체크를 통해 서비스 상태를 모니터링하도록 설정했습니다. 여기에도 알람을 붙여야겠죠? 추가적으로 iframe 으로 해당 상태체크 페이지를 직접 랜더링 해서 모니터링 시켰습니다."}, {"date":"2025-12-29","title":"CDC table change event","url":"/portfolios/docs/Java/48/","summary":"소스 테이블의 스키마가 변경되면? CDC 수행 중 소스 테이블 스키마가 변경되면, Debezium은 변경 이후의 전체 테이블 스키마 정보를 포함한 change event를 생성합니다."}, {"date":"2025-12-26","title":"Grafana Redis Cluster 대시보드 + Stream lag 모니터링 쿼리","url":"/portfolios/docs/toss/5/","summary":"기본 샤딩된 stream 별 소비자 그룹 및 컨슈머 lag 모니터링을 추가했습니다. 그리고 link 들어가면 아래처럼 pending 된 메세지들을 확인하는 페이지로 이동하도록 설정하였습니다."}, {"date":"2025-12-24","title":"XACKDEL 미지원, Grafana 대시보드","url":"/portfolios/docs/toss/4/","summary":"spring data redis 에 아직 xAckDel 이 반영이 안되어있어서 유틸 만들어서 추가하였습니다. 그래도 결국 extension 함수로 만들어도 lettuce 에서 응답파싱할 때 XACKDEL 응답을 뭘로 파싱해야하는지 몰라서 에러가 납니다."}, {"date":"2025-12-22","title":"Redis Stream 파티셔닝 시 한계점","url":"/portfolios/docs/toss/3/","summary":"stream 을 파티셔닝할려고 했는데 생각해보니까 kafka 처럼 파티션을 컨슈머에 할당하는 리밸런싱을 직접 해줘야할 것 같습니다. 그러니까 파티셔닝된 stream 당 하나의 파드내 컨슈머에서 읽을 수 있도록 해야합니다."}, {"date":"2025-12-21","title":"Redis Cluster 내 설정값 관리 및 구축","url":"/portfolios/docs/toss/2/","summary":"쓰기 확장성을 고려한 redis cluster 구축을 위해서 docker 로 초기 설정을 진행했었습니다."}, {"date":"2025-12-18","title":"Redis 8.4 를 써야하는 이유","url":"/portfolios/docs/toss/1/","summary":"이번에 redis 단일 노드만 쓰다가 cluster 로 구축해보면서 redis 버전을 정해야했습니다. 그래서 버전별 어떤 기능이 추가되었고 변경되었는지 정리했더니 진짜 유용해서 작성합니다. Redis 8.2 에서 XACKDEL 명령이 추가되었다고 합니다."}, {"date":"2025-12-10","title":"redis stream 는 kafka 와 달리 그런거 없었다...","url":"/portfolios/docs/Java/47/","summary":"실무에서 redis stream 으로 사용자에게 알림전송 시스템을 구축하면서 kafka 와 다른점들을 많이 느꼈다. 개인적으로 느낀 4개 주요 차이점 있는데 AI 의 힘을 빌리지 않고 정리해본다."}, {"date":"2025-11-30","title":"공통 개발 라이브러리를 직접 만들어서 gradle 모듈 github package 로 쉽게 관리하기","url":"/portfolios/docs/Java/46/","summary":"교촌, 자담 등 여러 프랜차이즈 서비스를 운영하다 보면, 각 프로젝트에서 공통으로 사용하는 코드(도메인, 유틸, 설정 등) 가 생깁니다. 그래서 저희 팀은 하나의 저장소 안에 여러 브랜드의 모듈을 함께 관리하는 구조로 시작했습니다."}, {"date":"2025-11-17","title":"Ollama 는 mac m1 환경에서 docker 실행하기엔 너무 느렸다...","url":"/portfolios/docs/Java/45/","summary":"m1 에서 docker 로 ollama gemma3 모델 서빙할려고 했는데 너무 느림. 그래서 찾아보니 ollama 측에 이슈 봤는데 여기서 답변을 잘 해줌. 맥에서는 docker 에 gpu 메탈가속을 공유하지 못해서 느리다고 함. 그래서 그냥 맥에서 직접 서빙해야한다."}, {"date":"2025-11-11","title":"API 최적화 방법","url":"/portfolios/docs/Java/44/","summary":"최근 API 응답 최적화 관련 질문을 받았꼬 해당 방법에 대해 진짜 시작부터 끝까지 하나의 플로우로 정리해봤다. 일단 API 는 유저 정보를 불러오는 API 이며 내부망 API 2번 및 DB 1번 호출이 포함되어 있다고 가정한다."}, {"date":"2025-11-10","title":"protobuf 이진 내부구조 분석 및 gRPC 와 REST API 성능 비교","url":"/portfolios/docs/Java/43/","summary":"요즘 gRPC 를 외/내부망 통신에 많이 사용하는 추세이다. 듣기로는 소형 이진포멧으로 페이로드 크기를 줄일 수 있다고 한다. 성능 최적화에 기여할 수 있을 것 같아서 평소에 restAPI 만 쓰다가 이참에 gRPC 에 대해 알아보기로 했다."}, {"date":"2025-11-07","title":"GZIP 압축을 이용한 서버 응답 최적화(?)","url":"/portfolios/docs/Java/42/","summary":"API 응답 최적화 방법 중 하나로 GZIP 압축을 이용하는 방법이 있다고 한다. 뭔가 데이터를 압축해서 보내면 네트워크 전송량이 줄어들어서 응답속도가 빨라질 것 같긴 한데, 실제로 효과가 있을까 궁금해서 실행해봤다. 일단 먼저 gzip 이란?"}, {"date":"2025-10-28","title":"대용량 엑셀 파일 처리를 위한 Apache POI 최적화 팁","url":"/portfolios/docs/Java/41/","summary":"약 엑셀 하나당 100MB 이상의 대용량 엑셀 파일을 연속으로 처리해야하는 상황이 있었습니다. 칼럼수도 증가하며 row 수는 1000만건이 넘어가면서 메모리 부족 이슈가 발생했습니다. 거의 1GB 이상의 메모리에 올라가있는 상황이 발생했죠."}, {"date":"2025-10-10","title":"Bean 안쓰고 로우레벨에서 싱글톤으로 관리하기","url":"/portfolios/docs/Java-Kotlin/40/","summary":"일반적으로 Spring-Boot 쓰다보면 싱글톤 관리할려고 할 때 @Bean, @Component, 등등 어노테이션으로 객체를 관리한다. 그러다가 문득 아예 로우레벨에서 싱글톤으로 관리하는 방법도 알면 좋을 것 같아서 정리해본다."}, {"date":"2025-10-09","title":"ElasticSearch ILM 설정 기록","url":"/portfolios/docs/Java/39/","summary":"용량제한 90% 가 넘으면 경고가 뜨고, 95% 가 넘으면 읽기전용으로 바뀐다. 롤오버로 새로운 인덱스 생성하는거 굳이 안써도 됨."}, {"date":"2025-10-04","title":"llama2 chat 7b run on MBP M1 max","url":"/portfolios/docs/Java/38/","summary":"최종 목적은 git PR 요약 및 개선점을 머지 이전에 알아서 AI 가 로컬에서 alert 하는게 목적이다. 이를 위해서는 그래도 1분이내 응답이 만료되어야하고, 응답이 1000자 까지 지원해줘야한다(다시보니 500자도 충분할 듯)."}, {"date":"2025-10-02","title":"실수로 인해 발생하는 장애를 방지하기 위한 개인적인 규칙과 셋업","url":"/portfolios/docs/my/38/","summary":"실수로 인해 발생하는 장애를 방지하기 위해 개인적인 규칙과 셋업을 기록합니다. SQL 쿼리는 직접 짠 뒤 AI 검증 - 한 명 이상 같이 검증 - 실행시간 남기고 - update, delete 는 select 로 한 번 보고 explain 건 뒤 수행한다."}, {"date":"2025-09-16","title":"Mysql - Redis stream - Mongodb CDC + ETL setup","url":"/portfolios/docs/Java/37/","summary":"Intro 기존에 저희는 Mysql 를 main db 로, 멀티프렌차이즈를 목표로 운영하다보니 여러 다양한 스키마들이 필요했고 이를 위한 Mongodb 를 secondary db 로 운영하고 있었습니다."}, {"date":"2025-08-10","title":"goroutine 경량스레드 상기","url":"/portfolios/docs/Java-Kotlin/36/","summary":"Java Virtual Thread vs Goroutine 이전에 Java 의 native thread 와 goroutine 차이점을 정리한 적이 있고 그냥 다시 상기하는 차원에서 정리한다. ."}, {"date":"2025-08-04","title":"Redis 클러스터 모드에서 stream key 분산처리","url":"/portfolios/docs/Java/34/","summary":"Redis Stream 적용기 의 후속편이다. Redis Stream 은 stream key 를 하나의 큐로 사용한다. 문제는 redis cluster 모드에서 redis stream key 는 하나의 노드에만 저장이 되기떄문에 부하분산이 되지 않는다."}, {"date":"2025-05-21","title":"Spring batch","url":"/portfolios/docs/Java/32/","summary":"주문 관련 배치 작업 중 변경감지 안되서 정리함. 현재는 Spring batch 에서 reader processor writer step 중 ItemReader 내부에서 last read id + offset size 로 Pagination 해서 읽어오고 있음."}, {"date":"2025-05-07","title":"OAuth 1.0 간단정리","url":"/portfolios/docs/Java/31/","summary":"OAuth 1.0 한줄로 먼저 정리하자면, OAuth 1.0 은 매번 요청을 서명해야하고, 요청이 4번 필요해서 귀찮음(get-requestToken, verifier, accessToken, resource). OAuth 2."}, {"date":"2025-04-25","title":"Kafka 대신 Redis Stream 적용기","url":"/portfolios/docs/Java/30/","summary":"서론 저희 팀은 유저 주문 시 발생하는 알림 전송 로직을 기존에는 주문 처리 흐름 안에 직접 포함해 운영하고 있었습니다. 이 알림 로직은 PUSH → SMS → 알림톡 순서로 failover 되며, 각 단계가 순차적으로 처리되는 구조입니다."}, {"date":"2025-03-30","title":"aws 계정변경 유틸 & 쉘 스크립트 베드락","url":"/portfolios/docs/Java/29/","summary":"저는 dev, stage, prod 등 다양한 AWS 프로필과 여러 클러스터를 운영하고 있습니다."}, {"date":"2025-01-28","title":"RestClient 탄생 비화","url":"/portfolios/docs/Java/27/","summary":"sync/blocking 하는 restTemplate deprecated 하고 async/non-blocking 하는 webClient 로 완벽이전 하려고 했으나 중간다리가 필요함 아래의 discussion 에서 restClient 가 왜 나왔는지 discussion 이..."}, {"date":"2025-01-18","title":"배치 모니터링으로 처음 에러 잡기 성공","url":"/portfolios/docs/Java/26/","summary":"만들어두고 오랜만에 들어가봤더니 에러가 발생하고있었음. 그래서 에러메세지 확인 후 수정. 이거 에러발생 시 알림오도록 하는게 좋을듯? 이제는 노티가 너무 많아져서 알림관리도 필요할 듯!"}, {"date":"2025-01-18","title":"자동화 리스트","url":"/portfolios/docs/Java/25/","summary":"1. 빌드 & 모니터링 자동화 MODULE TO BUILD 변경된 파일 목록들 가져와서 공통 모듈이 변경되면 해당 모듈로부터 파생된 다른 모듈들 전부 deploy list 에 넣기. 만약 특정 하위 모듈만 변경되면 해당 모듈만 list 에 추가."}, {"date":"2024-12-30","title":"Git Actions with multiple Runner","url":"/portfolios/docs/Java/24/","summary":"보통 하나의 instance 에서 하나의 runner 만 추가하는 경우가 많습니다. runner 은 하나의 job 만 처리가능해서 matrix 를 사용하여 여러개의 job 을 병렬처리할 수 없죠. 디렉토리가 다르면 runner 를 여러개 추가할 수 있습니다."}, {"date":"2024-11-02","title":"ETC","url":"/portfolios/docs/Java/21/","summary":"제15조의3(개인정보 이용ㆍ제공 내역의 통지) 배치에러 too many missed start times. Set or decrease .spec."}, {"date":"2024-10-12","title":"배치 처리 성능 향상","url":"/portfolios/docs/Java/20/","summary":"유저들의 등급을 매월 업데이트하는 배치 프로세스 해당 프로세스를 개발하면서 성능 향상 결과를 정리합니다."}, {"date":"2024-09-08","title":"Authorization Code with PKCE","url":"/portfolios/docs/etc/5/","summary":"(Proof Key for Code Exchange) 쉬운 해설 : : 중간에 code 가로채고 먼저 accessToken 받아와서 해당 권한으로 리소스 서버에 접근하는 것을 막기 위한 프로토콜입니다. rfc 에 명시된 공격시나리오는 아래와 같아요."}, {"date":"2024-09-06","title":"Kotlin 잡동사니","url":"/portfolios/docs/Java-Kotlin/19/","summary":"parent: Java-Kotlin data class Response( val ci: String?, ) { init { ci = ci?"}, {"date":"2024-09-06","title":"Kotlin sealed class","url":"/portfolios/docs/Java-Kotlin/18/","summary":": https://kotlinlang.org/docs/sealed-classes.html enum 이랑 거의 똑같은데 좀 더 유연합니다. ENUM 은 constant 이지만, Sealed class 는 아래처럼 외부에서 원하는 값을 파라미터로 넣어서 반환시켜줄 수 있어요."}, {"date":"2024-09-04","title":"Mysql varchar/text/char 차이점","url":"/portfolios/docs/db/2024-09-08/","summary":"MYSQL VARCHAR vs CHAR 타입 차이 VARCHAR : 가변길이로 되어있고 공백으로 채워지지 않음. CHAR : 고정길이로 되어있고 공백으로 채워짐. 인덱싱해서 검색할 때 빠름. VARCHAR vs TEXT 타입 차이 VARCHAR : row 에 직접 저장."}, {"date":"2024-09-01","title":"git alias 로 회사, 개인 프로젝트 구분","url":"/portfolios/docs/etc/git-alias/","summary":"회사용, 개인용 ssh key 따로 등록 한 뒤 아래의 명령어로 alias 설정 이후에는 git personal 혹은 git work 로 alias 설정된 명령어 연계 사용 가능!"}, {"date":"2024-09-01","title":"RSA 암호화 원리","url":"/portfolios/docs/cypto/2024-09-01-rsa/","summary":"RSA 암호화/복호화 과정 설명함. 1. 기본 설정 소수 p, q: 53, 59 n: pq = 3127 Φ(n): (p-1)(q-1) = 3016 k: 임의 숫자, 2로 설정함. 공개 지수 e: 작은 홀수로 n과 공약수 없게 설정만 하면 됨."}, {"date":"2024-07-03","title":"PCA infarction","url":"/portfolios/docs/my/current3/","summary":"29살 뇌경색 2024.05.28일 Brain CT - PCA Infarction 소견 05.28 처음 겪는 어지러움에 119 불러서 병원갔고 PCA 경색 소견을 받음. 29살 뇌경색 진단을 받고 어떤 상태인지 알아보기 위해 관련 자료를 찾아봄. 1."}, {"date":"2024-05-17","title":"Spring 잡동사니","url":"/portfolios/docs/Java/15/","summary":"Spring Proxy Proxy = 대리자 Spring 에서 프록시는 매우 많은 곳에서 사용 AOP 로 로직 감싸서 처리한는 부분. Lazy Initialization Security Transaction Management 등등 예를 들어서 이런식임."}, {"date":"2024-03-07","title":"BM performance tester","url":"/portfolios/docs/benchmark/","summary":"BM performance tester develop since 2024-03-07 as main contributor A enterprise level performance testing solution. Taking inspiration from nGrinder, this project aims to develop a Spring Boot application mirroring nGrinder’s functionality as closely as possible. You can use our service in https://www.high-load.org. (currently not available due to cost is..."}, {"date":"2024-02-23","title":"ARM64 아키텍처를 지원하는 nGrinder 도커 이미지 만들기","url":"/portfolios/docs/docker/2024-02-23-docker8/","summary":"요즘 ARM64 아키텍처를 사용하는 서버가 늘어나고 있습니다. MacBook M1, M2 등의 ARM64 아키텍처를 사용하는 개발자도 늘어나고 있죠."}, {"date":"2024-02-11","title":"Mock vs Stub vs Spy 정리","url":"/portfolios/docs/Java/14/","summary":"테스트 코드를 짜다보면 흔히 Mock, Stub, 테스트 더블 등등 여러가지 용어를 듣게 됩니다. 이번에는 이러한 용어들을 정리해보면서 비교해보겠습니다. 예시와 함께 말이죠! 본 포스팅에서 사용되는 용어와 그 의미, 예시들은 마틴 파울러씨의 를 참고하여 작성되었습니다!"}, {"date":"2024-02-04","title":"46. SQL OrderBy 에 여러가지 인덱스 적용해보기 - 46배 빨라진 쿼리!","url":"/portfolios/docs/project/2024-02-04-chatting(46)/","summary":"서론 본 포스팅에서 테스트할 쿼리는 아래와 같습니다. 이 메소드는 roomId 에 기반하여 최대 1000개의 row 를 createdAt ascending 순서로 가져오는 쿼리입니다. 해당 쿼리는 findAllByRoomId 메소드로 수행이 되는데요."}, {"date":"2024-01-29","title":"45. CI/CD 자동화 구축 - 3","url":"/portfolios/docs/project/2024-01-29-chatting(45)/","summary":"지금까지 자동화한 부분에 대해 정리가 필요해서 본 포스팅을 작성합니다. 결론부터 말씀드리면, git main 브랜치에 병합되면 자동으로 신버전 태깅되어 여러 워커노드에 deploy 됩니다. 그리고 여러 Job 들의 결과를 slack 채널로 반환받게 됩니다."}, {"date":"2024-01-27","title":"44. 현재까지 프로젝트에 사용된 기술 정리","url":"/portfolios/docs/project/2024-01-27-chatting(44)/","summary":"지금까지 채팅서비스에는 정말 여러가지 기술들이 사용되었습니다. 이러한 기술들을 왜 사용했는지, 그리고 각각의 개념들에 대한 이해가 중요할 텐데요. 본 포스팅에서 자문자답 형식으로 이를 기술해보겠습니다! Q1. Kafka 는 어떤 이유로 쓴건가요? A1."}, {"date":"2024-01-22","title":"(PostgreSQL) Index 에 따른 성능측정","url":"/portfolios/docs/db/2024-01-22-DB-4/","summary":"Postgresql vs Mysql 인덱스 최적화 방법을 말씀드리기 전에 데이터 저장에 있어 Mysql 와 Postgresql 의 인덱싱 차이점을 먼저 말씀드리겠습니다. Mysql 의 PK 인덱스는 클러스터링 인덱스로 되어있습니다."}, {"date":"2024-01-07","title":"43. 서버성능 개선기록 - 🔴MTTFB 평균차이 - 31% 성능감소","url":"/portfolios/docs/project/2024-01-04-chatting(43)/","summary":"저는 채팅서버의 Interceptor 에서 Redis Session 에 저장된 refreshToken 을 find 하도록 설정했습니다. 그리고 이러한 Interceptor 메소드와 Redis 지연시간을 io.micrometer 로 측정해보았는데요."}, {"date":"2024-01-03","title":"42. 서버성능 개선기록 - 🟢MTTFB 변동량 평균 30.46% 개선","url":"/portfolios/docs/project/2024-01-03-chatting(42)/","summary":"성능개선 이전에 기존 서비스의 성능측정 10분간 POST /api-chat/chat 의 퍼포먼스를 ramp-up VUSER 300 으로 측정하였습니다. 아래의 테이블은 Thread warm up 이전과 이후 차이를 관찰합니다. 그리고 그래프는 웜업 이후의 그래프입니다."}, {"date":"2023-12-29","title":"41. 서버성능 개선기록 - 🟢TPS AVG 31%, MTTFB p99 39% 개선","url":"/portfolios/docs/project/2023-12-29-chatting(41)/","summary":"개선 이전(Ingress 파드 1개) thread 300 으로 요청 전송 시 위와같이 많은 cpu 로드가 걸리네요. cpu limit 설정은 적용되어 있지 않아 보이지만 일반적으로 Ingress 파드 하나로 돌리기에는 많은 부하를 혼자 감당하고 있는것을 확인할 수 있었습니다."}, {"date":"2023-12-21","title":"40. 서버성능 개선기록 - 🟢TPS p99 4556%, MTTFB p95 94.47% 개선","url":"/portfolios/docs/project/2023-12-21-chatting(40)/","summary":"서론 저는 여러 페이즈를 진행하며 성능 개선을 진행하였고, 각 페이즈 별 성능수치들을 먼저 보여드리겠습니다."}, {"date":"2023-12-10","title":"39. CI/CD 자동화 성공 - 2","url":"/portfolios/docs/project/2023-12-10-chatting(39)/","summary":"{: .important-title } 1.CI/CD 자동화 성공 그리고 실패 기존에 CI/CD 플로우는 하나의 머신에 자동으로 업로드하는 플로우를 가지고 있습니다(기존의 CI/CD 방법)."}, {"date":"2023-11-03","title":"Transactional 와 Async 예제 및 탐구","url":"/portfolios/docs/Java/13/","summary":"JPA 영속성 유지기간을 관찰하기 위한 여러 예제를 설명합니다 @Transaction 코드 밖에서는 영속성 유지가 되지 않는 것을 확인 @Transaction 코드 내부에서 영속성 유지가 되는 것을 확인 이를 통해 바뀐 생각은 아래와 같아요."}, {"date":"2023-10-07","title":"38. CI/CD 자동화 성공 그리고 실패 - 1","url":"/portfolios/docs/project/2023-10-07-chatting(38)/","summary":"본 포스팅은 제가 아래의 이슈에서 이야기한 내용을 정리한 글이에요. {: .important-title } CI/CD 자동화 성공 그리고 실패 기존에 CI/CD 플로우는 하나의 머신에 자동으로 업로드하는 플로우를 가지고 있습니다(기존의 CI/CD 방법)."}, {"date":"2023-09-12","title":"쿠버네티스 요약본","url":"/portfolios/docs/docker/2023-09-12-docker/","summary":"kind:Service 와 kind:Deployment 의 차이 Service와 Deployment는 Kubernetes(K8s)의 핵심 구성요소이지만, 그들의 목적과 기능이 크게 다릅니다."}, {"date":"2023-09-10","title":"JPQL JOIN 의 4가지 방식과 예제 설명","url":"/portfolios/docs/Java/12/","summary":"JPQL JOIN 들이 헷갈리는 부분이 있어서 정리해보았습니다. JPQL 에는 총 4 가지 JOIN 방식이 존재합니다. 그리고 이 JOIN 방식에 따라 영속성 컨텍스트로의 로딩 전략이 달라집니다. JPQL 에서 JOIN 을 사용하려면 연관관계를 엔티티에 설정해주어야만 합니다."}, {"date":"2023-09-10","title":"Spring Security 데이터 플로우","url":"/portfolios/docs/Java/11/","summary":"Spring Security 데이터 플로우에 대해 정리한 글입니다."}, {"date":"2023-08-08","title":"JPA 양방향 전파 설정 3 가지 경우 테스트","url":"/portfolios/docs/Java/10/","summary":"JPA 양방향 전파 설정 3 가지 경우 테스트에 대해 정리한 글입니다."}, {"date":"2023-08-01","title":"JPA IdClass 중복저장 시 기존 엔티티 업데이트 이슈","url":"/portfolios/docs/Java/9/","summary":"1. Issue Description 현재 LicenseCategory 는 licenseType 과 analyzeType 을 CombinedKey 로 사용합니다. 그리고 이 두 개의 키는 LicenseCategoryId 라는 IdClass 로 선언되어 있어요."}, {"date":"2023-06-26","title":"📌 쿼리 최적화 방법","url":"/portfolios/docs/db/db1/","summary":"저는 JPA, Data-JPA, JPQL를 사용해서 채팅 프로젝트에서 사용합니다. 하지만 성능이 생각보다 낮았습니다. 따라서 NativeQuery(=SQL query)를 사용하여 좀 더 최적화시키려 합니다. 그러기 위해서 다양한 최적화 방식들을 정리해보려고 하는데요."}, {"date":"2023-06-18","title":"Spring-Cloud-Gateway 지원 로드밸런싱 기술","url":"/portfolios/docs/Java/8/","summary":"Gateway 지원 로드밸런싱 기술 : Default로 ReactiveLoadBalancer 을 사용하고, 이는 Round-Robin(default) 과 Random 이 두 가지를 지원합니다."}, {"date":"2023-06-18","title":"37. Spring Cloud 기반 MSA 변환 시작-11(RDB 트래픽 분산)","url":"/portfolios/docs/project/2023-06-18-chatting(37)/","summary":"문제인식 현재 채팅서버 MSA 프로젝트로 확장성을 다양한 방법으로 증가하고 있습니다. 채팅서버 프로젝트에서 확장성 증가를 위한 구현 및 사용된 기술은 아래와 같아요."}, {"date":"2023-06-17","title":"Spring-Java 에서의 Sync/Async Blocking/Non-Blocking 구현 방법","url":"/portfolios/docs/Java/7/","summary":"다들 동기/비동기와 Blocking/Non-blocking 을 한번씩 들어보셨을거에요. 하지만 Spring-Java 에서 이를 섞은 조합에 대한 실제 구현 방식을 설명하는 글이 별로 없더라구요. 그래서! 오늘의 포스팅은 해당 구현 방식에 대해 자세히 설명하려고 합니다. 1."}, {"date":"2023-06-10","title":"36. Spring Cloud 기반 MSA 변환 시작-10(FE/BE 동기화)","url":"/portfolios/docs/project/2023-06-10-chatting(36)/","summary":"동기화 결과 동기화 내용 : 인증서버에 유저 API 요청을 전달했을 떄, 인증서버와 채팅서버, 고객서버의 상태를 SSE로 받아옵니다."}, {"date":"2023-06-01","title":"개발자 취준생 일기","url":"/portfolios/docs/my/current2/","summary":"새로운 기술 갈망 그리고 한계 요즘 새로운 기술을 적용하고싶다는 생각을 합니다. 특히 No-sql 쪽으로요. 이유는 MSA 프로젝트를 진행하면서 RDBMS(Postgresql)가 가지는 명확한 문제점을 발견했거든요."}, {"date":"2023-05-01","title":"35. Spring Cloud 기반 MSA 변환 시작-9(성능이슈 해결 과정)","url":"/portfolios/docs/project/2023-05-01-chatting(35)/","summary":"MSA 버전과 이전 모노 버전에서의 변경된 점과 성능 문제점 및 해결 과정을 설명하려 합니다. 일단 먼저 변경점을 아래와 같이 정리해보았어요. 1."}, {"date":"2023-04-30","title":"34. Spring Cloud 기반 MSA 변환 시작-8(CQRS 설계)","url":"/portfolios/docs/project/2023-04-30-chatting(34)/","summary":"저는 90% 이상의 쿼리를 차지하는 Read 전용 DB를 따로 떼서 검색성능을 높이고자합니다."}, {"date":"2023-04-25","title":"33. Spring Cloud 기반 MSA 변환 시작-7(주문서비스 이벤트 flow 및 스키마 설계)","url":"/portfolios/docs/project/2023-04-25-chatting(33)/","summary":"Order 서비스와 Customer/Product 서비스의 이벤트/DB 스키마 설계."}, {"date":"2023-04-24","title":"32. Spring Cloud 기반 MSA 변환 시작-6(MSA Project 를 진행하면서 느낀 점)","url":"/portfolios/docs/project/2023-04-24-chatting(32)/","summary":"(서론) MSA Project 를 진행하면서 느낀 점 지금까지 유저서비스와 주문서비스들을 MSA 로 진행하면서 느낀 점인데, 기술에 계속 파묻히고 있는것 같습니다. 그래서 왜 MSA 로 변환하고 있는지 그 목적을 상기시키고 정리하고자 이 포스팅을 쓰게 되었습니다."}, {"date":"2023-04-24","title":"31. Spring Cloud 기반 MSA 변환 시작-6","url":"/portfolios/docs/project/2023-04-24-chatting(31)/","summary":"Kafka Topic Naming Convention 저는 현재 사용중인 Kafka MQ 에서 토픽을 어떻게 구성할지 고민하고 있습니다. 하나를 예로 들어볼께요."}, {"date":"2023-04-19","title":"Netty 아키텍처 및 동작과정","url":"/portfolios/docs/Java/6/","summary":"{: .note} 이 글을 읽기 전에 Reactor 모델 등장 배경을 설명하는 를 보고 오시면 이해에 도움이 될 것입니다! 본 포스팅은 아래의 들을 번역하고 재정리한 글입니다. 1. Netty 란? 1."}, {"date":"2023-04-19","title":"NIO 와 Reactor 모델 아키텍처 설명","url":"/portfolios/docs/Java/5/","summary":"본문은 아래의 들을 번역하고 정리한 글입니다. 1. NIO(New Input/Output) Java NIO 는 크게 3가지 컴포넌트로 이루어져 있습니다."}, {"date":"2023-04-17","title":"30. Spring Cloud 기반 MSA 변환 시작-5","url":"/portfolios/docs/project/2023-04-17-chatting(30)/","summary":"1. Saga Choreography Architecture v5 버전인 현재 구현진행/완료 중인 아키텍처입니다. 2. Saga Choreography 이벤트 성공값 클라이언트 반환 feat."}, {"date":"2023-04-13","title":"29. Spring Cloud 기반 MSA 변환 시작-4","url":"/portfolios/docs/project/2023-04-13-chatting(29)/","summary":"인증/권한 설정 JWT 토큰을 강제로 expire 할 수 없다는 점이 까다로운것 같아요. 예로 비밀번호를 업데이트하면, 해당 비밀번호 이전의 토큰은 여전히 사용하능하다는 단점이 존재합니다."}, {"date":"2023-04-08","title":"Spring Security(WebFlux) 인증/인가 설정 + JWT","url":"/portfolios/docs/Java/3/","summary":"{: .important } Reactive 프로그래밍에서는 Spring Security 설정이 기본과는 다릅니다. 별로 레퍼런스가 없길래 아래와 같이 코드를 공유합니다. 1. LoginResponseDto 2. LoginRequestDto 3."}, {"date":"2023-04-05","title":"WebFlux(Reactive Programming)","url":"/portfolios/docs/Java/2/","summary":"1. WebFlux 한줄 정의 WebFlux는 Reactive Programming 을 편하게 사용가능하게하는 Spring 제공 객체로, Pub/Sub 방식으로 이벤트 메세지를 주고받습니다."}, {"date":"2023-04-05","title":"CompletableFuture vs WebFlux","url":"/portfolios/docs/Java/1/","summary":"일반적으로 Future와 WebFlux 를 비동기 구현에 사용하게 됩니다. Future은 별도의 스레드를 호출하여 로직 실행 후, CallBack을 통해 리턴값을 전달받을 수 있죠."}, {"date":"2023-03-29","title":"28. Spring Cloud 기반 MSA 변환 시작-3","url":"/portfolios/docs/project/2023-03-29-chatting(28)/","summary":"인증/권한 설정 제가 구현하고자 하는 부분을 인증/권한부여 파트만 간단하게 도식화해서 나타낸다면 아래의 그림과 같을거에요. 여기의 문제점은 micro service가 늘어날 수록, 세션에 대한 부담이 늘어난다는 것입니다."}, {"date":"2023-03-28","title":"27. Spring Cloud 기반 MSA 변환 시작-2","url":"/portfolios/docs/project/2023-03-28-chatting(27)/","summary":"API GateWay 선정 기존에 저는 nginx를 아래의 이유로 사용했어요. 통합 엔트리 포인트를 제공 리버스 프록시(백엔드 포인트 숨기기) 서비스 별 로드 밸런싱 높은 동시처리성능 1,2,3 번은 일반적인 Gateway 툴에서 제공하는 기능이구요."}, {"date":"2023-03-27","title":"26. Spring Cloud 기반 MSA 변환 시작-1","url":"/portfolios/docs/project/2023-03-27-chatting(26)/","summary":"먼저 제 채팅 프로젝트는 아래의 형태를 추구하고 있어요. Event-Driven Architecture 를 통한 loose-coupling API-Gateway 를 통한 통합 엔트리 포인트 제공 올바른 트랜젝션 처리 비동기 멀티 스레드를 통한 동시성 성능 향상 자동화..."}, {"date":"2023-03-16","title":"25. Postgresql indexing 활성화","url":"/portfolios/docs/project/2023-03-16-chatting(25)/","summary":"인덱싱된 userid, 그러나 Sequential. 그렇다면 어떻게 사용하도록 할 수 있을까요? 영구적인 인덱싱 활용 쿼리설정(feat."}, {"date":"2023-03-15","title":"CompletableFuture 기능 별 심화이해","url":"/portfolios/docs/Java-Kotlin/java3/","summary":"thenAccept/thenRun/thenApply thenAccept 는 이전에 전달받은 parameter 가 있을 때 사용되며, thenRun 은 없을 때 사용됩니다. 예시로 함께 보겠습니다."}, {"date":"2023-03-15","title":"24. 트랜젝션과 멀티스레드의 잘못된 매칭 수정","url":"/portfolios/docs/project/2023-03-15-chatting(24)/","summary":"{: .important } HikariCP를 사용하던 중, 새로운 스레드에서 hikariDataSource.getConnection() 을 수행했지만 다른 스레드에서 사용하던 Connection 이 반환되었습니다."}, {"date":"2023-03-11","title":"23. HTTP benchmark tool 제작 및 서버 부하 Fuzzing Test","url":"/portfolios/docs/project/2023-03-11-chatting(23)/","summary":"서론 HTTP benchmark tool 제작 및 서버 부하 테스팅 0. 서론 현재까지 저는 INSERT 쿼리를 BatchSize=50 JDBC Batch로 변경하였습니다. 또한 인증서버도 멀티스레드로 구현하였습니다. 이제 직접 서버에 부하를 테스트해볼 차례에요."}, {"date":"2023-03-06","title":"22. @Async를 사용하지 않는 Spring Java MultiThread handling","url":"/portfolios/docs/project/2023-03-06-chatting(22)/","summary":"서론 Multi Thread with Custom Exception, Not using @Async! 멀티스레딩 결과 1. 정상적인 api 요청 결과 2. db-유니크 키 violation 에러 핸들링 결과 신나는 코딩! 1."}, {"date":"2023-03-05","title":"21. Postgresql Locks 및 RDS 지표 관찰, 성능향상!","url":"/portfolios/docs/project/2023-03-05-chatting(21)/","summary":"AWS RDS 그래프 지표 관찰 Postgresql Locks Lock 관찰 쿼리 Lock 타입 설명 타입에 따른 Conflict 발생 가능 여부 Conflict 예시 Conflict로 인해 블록된 쿼리 확인 그래서 AWS RDS로 확인한 지표에서 어떤 부분을 개선할 수..."}, {"date":"2023-03-04","title":"20. 싱글 스레드 -> 멀티 스레드","url":"/portfolios/docs/project/2023-03-04-chatting(20)/","summary":"인증서버의 속도를 높이기 위해 기존 단일 스레드로 작업하던 부분을 아래의 configuration 을 통해 10개100개의 스레드로 동시성을 가져가보았습니다. 미리 결론을 말씀드리면 성능은 개선되지 않았습니다. 이유는 곧 말씀드리겠습니다."}, {"date":"2023-03-02","title":"Garbage Collection","url":"/portfolios/docs/Java-Kotlin/java2/","summary":"Java에서는 new로 객체 생성하면 힙에다가 저장되잖아요? 이 때 힙 내부를 여러 단계로 나뉘어 어디에 저장하고 관리할지 정해주는게 GC입니다. 얘네는 세대교체를 베이스로 동작합니다."}, {"date":"2023-02-27","title":"개발자 취준생 일기","url":"/portfolios/docs/my/current1/","summary":"현재와 목표간의 거리 개발자 취업시장의 문을 두드린지 6개월이 지났습니다. 알아야 될 부분이 너무나도 많았고, 또 많을 예정입니다. 지금 생각해보니 옜날 개발자로 진로를 처음 정한 이유는 단순했습니다."}, {"date":"2023-02-21","title":"Java에서의 비동기 NonBlocking, 그리고 ListenableFuture 객체","url":"/portfolios/docs/Java-Kotlin/java1/","summary":"Async, Sync + Blocking, NonBlocking 비동기와 동기, 그리고 non-blocking과 blocking방식은 어떻게 조합하냐에 따라 진행방식이 달라집니다. 이 글은 각각의 조합방식에 따른 진행방식의 차이점에 대해 설명합니다."}, {"date":"2023-01-30","title":"19. 현재까지의 일정관리 Notion","url":"/portfolios/docs/project/2023-01-30-chatting(19)/","summary":"19. 현재까지의 일정관리 Notion에 대해 정리한 글입니다."}, {"date":"2023-01-27","title":"18. 성능개선 사안들 및 적용된 값","url":"/portfolios/docs/project/2023-01-27-chatting(18)/","summary":"성능개선사안들 및 적용된 값들 batch 29초로 개선되었다. Before After."}, {"date":"2023-01-24","title":"17. 프론트 서버 개발 완료 및 성능이슈 발생","url":"/portfolios/docs/project/2023-01-24-chatting(17)/","summary":"Batch JPA batch JDBC batch 일반적인 성능비교 그래서 Chatting을 insert할 때는 어떤 방식이 좋을까? 이슈비교 그 외 종합 성능비교 그래프 결론 기능 설명 및 시연영상 현재는 4.2.0 버전이며 프론트 서버까지 모두 완료되었다!"}, {"date":"2023-01-20","title":"16. 프론트 서버의 예상 UI + 시퀀스 다이어그램 + HTTP 송/수신 방법 정의","url":"/portfolios/docs/project/2023-01-20-chatting(16)/","summary":"INDEX(프론트 서버 설계) 예상 UI 시퀀스 다이어그램 프론트 HTTP request/response 비동기 or Non-blocking? 예상 UI 앞서 우리는 API Gateway까지 백엔드 전체를 생성했다."}, {"date":"2023-01-17","title":"15. 대량 Rest api test 시 속도문제 해결과정-2","url":"/portfolios/docs/project/2023-01-17-chatting(15)/","summary":"이전 테스트에서 발생한 성능이슈를 (1)Server 수평확장 및 (2)Docker 할당 리소스 추가로 10K HTTP request 테스트의 response까지 걸리는 시간을 110초에서 49초로 감소시켰다."}, {"date":"2023-01-17","title":"14. 대량 Rest api test 자동화","url":"/portfolios/docs/project/2023-01-17-chatting(14)/","summary":"실시간 채팅방 backend에 직접 대량의 Rest api test를 진행했었다. 그런데 이 rest api test가 매번 직접 설정해주기 힘들어서 이를 Docker-compose 와 Viper 로 자동화 할 것이다. 아래는 자동화 시키고 실행한 결과를 먼저 보인다."}, {"date":"2023-01-16","title":"13. 대량 Rest api test 시 속도문제 해결과정-1","url":"/portfolios/docs/project/2023-01-16-chatting(13)/","summary":"이전 포스팅에서 10000개의 rest api를 직접 test해보았다. 로직에는 문제가 없지만 성능이슈가 너무 나버렸다. 10000개 테스트 하는데 110초가 걸린것이다. 의심가는 부분이 한두군데가 아니다. 오늘의 포스팅은 의심가는 부분을 한번 찾아보고 정리하려한다."}, {"date":"2023-01-16","title":"12. 대량 Rest api test","url":"/portfolios/docs/project/2023-01-16-chatting(12)/","summary":"랜덤값으로 test하는 code 10000개 rest api 트래픽 실행(110초 소요) 이제 동시 연결가능한 TCP 소켓을 필자의 맥북이 버틸 수 있는만큼 열어서 다량의 http request를 서버로 전송해볼려고 한다. Transport 설정을 잠깐 설명하자면 아래와 같다."}, {"date":"2023-01-15","title":"11. 대량 Rest api test 코드","url":"/portfolios/docs/project/2023-01-15-chatting(11)/","summary":"현재까지 auth/chat Server 및 여러 장애대응과 모니터링 서비스를 구축했다. 서비스관련 테스트 코드는 이미 생성하였으며, 이제는 다량의 Rest api 트래픽을 테스트를 위한 클라이언트를 제작해 볼 차례이다. 아래의 코드는 Golang으로 제작하였다."}, {"date":"2023-01-08","title":"10. 양방향 DB Sync 구현의 어려움과 비용","url":"/portfolios/docs/project/2023-01-08-chatting(10)/","summary":"서론 단방향까지는 구현이 가능했었는데, 양방향(BDR)은 아래의 이유로 굉장히 까다로웠다. 컨셉만 존재할 뿐, 코드 레퍼런스가 없다. 현업자분들께 방향성을 여쭙고싶다."}, {"date":"2023-01-04","title":"9. 단방향 DB Sync with Kafka connector","url":"/portfolios/docs/project/2023-01-04-chatting(9)/","summary":"DB sync 시 고려할점 어떻게 두 개의 master DB를 sync 해야할까? Kafka connector란? Kafka Source connector setting 1. postgres wallevel 설정 2. debezium connector 설정(source) 3."}, {"date":"2023-01-03","title":"8. Kafka/Spring/ELK Stack 연동완료","url":"/portfolios/docs/project/2023-01-03-chatting(8)/","summary":"서론 드디어 길고 긴 실시간 채팅방 구현 중 backend가 완료되었다! 경험많고 설계를 잘하시는 분들이 보면 간단해보이겠지만, 경험이 전무한 필자는 모든 구현과 기술 하나하나가 벅찼다."}, {"date":"2023-01-02","title":"Elastic Search 심화(2)
ELK stack","url":"/portfolios/docs/elasticSearch/2023-01-02-elastic-search(3)/","summary":"ELK stack ELK 스택은 Elastic Search + Logstash + Kibana를 지칭하는 단어다."}, {"date":"2023-01-01","title":"Elastic Search 심화(1)","url":"/portfolios/docs/elasticSearch/2023-01-01-elastic-search(2)/","summary":"Shard란? Node란? 주의사항 1. Shard란? 이전 포스팅에서 ES는 Index단위로 데이터를 저장한다고 하였다. 이 Index는 Shard 단위로 분산저장된다. 위의 그림은 하나의 Index를 총 5개의 샤드로 분산저장한 그림이다."}, {"date":"2022-12-31","title":"Elastic Search의 개념 및 RDB와의 차이점","url":"/portfolios/docs/elasticSearch/2022-12-31-elastic-search/","summary":"개념 RDB와의 차이점 Type을 독립적으로 가지지 않은 이유 부모자식관계를 설정하는 두 가지 방법 RDB와의 차이점(추가) 문법(Appendix) 개념 ES(ElasticSearch)는 Java 오픈소스 분산 검색 엔진이다."}, {"date":"2022-12-30","title":"7. 수정된 아키텍처","url":"/portfolios/docs/project/2022-12-30-chatting(7)/","summary":"진행상황 Architecture 현재 구현된 서비스를 docker compose를 통해 실행시키면 다음과 같이 컨테이너들이 생긴다. Kafka와 Chat Server, Auth Server, DB들 모두 외부접속 가능하도록 노출 port를 도커 내부 포트랑 같게 설정했다."}, {"date":"2022-12-24","title":"6. 전체 아키텍처 수정","url":"/portfolios/docs/project/2022-12-24-chatting(6)/","summary":"전체 스키마 수정 앞서 본 프로젝트에서 backend와 front가 kafka Request/Response 아키텍쳐로 통신하도록 설정하였다. 이 때, 발생하는 귀찮은 부분이 상당히 많았다."}, {"date":"2022-12-21","title":"5. Kafka 연동완료","url":"/portfolios/docs/project/2022-12-21-chatting(5)/","summary":"진행상황 Backend Server 완료 아래는 Kafka Backend Server 세팅 클래스 및 기능들이다."}, {"date":"2022-12-19","title":"4. 프로젝트 수행시 고려점2","url":"/portfolios/docs/project/2022-12-19-chatting(4)/","summary":"추가내용 문제점2. 메모리상에서 유저데이터의 복제 해결 방법 이전 포스팅[[실시간 채팅방 구현(2)]](https://ghkdqhrbals.github.io/posts/chatting(2)/)에서 문제점2인 메모리상 유저데이터 복제가 일어난다고 기술했다."}, {"date":"2022-12-19","title":"Kafka에 대한 고찰","url":"/portfolios/docs/Java/1-3/","summary":"Request-response (HTTP) vs. event streaming (Kafka) 정리 글 event streaming 2 페이스북같은 경우, 유저 프로파일을 변경했을 때 여러 다른서버들과 연동이 일어난다."}, {"date":"2022-12-18","title":"3. JPA save 잘못된 이해로 비롯된 에러","url":"/portfolios/docs/project/2022-12-18-chatting(3)/","summary":"1. spring-data-jpa save(S entity) 본 프로젝트에서는 Service Layer에서 트랜젝션처리를 수행한다. 또한 Repository는 data-jpa를 사용했다. 필자는 서비스 내 예외 발생 시, 원하는 값을 반환하고싶었다."}, {"date":"2022-12-17","title":"2. 프로젝트 수행시 고려점1","url":"/portfolios/docs/project/2022-12-17-chatting(2)/","summary":"프로젝트 수행 시 고려할 문제점 문제점1. 메모리 누수 front-back으로 기존 모노서버를 분산하던 중, JPA로 Chatting 을 저장할 때 메모리 누수가 관찰되었다. 먼저 Kafka를 통해 전달받는 메세지 구조는 다음과 같다."}, {"date":"2022-12-11","title":"1. 현재 프로젝트의 문제점과 해결방법","url":"/portfolios/docs/project/2022-12-11-chatting(1)/","summary":"1. 현재의 단계 현재까지 version1 실시간 채팅방 구현을 위한 STOMP/Spring 연동이 완료되었다. 상세한 내용과 코드는 다음의 github 링크에서 확인할 수 있다. GITHUB : v1 동작 : 2."}, {"date":"2022-12-02","title":"KafkaMQ 의 아키텍처와 메세지를 처리하는 방식","url":"/portfolios/docs/Java/1-2/","summary":"Kafka 아키텍처 용어 설명 Producer : 이벤트를 보내는 주체 Consumer: 토픽의 파티션에 저장되어 있는 메시지를 소비(consume)하는 역할. Consumer Group : 하나의 Topic의 모든 파티션들을 구독하는 consumer 그룹."}, {"date":"2022-12-01","title":"메세지 큐의 개념 및 장점","url":"/portfolios/docs/Java/1-1/","summary":"메세지 큐(MQ) MQ 란? 클라이언트의 요청을 큐에 저장하고 Consumer이 필요할 때 꺼내쓰는 아키텍처. 장점 비동기(Asynchronous) 메시지 큐는 생산된 메시지의 저장, 전송에 대해 동기화 처리를 진행하지 않고, 큐에 넣어 두기 때문에 나중에 처리할 수 있다."}, {"date":"2022-11-20","title":"CAP와 ACID, BASE 이론","url":"/portfolios/docs/db/2022-11-20-DB-3/","summary":"이 포스팅은 ACID, CAP, BASE 이론들을 설명하는 글입니다. 대부분의 어플리케이션은 데이터의 정합성을 보장하기 위해서 데이터 베이스를 이론(ACID, CAP, BASE 이론)에 따라 관리합니다."}, {"date":"2022-11-20","title":"RDB 트랜젝션 Isolation","url":"/portfolios/docs/db/2022-11-20-DB-2/","summary":"모든 데이터베이스는 아래의 트랜젝션 격리 수준을 가진다. READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 이해를 돕기 위해 A,B 트랜젝션이 동시에 특정 데이터에 진입할 때를 가정한다. 1."}, {"date":"2022-10-14","title":"Algorithm(1)
트리","url":"/portfolios/docs/CS/algorithm/2022-10-14-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98/","summary":"Tree (level1) 이진트리 모든 노드가 두개 이하의 자식노드를 가질 때, Binary Tree라고 부른다. (level2) 이진탐색트리 이진트리인데, 자료의 검색, 삭제, 삽입, 정렬 등에 효율적인 트리 자료구조임. 부모노드의 키값의 대소에 따라 자식노드를 삽입함."}, {"date":"2022-10-06","title":"(English) RDB Normalization","url":"/portfolios/docs/db/2022-10-06-DB-1/","summary":"What is schema? DB schema : a metadata that how data is organized within a relational database this is inclusive of logical constraints such as, table..."}, {"date":"2022-09-18","title":"(EN) What is Goroutine and its behavior","url":"/portfolios/docs/go/2022-09-18-thread-goroutine/","summary":"Golang use goroutine which is similar with thread, but little bit different. Goroutine can make you easy to use thread with concurrency."}, {"date":"2022-09-05","title":"(EN) What is MSA?","url":"/portfolios/docs/msa/2022-09-05-micro-service-architecture2/","summary":"What is MSA? Monolithic's Disadvantage Changes in some modules affect the entire application Lack of scalability Micro Service Architecture's Advantage..."}, {"date":"2022-09-04","title":"(KR) Saga 의 두 가지 패턴 설명","url":"/portfolios/docs/msa/2022-09-04-micro-service-architecture1/","summary":"SAGA SAGA 패턴은 MSA에서 트랜젝션의 ACID를 보장하기위해 만든 패턴입니다. SAGA는 여러 서비스들이 연결된 방식에 따라, 관리를 어떤 방식으로 진행하는지에 따라 Orchestration/Choreography 이 두 가지의 형태를 가집니다."}, {"date":"2022-08-30","title":"(EN) Golang vs Spring Native","url":"/portfolios/docs/go/2022-08-30-golang-vs-spring(1)/","summary":"As I'm a golang developer, there is a article that compare between golang and spring. The article said \"Golang is 133% faster than Spring\"."}, {"date":"2022-08-25","title":"(EN) Golang vs Java(2)","url":"/portfolios/docs/go/2022-08-25-golang-vs-java2/","summary":"In concurrency, Golang and Java has multiple different features."}, {"date":"2022-08-23","title":"(EN) Golang vs Java(1)","url":"/portfolios/docs/go/2022-08-23-golang-vs-java/","summary":"Recently, I had a job interview in Ebay. They generally use Java for their development. And my programming language is Golang."}, {"date":"2022-08-02","title":"📌 Cassandra의 구조 및 동작과정, RDB와의 차이점","url":"/portfolios/docs/NOSQL/cassandra/","summary":"{: .highlight } 카산드라는 대표적인 AP 시스템을 사용하는 분산 DB 중 하나입니다 해당 관련글을 찾던 와중 정말 많은 문서가 존재했지만, 한글화된 문서는 찾아보기 어려웠습니다. 따라서 이 기회를 빌어 카산드라를 상세하게 정리해볼까 합니다."}, {"date":"2022-08-01","title":"간단한 포트폴리오 웹 제작","url":"/portfolios/docs/toy/toyp6/","summary":"해당 프로젝트는 취업준비 진행 중, 간단하게 react를 사용하여 제작한 웹 포트폴리오입니다."}, {"date":"2022-06-01","title":"(English) JWT vs PASETO","url":"/portfolios/docs/cypto/token/","summary":"This run on Application Layer(Unlike TLS tickets) JWT(JSON-Web-Token) PASETO(Platform-Agnostic SEcurity TOkens)."}, {"date":"2022-05-30","title":"(EN) Relationship between MSA and Docker","url":"/portfolios/docs/msa/2022-05-30-msa-docker-kubernetes/","summary":"MSA rises as cloud services and is more and more used. That's because each service is independent and can be managed its cost efficiently."}, {"date":"2022-05-12","title":"(English) ECC encryption","url":"/portfolios/docs/cypto/ecc/","summary":"E : Y^2 = X^3 + aX + b (mod p) pubkey = Pa, Pb privkey = nA, nB Select random k value, k = Random value with range 1 to n − 1 paintext - grouping -..."}, {"date":"2022-05-10","title":"(English) RSA ecnryption","url":"/portfolios/docs/cypto/2022-05-10-rsa/","summary":"Generate A's RSA public/private key A generate random prime number p,q = 53, 59 n = pq = 3127 Φ(n) = (p-1)(q-1) = 3016 A generate random number k = 2 A..."}, {"date":"2022-05-01","title":"(EN) Network(4)
Cookie and Session, JWT(Json Web Token)","url":"/portfolios/docs/CS/network/2022-05-01-cookie-session-storage/","summary":"We generally use TOKEN for authentications. But we don't actually know the details about token."}, {"date":"2022-04-25","title":"(EN)Building a Lightweight MQ with Redis Streams","url":"/portfolios/docs/Java/1-4/","summary":"Introduction Previously, the user notification logic was embedded directly in our business logic, with a failover sequence like PUSH → SMS → Alimtalk."}, {"date":"2022-04-23","title":"(EN) implementation (2)","url":"/portfolios/docs/project2/2022-04-23-golang-backend(3)/","summary":"Progress For my experience in golang-backend, I use below skills for develop my banking service. You can see the source code in my github."}, {"date":"2022-03-22","title":"(KR) SAGA Choreography 트랜젝션 관리 및 DDD(Domain-Driven Design)","url":"/portfolios/docs/msa/2023-03-22-msa1/","summary":"저는 MQ를 사용하긴 하지만, 보상 트랜젝션 설정이 현재는 체계적으로 되어있지 않습니다. 따라서 MSA의 SAGA pattern 중 Choreography 형태를 체계적으로 구현하기 이전, DDD에 대한 개념이 부족한 것 같아서 따로 정리하려고 합니다."}, {"date":"2022-03-15","title":"(English) Kubernetes","url":"/portfolios/docs/docker/2022-03-15-kubernetes/","summary":"Kubernetes Kubernetes is a platform for managing containerized workloads and services, that facilitates both declarative configuration and automation if..."}, {"date":"2022-03-13","title":"📌 도커 vs VM Hypervisor Type-1 vs VM Hypervisor Type-2 차이점 설명","url":"/portfolios/docs/docker/2022-03-13-docker2/","summary":"대부분의 블로그에서는 VM 을 일반화한 경우가 많았습니다. 예로 대부분 VM 은 GuestOS 가 있고 Docker 은 없다, 속도차이가 존재한다 등등의 차이점을 간단하게 설명하더라구요. 반면 VM 또한 두 가지 타입이 존재하는데 이 타입에 따라 성능차이가 분명 있습니다."}, {"date":"2022-03-10","title":"(English) Docker Setting","url":"/portfolios/docs/docker/2022-03-10-docker1/","summary":"Dockerfile Below is my Banking Server backend Dockerfile. Here, I'm going to explain each steps. Lets start from the beginning! Build Stage FROM golang:1."}, {"date":"2022-02-22","title":"(EN) Network(3)
TLS 1.2 vs TLS 1.3","url":"/portfolios/docs/CS/network/2022-02-22-network(3)/","summary":"TLS 1.2 TLS encrpyt all your application data in packet. Here is a whole process of how server/client exhange their keys and how they encrypt packets."}, {"date":"2022-02-08","title":"(English) RDB Transaction","url":"/portfolios/docs/db/2022-02-08-DB-transcation/","summary":"What is Database Transaction? It refers to the unit of work performed by changing the state of the database."}, {"date":"2022-02-02","title":"(EN) implementation (1)","url":"/portfolios/docs/project2/2022-02-02-golang-backend(1)/","summary":"Database design First I'm going to write DB scheme using . We can make general sql code as below."}, {"date":"2022-02-01","title":"GOTYBENCH(HTTP Benchmark Tool) 설계","url":"/portfolios/docs/toy/toyp3/","summary":"Introduction Fuzzing Test를 하고싶은가요? 아니면 서버의 부하를 테스트하고싶은가요? 결과를 저장해서 한눈에 보고싶은가요? 이를 위한 HTTP Benchmark Tool인 gotybench를 설계했습니다!"}, {"date":"2022-01-08","title":"(EN) Network(2)
HTTP comparison by its version(1.0/1.1/2.0/3.0)+basic TLS","url":"/portfolios/docs/CS/network/2022-01-08-network(2)/","summary":"Application Layer Various protocols exist in the application layer. Among them, HTTP is a widely used protocol, and today I will describe it in detail."}, {"date":"2021-12-29","title":"(EN) Network(1)
OSI 7 Layers","url":"/portfolios/docs/CS/network/2021-12-29-network(1)/","summary":"What is difference between OSI 7 Layers and TCP/IP 4 Layers? There are 7 layers of OSI and 4 layers of TCP/IP which suppport every protocol of computer."}, {"date":"2021-12-01","title":"악성코드 유형 별 대표 특성 추출 프로젝트","url":"/portfolios/docs/toy/toyp8/","summary":"해당 프로젝트는 국가연구과제 수행 중, 2015 Window malware dataset을 대상으로한 N-gram 기반 악성코드 패턴추출 프로젝트입니다."}, {"date":"2021-09-01","title":"새로운 블록체인 합의 알고리즘 설계","url":"/portfolios/docs/toy/toyp4/","summary":"해당 프로젝트는 석사 연구과정 중, 텀 프로젝트로 블록체인 합의알고리즘을 새롭게 설계한 프로젝트입니다."}, {"date":"2021-09-01","title":"파워쉘 악성 스크립트 탐지 프로젝트","url":"/portfolios/docs/toy/toyp2/","summary":"해당 프로젝트는 KISA에서 주최한 2021 사이버보안 AI빅테이터 경진대회의 본선에서 진행한 프로젝트입니다."}, {"date":"2021-05-12","title":"(English) Blowfish encryption","url":"/portfolios/docs/cypto/2021-05-12-bcrypt/","summary":"This is usually used for safely storing user's password into Database Blowfish encryption algorithm 전체 아키텍처 총 2가지 프로세스 진행."}, {"date":"2021-05-11","title":"(English) GCM(Galois Counter Mode) With GMAC","url":"/portfolios/docs/cypto/2021-05-11-gcm/","summary":"Basics Using ), we can handle only 128 bit of pain text. notation Pain Text - PT Cypher Text - CT Cypher Key - CK ECB(Electronic Code Block) PT1 PT2 ."}, {"date":"2021-04-12","title":"(English) TLS/SSL 암호화 과정","url":"/portfolios/docs/cypto/2021-04-12-ssl-tls/","summary":"Basics PRF를 통한 forward secrecy. Certificate를 통한 authentication. Encrypt ALPN(e.g. http/2) data Handshake/Record/. Layers Where is TLS?"}, {"date":"2021-04-05","title":"ChatGPT 에게 쿠버네티스를 물어보기","url":"/portfolios/docs/docker/kubernetes-4/","summary":"이 포스팅은 의식의 흐름대로 ChatGPT 에게 쿠버네티스를 물어보는 방식으로 작성되었어요. Kubernetes 의 전반적인 아키텍처 질문들 Kube-proxy 는 쿠버네티스 클러스터의 모든 노드에서 실행되는 프로세스입니다."}, {"date":"2021-04-02","title":"쿠버네티스 생명 주기","url":"/portfolios/docs/docker/kubernetes-3/","summary":"도서 : 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 쿠버네티스 생명 주기 유저는 kubectl 명령어를 통해 API 서버 파드 생성을 요청합니다 API 서버는 파드의 생성 요청을 etcd 에 기록합니다 컨트롤러 매니저는 API 서버를 감시하다가 새로운 파드 생성요청이..."}, {"date":"2021-03-19","title":"쿠버네티스를 이해하기 위해 필요한 사전 지식들","url":"/portfolios/docs/docker/kubernetes-2/","summary":"프로비저닝(Provisioning) 프로비저닝(Provisioning) 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요할 때 시스템을 사용할 수 있는 상태로 만들어 주는 기술입니다 가상 머신 프로비저닝 가상 머신을 생성하는 기술."}, {"date":"2021-03-10","title":"(English) AES(Advanced Encryption Standard) encryption","url":"/portfolios/docs/cypto/2021-03-10-aes/","summary":"AES has symmetric key, symmetric block cypher Key generation Round Key generation if we want to HWANGBO!HWANGBO!"}, {"date":"2021-02-19","title":"📌 쿠버네티스의 아키텍처 설명","url":"/portfolios/docs/docker/kubernetes/","summary":"Kubernetes 쿠버네티스는 docker-compose와 비슷한 역할을 수행합니다(서버의 자동재실행, 원격 핸들링, etc.). 차이점은 docker-compose는 single host 환경에서 수행되며, 쿠버네티스는 multi-host 환경에서 수행됩니다."}, {"date":"2021-01-29","title":"(KR) OS(7)
총정리","url":"/portfolios/docs/CS/os/2021-01-29-OS-7/","summary":"Process vs Thread In Concept 프로세스 : 디스크에 있는 프로그램이 실행되기 위하여 메모리에 올라왔을 때의 형태 스레드 : 프로세스의 실제 CPU 실행단위 In Structure 프로세스 : PCB(PID, State, PC, Register,..."}, {"date":"2021-01-28","title":"(EN) OS(6)
CPU Scheduling Algorithm","url":"/portfolios/docs/CS/os/2021-01-28-OS-6/","summary":"CPU scheduling algorithm CPU schedule CPU resouces to each threads with following algorithm from Ready Queue non-preemptive : doesn't stop Job FCFS :..."}, {"date":"2021-01-27","title":"(EN) OS(5)
Context Switch and Critical Section","url":"/portfolios/docs/CS/os/2021-01-27-OS-5/","summary":"What is Context Switch Context Switch : replace PCB inside the memory with other PCB."}, {"date":"2021-01-25","title":"(EN) OS(4)
Process and Thread","url":"/portfolios/docs/CS/os/2021-01-25-OS-4/","summary":"Difference in concept Process program that currently running when program in disk load on memory, it become process Thread basic unit of CPU to execute..."}, {"date":"2021-01-22","title":"(EN) OS(3)
Memory","url":"/portfolios/docs/CS/os/2021-01-22-OS-3/","summary":"This post is based on Unix v6 which is a root for current version of Linux {: ."}, {"date":"2021-01-20","title":"(EN) OS(2)
Types of Cache Mapping","url":"/portfolios/docs/CS/os/2021-01-20-OS-2/","summary":"Direct Mapping Advantage Fast as only tag field matching is required while searching for a word It is comparatively less expensive than associative..."}, {"date":"2021-01-18","title":"(EN) OS(1)
Computer Architecture and Cache","url":"/portfolios/docs/CS/os/2021-01-18-OS-1/","summary":"Computer Architecture CPU-CORE Register : Data storage that needed for CU and ALU PC (Program Counter) : store address which is next instruction set AC..."}, {"date":"2020-12-04","title":"(EN) Geth v1.8.x Architecture and Eclipse Attack","url":"/portfolios/docs/Blockchain/2020-12-04-ethereum-eclipse-attack2/","summary":"Countermeasures of Eclipse Attack in Geth v1.8.x In Geth v1.6."}, {"date":"2020-11-27","title":"(EN) Geth v1.6.6 Architecture and Eclipse Attack","url":"/portfolios/docs/Blockchain/2020-11-27-ethereum-eclipse-attack/","summary":"Analysis of Geth 1.6.6v's P2P network create UDP/TCP listener schedule 2 types of task(discoverTask, dialTask) seeding Ethereum nodes into Kademlia DHT..."}, {"date":"2020-06-01","title":"택시 주행 시뮬레이터 개발 및 분석결과","url":"/portfolios/docs/toy/toyp7/","summary":"해당 프로젝트는 학사 졸업과제입니다. 만약 택시에 동승이 가능하다면? 고객 수, 합승가능, 지도맵에 따라 가장 효율적인 택시의 수를 분석할 수 있습니다."}, {"date":"2020-01-01","title":"DB 관찰 툴 프로젝트","url":"/portfolios/docs/toy/toyp1/","summary":"해당 프로젝트는 Pulse 계절인턴 중, DB 관찰 툴 제작 프로젝트입니다. 참여인원 : 1인 프로젝트 기간 : 2020년 01월 2020년 02월(1개월) 나의 역할 📃 요구사항 분석 ✍️ DB 크롤링 제작 Github : 비공개 📃 요구사항 분석 사용자 데이터의..."}, {"date":"2019-04-01","title":"근처 맛집 추천 프로젝트","url":"/portfolios/docs/toy/toyp5/","summary":"해당 프로젝트는 학사 진행 중, 안드로이드 텀 프로젝트로 진행한 맛집 찾기 프로젝트입니다."} ]