[챗챗] MSA 전환기 - 3. 단일 모듈 프로젝트를 멀티 모듈로 바꾸자
·
챗챗
1. JPMS vs. Gradle/Maven 멀티 모듈module-info.java를 통해 설정하는 JPMS(Java Platform Module System)과 빌드 도구(gradle/maven) 기반 멀티 모듈이 있다. JPMS를 사용하는 경우 라이브러리가 automatic module로 취급되어 리스크가 있고, 한 단계 강력한 캡슐화 때문에 Spring이나 Hibernate 같은 라이브러리가 접근할 수 있게 일일이 열어줘야 하는 번거로움이 존재한다. [module-info.java 예시]module chatchats.api { requires spring.context; requires spring.boot; requires spring.boot.autoconfigure; r..
[챗챗] MSA 전환기 - 2. 모놀리식 아키텍처의 문제점과 해결 방안
·
챗챗
1. 기존 모놀리식 아키텍처의 문제점현재는 위와 같은 아키텍처에서 Spring 서비스 하나가 'API 서버'와 'SQS polling' 역할 모두 책임지고 있다. 모놀리식 아키텍처의 전형적인 단점을 정리하고 해당 단점이 내 프로젝트에서 어떻게 작용하고 있는지 자세히 살펴보겠다. 1. 서비스 하나의 장애가 서비스 전체에 영향을 끼친다.API 요청이 급증하여 리소스가 고갈되거나 DB에 쓰기 병목 등이 생기면, polling 서비스에도 문제가 생길 수 있다. 특히 내가 사용 중인 postgresql은 single-writer 구조이므로 모놀리식에선 쓰기 병목 해소가 쉽지 않다. 2. 각 서비스 유지보수의 어려움서비스간의 강결합이 유지보수의 난이도를 어렵게 만든다. 하나의 서비스를 수정했을 때 다른 서비스가 실..
[챗챗] MSA 전환기 - 1. 기존 아키텍처
·
챗챗
클라우드를 포기하고 온프레미스로 가자.챗챗은 인터넷 생방송 플랫폼(치지직)의 채팅 데이터를 수집해 제공하는 웹 서비스다. 생방송 채팅이라는 데이터는 실시간성이 중요하고, 바로 수집하지 않으면 그대로 데이터가 소실되기에... 개인 프로젝트라 할지라도 내 마음대로 서버를 올렸다 내렸다 할 수는 없었다. 게다가 나는 실제로 운영하면서 불특정다수의 트래픽을 경험해보고 싶었고, 따라서 해당 프로젝트의 가장 큰 문제는 서비스 유지비용이었다. 비용을 절약하기 위해 프론트/백/DB/Redis/모니터링/채팅수집기 등 필요한 요소를 전부 하나의 서버에 때려박는다고 가정하고 계산해도 월별 총비용이 214.86달러(32만 2천원)가 나왔다. 결국 나는 내가 거주하고 있는 곳에 홈서버를 구축하기로 결정했다. DRAM과 SSD ..
트랜잭션 격리 수준에 따른 문제 상황, 그리고 해결책
·
데이터베이스
트랜잭션 격리 수준과 ACIDACID 원칙 중에 I는 격리성이다. A(원자성), C(일관성), D(지속성)는 절대 지켜져야 하는 성질이지만, 격리성의 경우 상황에 따라 조절할 수 있다. 격리성에서 문제가 생기면 원자성과 지속성을 통해 rollback하여 일관성을 지킨다. 격리 수준에는 다음과 같이 총 4가지 단계가 있다. 갈수록 격리 수준은 낮아지고 대신 동시성이 높아진다.Serializable - Repeatable Read - Read Committed - Read UncommittedMySQL의 기본값은 Reapeatable Read, 오라클과 PostgreSQL의 기본값은 Read Committed다. - Read Uncommitted말 그대로 커밋되지 않은 데이터를 읽을 수 있다.커밋되지 않은 ..
Redis 에러: Creating Server TCP listening socket *:6379: bind: No error
·
기타
윈도우 10에서 redis-server.exe를 실행했을 때 Creating Server TCP listening socket *:6379: bind: No error 에러 메시지가 뜰 수 있다. netstat -ano | findstr 6379 로 해당 포트가 사용 중인지 확인해봤으나 나의 경우, 6379번 포트는 사용 중이 아니었다. 원인은 윈도우가 6379 포트를 미리 예약해 두었기 때문이다.powershell에서 netsh int ipv4 show excludedportrange protocol=tcp 로 예약된 포트 범위를 확인할 수 있다.나의 경우 다음과 같이 6379 포트가 예약되어 있었다. 따라서 예약을 해제하거나, redis를 다른 포트로 열면 된다.
[React] 리액트 초기 환경 세팅하기
·
React
node 프로젝트를 생성(npm init)하고 기본적인 라이브러리들을 설치한다. npm i react @types/react npm i react-dom @types/react-dom npm i typescript npm i -D prettier eslint-plugin-prettier eslint-config-prettier ESLint와 prettier도 설치해주면 좋다. 사실 VSCode를 쓴다면 extensions만 설치해도 에디터가 다 잡아주기 때문에 node 모듈까지 굳이 설치할 필요는 없는 것 같다. 착각하기 쉬운데, 저장을 눌렀을 때 코드가 자동으로 정렬되고, 잘못된 코드에 밑줄이 그어지는 건 npm으로 설치하는 eslint와 prettier가 하는 게 아니다. 그건 vscode가 지원하는..
[프로그래머스] H-index
·
문제풀이
문제: https://programmers.co.kr/learn/courses/30/lessons/42747 코딩테스트 연습 - H-Index H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표 programmers.co.kr 문제를 조건을 그대로 따라가면서 풀었다. isValid 함수는 넘어온 h값이 h-index의 후보가 될 수 있는지를 true false로 리턴한다. solution 함수에서는 0부터 999까지를 h에 넣어보며 h의 최댓값을 구한다 (문제 조건에 따라 h는 0이상 1000이하이다.) 지금보니 range를 1000이 아니라 l..
[프로그래머스] 가장 큰 수
·
문제풀이
문제: https://programmers.co.kr/learn/courses/30/lessons/42746 코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 programmers.co.kr 맨 처음 직관적으로 드는 생각: 주어진 숫자로 가장 큰 수를 만드려면, 주어진 숫자들을 내림차순으로 정렬하면 되지 않을까? ex) 1, 3, 9 가 주어졌을 때 가장 큰 수는 931 하지만 숫자들이 일의 자리를 넘어가게 되면 문제가 생긴다. ex) 1, 3, 10 이 주어졌을 때 가장 큰 수..
[프로그래머스] 이중 우선순위 큐
·
문제풀이
문제: https://programmers.co.kr/learn/courses/30/lessons/42628 코딩테스트 연습 - 이중우선순위큐 programmers.co.kr max heap queue와 min heap queue를 만들고 operation에 맞게 업데이트해주면 된다. max heap queue에서 pop하는 경우, 데이터 동기화를 위해 min heap queue도 같이 pop해줘야 하는데, 그냥 remove로 삭제했다. 이렇게 해보고 혹시 성능상의 이슈가 있으면 탐색하는 부분을 따로 구현하려고 했는데 큰 문제는 없어보인다. + 생각해보니 max heap에서 최솟값은 리프노드에 있으므로 remove 연산 후 heapify를 해주지 않아도 된다.
Stackoverflow는 사랑입니다.
·
기타
https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument "Least Astonishment" and the Mutable Default Argument Anyone tinkering with Python long enough has been bitten (or torn to pieces) by the following issue: def foo(a=[]): a.append(5) return a Python novices would expect this function to always stackoverflow.com https://stackoverflow.com/questions/36842..
[프로그래머스] 기능개발
·
문제풀이
문제: https://programmers.co.kr/learn/courses/30/lessons/42586 코딩테스트 연습 - 기능개발 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 programmers.co.kr 1. 작업해야하는 day 계산 2. 모든 작업에 day * speed 더함 3. 완료된 작업의 개수 n 계산 4. n개 pop 5. answer에 n 추가 반복조건: progresses가 비어있지 않음
[프로그래머스] 더 맵게
·
문제풀이
문제: https://programmers.co.kr/learn/courses/30/lessons/42626 코딩테스트 연습 - 더 맵게 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같 programmers.co.kr 힙으로 만들고 2개씩 pop 해서 mix 한 뒤 push 하는 걸 반복한다. 반복조건: 힙의 루트노드가 K 미만인 경우 예외: 더이상 섞을 수 없는 경우 => return -1
[Pylance] Import could not be resolved from source (reportMissingModuleSource)
·
Python
가상환경을 사용하는 경우 pylance가 가상환경에 설치된 모듈을 잡지 못해 발생하는 에러다. 실행은 잘 되기 때문에 무시해도 되지만, 자동완성이 안된다거나 노란색 밑줄이 거슬리는 문제가 있다. 해결법은 직접 모듈의 경로를 추가해주면 된다. 워크스페이스의 .vscode 폴더에 settings.json 파일을 위와 같이 작성해주면 에러가 사라진다. 가끔 settings.json 파일을 인식하지 못할 떄가 있는데, 그럴 때는 settings.json 파일을 .vscode 폴더 밖으로 옮겼다가 다시 원상복구 해주면 인식이 된다.
파이썬 closure
·
Python
inner 함수 안에서의 count 변수는 상위 스코프의 count 변수를 참조한다. 하지만 이렇게 count += 1 을 추가해주면 오류가 발생한다. 왜 이 경우에는 상위 스코프의 count 변수를 참조할 수 없는 걸까? count += 1이 count = count + 1 과 같은 코드라는 걸 생각해보면 납득할만한 결과이다. count를 대입연산자를 이용해 정의하면 로컬 변수가 만들어지는데, 그 로컬 변수를 만들 때 count 값을 사용하기 때문..
[React] 왜 key는 list에서만 필요할까? 왜 index를 key로 사용하면 안되는 걸까?
·
React
1 1 1 {[1, 1, 1].map(v => {v})} 위의 두 코드는 서로 같은 결과는 내는데, 아래의 코드는 react에서 경고를 뿜어낸다. 각 element가 고유한 key값을 가져야 한다는 것. 이 key를 넘겨줘야 하는 이유는 list의 각 요소에 대해 react에서 key를 임의로 부여하기 어렵기 때문이다. {[1, 1].map(v => {v})} 이 코드를 보자. 요소가 3개에서 2개로 줄었는데, 첫 번째가 사라진건지, 중간에 있던 게 사라진건지, 아니면 마지막 요소가 사라진건지 리액트 입장에서는 알 수 없다. 따라서 개발자가 정해줘야 하는 것이다. {[1, 1, 1].map((v, index) => {v})} 그렇다고 이렇게 index로 정해주면 안된다. 첫 번째 요소가 삭제되어도, 두 ..