본문 바로가기

프로젝트

(43)
이벤트 기반으로 책임 분리 확장성 있는 코드 확장성 이라는 개념에는 여러가지 요소가 있다. 기능의 확장 저장소의 확장 서버의 확장 기능의 확장 예를 들어 회원가입을 하면 회원가입 쿠폰을 뿌린다거나, 회원가입 쿠폰을 뿌리는 이벤트를 종료하는 상황이 있을 것이다. 저장소의 확장 데이터가 너무나도 많이 쌓여 RDB가 아닌 NoSQL로 저장소를 변경하는 상황이 발생하거나, 읽기 성능을 최적화 하기 위해 별도의 저장소를 사용하는 상황이 발생할 수 있을 것이다. 서버의 확장 특정 도메인에 사용자가 과도하게 몰려 도메인 별로 트래픽을 분산해야 하는 상황이 발생할 수 있을 것이다. 앞선 상황 이외에도 확장이라는 개념에는 또 다른 요소가 있을 수 있겠지만 나는 코딩을 할 때 위 3가지의 상황을 과하지 않게 예측하고 코드를 작성하려고 노력한다. (..
테이블 설계 글의 목적 테이블을 설계하는 것은 무척이나 어렵다. 복잡하고 동적인 현실 세계의 관계를 정적인 구조로 만드는 일은 수 많은 상황을 예측해야 하는 일이다. 테이블을 설계하며 한 고민의 과정을 정리함으로써 다음에는 좀 더 나은 생각을 할 수 있도록 글을 작성한다. 캐치 테이블의 테이블 구조 가장 크게 한 고민은 어떠한 요소를 필드로 둘지, 테이블로 둘지 두 결정 사이의 장단점을 비교하며 설계 당시에는 가장 나은 선택을 했다. 테이블을 설계할 때 가장 중요하게 여긴 가치 확장 (기능의 확장) 코드로 구현했을 때의 모습 (도메인을 분리해 다른 어플리케이션으로 작동할 수 있을지) 특이사항으로 실제 캐치테이블에서는 지원하지 않는 매장 내 테이블을 지정하여 예약을 하는 기능을 추가했다. (진짜 어려웠음) 복잡한 구조..
주문 코드 리팩토링 최근 우아한 객체지향, KSUG 채널의 스프링캠프 2023 [Session 3] 대규모 엔터프라이즈 시스템 개선 경험기를 보고난 뒤 많은 영감이 떠올라 가장 최근에 했던 프로젝트를 리팩토링 했다. 사실 리팩토링 이라기 보다는 코드를 다시 작성했다고 보는 것이 맞는 것 같다. 사람마다 생각이 다르고 시스템마다 요구사항, 환경이 다르기 때문에 지금의 코드를 작성하면서 한 생각은 어떤 코드에서는 좋지 못할수도 있다. 그럼에도 나는 유지 보수성을 목표로 코드를 작성했다. 여기서 말한 유지 보수성이란 두려움 없이, 주저함 없이, 저항감 없이 코드를 변경할 수 있는 능력을 의미한다. 위 문구는 조영호님의 말로, 유지보수의 본질을 가장 명확하게 설명하고 있으며, 나의 마음에 가장 와닿았다. 자, 이제 코드를 개선해보..
OpenFeign 적용기 최근 WebClient를 잘못 사용하고 있다는 것을 깨닫고 기존의 코드를 Open Feign으로 리팩토링을 하려고 했다. RestTemplate도 있지만 코드가 지저분해지기 때문에 OpenFeign을 이용했다. Feign Feign이란 인터페이스와 어노테이션 만으로 웹 서비스 호출을 쉽게 만든 Netflix에서 만든 기술이다. Spring Cloud Netflix Spring Cloud는 마이크로서비스 아키텍처를 구축하는데 필요한 도구 모음이다. 이 도구들은 분산 시스템에서 발생할 수 있는 여러 복잡한 문제를 해결하도록 설계되었습니다. Netflix는 이러한 마이크로서비스 문제를 해결하기 위해 여러 오픈 소스 소프트웨어(OSS)를 개발하고 공개했다. 이 중에서 Feign은 그 사용법이 간단하고, HTTP..
elasticsearch에 형태소 분석기 적용하기 앞으로 elasticsearch를 이용할 때 유용할 것 같아 형태소 분석기 적용 과정을 정리하고자 한다. 형태소 분석기란 여기 "나는 김치를 좋아한다" 라는 문장이 있다. elasticsearch에서 김치를 포함하는 문장을 검색한다면, 검색 결과가 나오지 않는다. elasticsearch는 영어 외의 like 검색을 띄워쓰기 단위로 하기 때문이다. 따라서 "김치를" 까지 검색을 해야 해당하는 문장이 검색된다. 이러한 상황에서 형태소 분석기를 이용하면 형태소 단위로 검색이 가능하다. 적용하기 1. 먼저 현재 elasticsearch가 설치된 경로에 형태소 분석기를 설치한다. elasticserch에서 지원하는 대표적인 형태소 분석기인 nori를 설치했다. $ bin/elasticsearch-plugin i..
Slack Webhook API 사용법 서비스를 제공하다보면 예상치 못한 오류가 발생할 수 있고 개발자는 어떤 오류가 어디서 발생했는지 알아야 더욱 좋은 서비스를 제공할 수 있다. 보편적으로 slack을 많이 이용할텐데 앞으로도 slack을 이용해 에러 메시지를 받는 것을 자주 이용할 것 같아서 이용법을 정리한다. 1. Slack app을 만든다. https://api.slack.com/messaging/webhooks Sending messages using Incoming Webhooks Creating an Incoming Webhook gives you a unique URL to which you send a JSON payload with the message text and some options. api.slack.com 위 링..
Elasticsearch 쿼리빌더로 리팩토링 글을 쓰게 된 이유 이번에 한 리팩토링은 객체지향의 특징을 잘 살렸다고 생각이 들었다. 이후 엘라스틱 서치 뿐만 아니라 다음에 코드를 작성할 때 또한 도움이 될 것이라 생각이 들어 기록을 남기고자 한다. 잠깐의 필수 지식 본문에 들어가기에 앞서 글의 주제와는 다소 벗어나지만 글의 이해를 위해 꼭 알고 있어야 할 사항이 있다. 자바의 인터페이스 메커니즘과 스프링 데이터를 상속받은 인터페이스의 메커니즘을 정확하게 이해해야한다. 자바에서는 일반적으로 new 키워드를 통해 인터페이스를 사용하지 못하고 구현체를 생성해서 인터페이스를 사용해야 한다. 예를들어 다음의 코드가 있다. interface test extends test2, test3{ } interface test2 { void method2(); } c..
CQRS패턴 도입 이야기: 프로젝트에 Kafka 적용하기 지난 글에서 Kafka의 기본의 되는 개념을 공부했다. 이제 프로젝트에서 적용해보자. 1. 카프카, 주키퍼 서버 실행 다음과 같이 docker-compose 파일 작성 후 docker-compose up -d 명령어로 kafka 서버를 실행한다. (각 요소가 무엇인지 알고 싶고 또 다른 설정을 하고 싶다면 다음의 링크 참고 https://www.baeldung.com/ops/kafka-docker-setup) version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka ports: - "9092:9092" environment: KAFKA_ADVERTISE..