728x90
반응형
SMALL

분류 전체보기 84

Kafka Outbox 패턴으로 비동기 이벤트 발행하기

비동기 처리 방식을 공부하면서 Kafka 통신 흐름을 로그를 통해 확인하면서동작 원리를 파악하는 과정에서 깨달음을 얻어 게시글을 작성합니다!Kafka 를 처음 사용하면서 저는 Kafka 로 이벤트를 발행할 때 이게 언제, 어디서, 어떤 흐름으로 실행되는건지 헷갈렸습니다.특히 Outbox 패턴을 적용하면 Kafka 발행 로직이 Controller 와 분리되기 때문에요청이 끝났음에도 Kafka 가 동작하는 것을 알 수 있는데요 이를 기반으로 아래 내용들을 정리해보겠습니다!HTTP 요청 처리 흐름Filter / Interceptor / Service의 역할Kafka Outbox 발행이 Controller와 분리되는 이유로그로 Kafka 통신을 확인하는 방법실무에서는 Outbox를 어떻게 활용하는지 1. 전체 ..

비동기 처리란 무엇인가?(MQ / Kafka)

백엔드 개발을 하다 보면 이런 말을 자주 듣는다.“이건 비동기로 처리해야 해요”“Kafka로 이벤트 흘리면 됩니다”“MQ로 분리하세요”그런데 막상 물어보면👉 왜 비동기가 필요한지,👉 동기/비동기가 실제로 뭐가 다른지,👉 MQ와 Kafka가 왜 등장했는지명확하게 설명하기는 쉽지 않다.이 글에서는 아무 배경지식 없는 상태에서도 이해할 수 있도록비동기 처리의 등장 배경부터 차근차근 설명해보겠습니다!1. 우리가 처음 만드는 시스템은 전부 “동기 처리”다대부분의 웹 서비스는 이렇게 시작한다.클라이언트 요청 → 서버 처리 → 응답 이를 동기(Synchronous) 처리라고 한다. 예시: 주문 API주문 요청 → 결제 처리 → 재고 차감 → 주문 저장 → 알림 발송 → 응답 이 구조는 이해하기 쉽고, 구현도 단..

PostgreSQL 이중화 환경에서 성능 이슈 해결 하기

이전에 PostgreSQL HA 환경에서 장애가 발생했을 때, 이중화 환경 구성 중 Primary / Primary(P,P) 상태로 전환되며 성능 이슈가 발생한 경험을 공유합니다!이번 사례는 repmgr 기반 Streaming Replication 환경에서 발생하였으며, 최종적으로 repmgr clone 을 통해 정상적으로 북구했습니다. 1️⃣ 문제 상황운영 중이던 PostgreSQL HA 환경은 아래와 같은 구조였습니다.● Primary DB- Read / Write 모두 처리 ● Standby DB- Read 전용 처리 각각 두개의 DB 는 repmgr 기반 Streaming Replication 구성으로 되어있습니다.해당 환경은 PostgreSQL HA(High Availability) 구성을 ..

개발지식/DB 2026.01.16

[DB] PostgreSQL 이란 무엇인가?!

안녕하세요!오늘은 데이터베이스 업계의 '오픈소스 끝판왕'이라 불리는 PostgreSQL에 대해 깊이 있게 알아보려 합니다.제가 현재 다니고 있는 회사에서도 PostgreSQL 을 사용하는 중인데 여러가지 장점들이 소개하고자 게시글을 작성하게 되었습니다!단순히 유행이라서가 아니라, 왜 수많은 기업이 기존의 Oracle을 떠나 Postgres로 향하는지 그 이유를 명확히 짚어보겠습니다.1. PostgreSQL이란 무엇인가?PostgreSQL은 전통적인 관계형 DB(RDBMS)를 기반으로 하면서, 사용자 정의 타입·함수·확장 모듈을 지원하는 객체-관계형(ORDBMS) 특성을 함께 갖고 있습니다. 30년 이상의 역사를 가진 만큼 매우 안정적이며, 오픈소스임에도 불구하고 상용 DB인 Oracle에 버금가는 강력한..

개발지식/DB 2025.12.30

전략 패턴 + AOP로 정책 로직을 분리한 설계

솔루션 관련 게시글들을 찾아보다가 흥미로운 방식으로 문제를 해결한 내용을 찾아서 블로그 게시글로 정리해서 올려봅니다!1. 문제업무 시스템에서는 많은 파일들이 생성되고 엑셀, PDF, 정산 리포트, 통계 자료 등 다양한 산출물들이 매일같이 만들어지고 내려지는데요. 이런 파일들의 대부분은 보안 대상으로 취급됩니다.그렇기에 많은 시스템이 특정 보안 솔루션을 통해 파일을 암호화하거나 보호하게 됩니다. 하지만 보안 정책이 변경되는 순간부터 기존 방식의 수정해야될 부분들이 많아지는데요기존에는 설치형(에이전트 기반) 보안 솔루션을 사용하고 있지만 신규 클라우드 기반 보안 솔루션이 도입되었지만,모든 사용자들에게 동일한 보안 방식을 적용시킬 수 없었고 결국 하이브리드 상황을 맞이하게 됩니다. 특정 권한 - 신규 보안 방..

🐳Dockerfile 빌드 최적화하기 - BuildKit, Multi-Stage

안녕하세요~ 이번에는 제가 Dockerfile 을 사용할 때 노가다를 해보면서 얻은 빌드 전략과 방식에 대해서 소개해드리겠습니다!먼저 Dockerfile 이란 빌드 자동화 도구이자 CI/CD 핵심 구성 요소 역할을 합니다.프로젝트가 커지고 빌드 대상이 많이질수록 Dockerfile 구조, 빌드 방식, 캐시 전략은 성능과 유지보수에 큰 영향을 줍니다. 이 글에서는 Dockerfile 을 효율적으로 작성하는 방법, 그리고 BuildKit 기반 고속 빌드 전략과 에러 이후 재빌드가 어떻게 동작하는지 까지 제가 실제로 겪었던 고충을 해결하는 방법을 정리하였습니다 📌 1. Dockerfile 빌드 구조의 기본 개념Dockerfile은 위에서 아래로 순차적으로 실행되며, 각 명령은 레이어(layer)를 형성합니다..

개발지식/Docker 2025.11.26

🌿 Spring Data JPA – 반환 타입 정리

JPA를 사용하다 보면 같은 조건으로 조회하는데도 반환 타입에 따라 동작 방식이 달라지는 경우가 있습니다.특히 List, 단일 엔티티 반환(Member), 그리고 Optional 는 반환 결과가 완전히 다르기 때문에 정확히 이해하고 사용하는 것이 중요합니다.이번 글에서는 반환 타입의 차이를 코드와 함께 정리해보겠습니다.✔️ 1. 테스트 코드로 살펴보는 반환 결과@Testpublic void returnType(){ Member m1 = new Member("AAA", 10); Member m2 = new Member("AAA", 20); memberRepository.save(m1); memberRepository.save(m2); List aaa = memberReposito..

📚 Spring Data JPA Repository 제대로 써보기

효율적인 데이터 접근 계층 설계하기Spring Data JPA는 JPA 기반 데이터 접근을 한층 더 단순하고 일관성 있게 만들어주는 추상화 레이어입니다.Repository 인터페이스 선언만으로 CRUD, 페이징, 정렬, 동적 조회를 자연스럽게 처리할 수 있으며, 필요에 따라 명시적인 JPQL / QueryDSL / 네이티브 쿼리로 확장 또한 가능합니다.해당 글에서는 Repository 정의 방법, 메소드 이름 기반 쿼리, @Query 활용, DTO 조회, 파라미터 바인딩, 테스트 작성 방식을 중심으로 정리합니다.1. Repository 기본 구조기본 Repository는 JpaRepository를 상속하여 정의합니다.public interface MemberRepository extends JpaRepo..

CentOS 7 버전 yum 에러 빠른 해결! (EOL 문제 해결)

여기 게시글을 찾은 사람들은 yum 을 사용할 때 위 오류를 보고 들어왔을 것으로 추측됩니다... CentOS 7 은 2024 년 6월을 끝으로 공식 지원이 종료되었기 때문에 기존의 mirrorlist 를 통해 패키지를 내려받는 방식이 더이상 동작하지 않게 되어버렸습니다. 그렇기 때문에 이 때는 CentOS 저장소를 재설정하여 패키지를 설치할 수 있습니다! 1. 기존 Repo 백업 먼저 기존 저장소 설정 파일들을 백업해 둡니다.# yum.repos.d 디렉토리로 이동cd /etc/yum.repos.d# 기존 repo 파일들을 저장할 backup 디렉토리 생성mkdir backup# 기존 repo 파일들 백업mv *.repo backup/ 2. 새 Repo 파일 적용직접 CentOS 저장소를 재설정합니..

개발지식/OS 2025.09.30

Kotlin 기본 구조(예시 코드)

JAVA 를 베이스로 한 코틀린을 예시코드 통해 학습 해봅시다! ● 클래스 다형성콜라 인스턴스를 음료 인스턴스에 담는 행위를 상위 자료형인 수퍼클래스로 변환한다고 하여 Up-CastingUp-Casting을 다시 하위 자료형으로 변환하면 Down-Castingfun main() { var a = Drink() a.drink() // 콜라 인스턴스를 음료 인스턴스에 담는 행위를 // 상위 자료형인 수퍼클래스로 변환한다고 하여 // Up-Casting 이라고 함! var b : Drink = Cola() b.drink() // Up-Casting을 다시 하위 자료형으로 변환하면 Down-Casting 이라고 함 // is 는 호환되는 자료형을..

728x90
반응형
LIST