| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- PS
- C++
- 레이어드 아키텍처
- CDC
- K8S
- debezium
- 개발
- OpenAI
- 자바
- 클린 아키텍처
- 김영한
- 배치
- 톰 홀버그
- 백준
- Spring
- 헥사고날 아키텍처
- 스프링
- outbox
- Kafka
- 로버트 C. 마틴
- 프로젝트
- API
- 로버트마틴
- vm
- boj
- MSA
- 엉클 밥
- JPA
- chatGPT
- EDA
- Today
- Total
목록Development (12)
코딩 해파리
- 왜 '정확히 한 번'이 중요한가요?분산 메시징 시스템에서는 네트워크 장애나 애플리케이션 재시작으로 인해 데이터가 중복 처리될 위험이 항상 존재합니다. 예를 들어, 결제 시스템에서 중복 처리된 메시지는 사용자에게 이중 과금을 유발할 수 있습니다. '정확히 한 번' 보장은 이러한 문제를 원천적으로 방지하여 데이터 정합성을 유지하는 핵심 기술입니다.1️⃣ 멱등적 프로듀서 (Idempotent Producer)멱등적 프로듀서는 프로듀서의 재시도 과정에서 발생할 수 있는 메시지 중복을 방지하는 기능입니다.멱등성(Idempotence)이란?동일한 연산을 여러 번 수행하더라도, 단 한 번 수행한 것과 동일한 결과를 내는 특성을 의미합니다.멱등성이 아닌 연산: UPDATE count = count + 1 (호출할 ..
인스턴스 생성 방식에는 크게 4가지가 있을 것 같습니다.자바 기준으로 설명을 드리겠습니다!그냥 new를 사용정적팩토리 메서드를 이용Builder 패턴을 이용기본 생성자 + Setter1. 생성자 호출 (new 키워드)User user = new User("Haepal", 27);언제 쓰나?필수값이 명확하고 객체 상태를 명확히 유지하고 싶을 때필드 개수가 적고 단순한 객체일 때 가장 심플불변(Immutable) 객체 생성 시 간편하고 명확함문제점생성자에 인자가 많으면 가독성 급감 (예: new User(a,b,c,d,e,f,g,h) ← 보기 어려움) - 근데 사실 요즘 IDE가 매우매우 좋아서 파라미터명 힌트를 줘서… 가독성도 낫배드…선택적 필드 처리에 취약 (null 남발 가능)결론: 필수 필드가 소수이..
디테일하게 더 알고싶다는... 욕심으로...카프카 핵심 가이드라는 책을 읽고 공부하며 정리하기 위해 이 카테고리를 만들었습니다..!그럼 시작하겠습니다!데이터 중심 시대, 왜 카프카(Kafka) 인가?📌 본질은 결국 데이터다기업은 끊임없이 데이터를 수집하고, 분석하고, 이를 기반으로 가치를 창출합니다.이 과정에서 중요한 데이터를 필요한 곳에 빠르게 전달하는 능력이 필수적입니다."과학자들이 의견 차이가 생기는 이유는 오직 데이터가 부족하기 때문이다. 충분한 데이터를 얻으면 문제는 해결된다." — 닐 디그래스 타이슨그래서 우리는 데이터를 빠르고 안정적으로 전달하는 기술, 즉 데이터 파이프라인을 구축하고자 합니다.📌 발행/구독 (Pub/Sub) 메시지 전달 방식이란?Pub/Sub 패턴이란?메시지를 보내는 쪽..
(2장) 의존성 역전하기1. 단일 책임 원칙(SRP)이 원칙의 일반적인 해석은 다음과 같습니다.‘하나의 컴포넌트는 오로지 한 가지 일만 해야 하고, 그것을 올바르게 수행해야 한다.’ 이는 좋은 조언이지만, 단일 책임 원칙의 실제 의도는 아니라고 필자는 말합니다.‘오로지 한 가지 일만 하는 것’은 단일 책임이라는 말을 가장 직관적으로 해석했지만, 실제 정의는 다음과 같습니다. ‘컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.’ 여기서 강조하는 부분은 ‘책임’이란 사실 ‘오로지 한 가지 일만 하는 것’ 보다는 ‘변경할 이유’로 해석해야 한다는 것입니다!아키텍처에서는 이것이 어떤 의미일까요?만약 컴포넌트를 변경할 이유가 한 가지라면 우리가 어떤 다른 이유로 소프트웨어를 변경하더라도, 여전히 이 컴포넌트는 ..
[만들면서 배우는 클린 아키텍처 - 톰 홀버그]라는 책을 읽으며 정리한 글입니다!졸업 프로젝트에서 헥사고날 아키텍처를 적용하면서 코드를 작성하려고 노력했지만, 부족한 지점들이 많은 것 같아서... 공부하기 위해... 이 책을 조금 더 열심히 파보고 정리해보려 합니다..!시작하며헥사고날 아키텍처 먼저 약간 알아보자면, 애플리케이션은 비즈니스 관심사를 다루는 내부(inside)와 기술적인 관심사를 다루는 외부(outside)로 분해됩니다. 여기서 외부에 포함된 기술적인 컴포넌트를 어댑터(adapter)라 부르고, 어댑터가 내부와 상호작용하는 접점을 포트(port)라고 부릅니다. 헥사고날 아키텍처 패턴을 포트와 어댑터 패턴이라고도 부르는 이유가 바로 이 때문입니다.[도메인 주도 설계 - 에릭 에반스]에서 “도..
언어: javaSpring Boot ver: 3.3.4IDE: intelliJSDK: JDK 21의존성 관리툴: GradleMac 안녕하세요!이번에 작성할 내용은 이미 개발한 스프링 부트 기반 프로젝트를어떻게 하면 간단하게 AWS사의 EC2, Google사의 VM인스턴스 등등의 가상머신에 띄울 수 있을지에 대한 방법입니다!분명 여러가지 방법이 있습니다..! AWS사 혹은 GCP(Google)사의 관리형 프로그램을 사용하여 배포하는 방법JAR 파일을 직접 전송해서 가상머신에서 실행하는 방법스프링부트 프로젝트를 도커(Docker) 이미지로 만들고 푸쉬(push)하고, 가상 머신에서 그 이미지를 풀(pull) 해서 실행하는 방법 - Docker Hub, GHCR(GitHub Container Registry)..
오늘은 실제로 서비스를 마무리하고!요청도 보내고!답변도 받아볼게요! 저번에 작성하지 않은 config 클래스와 service, controller에 대해 작성을 해볼게요! 1. OpenAiConfigimport org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.MediaType;import org.springframework.web.client.RestTemplate;@Configurationpublic clas..
클래스 작성을 시작해 보자! 이번에 알려드릴 Open AI 쪽에 요청을 보내기 위한 Request 구조와요청에 대한 답을 받기 위한 Response 구조의 아주 간략화된 DTO 클래스 구조를 작성할 겁니다! 일단,https://platform.openai.com/docs/api-reference/chat이 API Reference를 보면 Request 쪽과 Response 쪽에 구조를 보면,,,뭐가 너~~~ 무 많습니다... 그러니까, 오늘은 모든 기능과 모든 상황을 처리할 수 있는범용성이 높은 클래스 구조를 작성하기보다는처음 입문하는 느낌으로다가 messages에 User Message만 담아서 보내보도록 할게요!그리고 "Required"만 사용하면 보낼 수는 있으니까, 이것들만 작성을 해보겠습니다! ..
스프링 환경에서 ChatGPT-4o에 이미지 분석을 맡기는 방법을 알아봅시다~!(블로그 어디를 뒤져봐도... 이걸 해본 사람이 없는 것 같아서 작성합니다...) 이번 이미지 분석 요청하는 환경은 다음과 같습니다! 다들 이미 아는 내용이시겠지만, 이번 ChatGPT-4o 모델 API 가격과 속도... 말이 안 됩니다...그렇기에 가볍게 텍스트 질문을 요청하여 답변을 받거나, 이미지 분석을 맡기거나, 음성 파일을 보내는 등의 일을 활용하여서비스를 개발하는 일이 개발자로서는 매우 매우 매력적으로 다가오리라 생각이 듭니다!그렇기에 이미지 분석을 통한 서비스 개발을 목적으로 프로젝트를 시작하려는데....왜 아무도 스프링으로 ChatGPT API로 이미지를 보내질 않... 공식 문서에도 안 나와 있구...하지만, ..
스프링(서버)에서 응답 데이터를 만드는 방법은 3가지 정도가 있습니다. 1. 정적 리소스 -> 웹 브라우저에 정적인 상태의 HTML, CSS, JS를 제공하는 것입니다. 간단한 예를 들자면... 웰컴 페이지가 있겠네요! 스프링 부트에서는 '/static', '/public', 'resources', '/META-INF/resources' 디렉토리에 있는 정적 리소스를 제공합니다! 'src/main/resources'는 리소스를 보관하는 곳이고, 클래스패스의 시작 경로입니다. 그러므로, 'src/main/resources/static' 디렉토리에 리소스를 넣으면 스프링 부트는 정적 리소스로 서비스를 제공하게 되는것이죠! 2. 뷰 템플릿 -> 뷰 템플릿을 거쳐서 HTML을 생성하고, 뷰가 응답을 만들어서 웹..