목록TIL (46)
정글에서 온 개발자
동시성은 여러가지를 한 번에 다루는 것이지만, 병렬성은 여러 가지 일을 동시에 하는 것 - 롭 파이크동시성(Concurrent)여러 작업을 시작, 실행, 완료하는 과정이 서로 중첩된 시간에서 특별히 정해진 순서 없이 일어나는 것병렬성(Parallel)여러 작업을 여러 컴퓨팅 자원을 이용해 병렬로 동시에 실행하는 것 (여기서 '동시'라는 단어가 들어가서 헷갈릴 수 있지만, 핵심은 코어를 동시에 돌리는 것이다.)상황동시적이며 병렬적요리사 두명이, 한명은 썰고, 한명은 젓기를 함동시적이지만, 병렬적이지 않음싱글 코어로 스케줄링 된 프로세스들이 실행됨병렬적이지만, 동시적이지 않음단일 작업의 하위 작업 여러개를 동시에 처리ex) 분할정복 전략에서, 단순이 같은 작업을 여러 코어에서 동시에 실행함.참고그로킹 동시..
서브 쿼리조인은 집합간의 곱 관계라, M:N 관계의 테이블을 조인하면 MN 레벨의 집합이 결과로 생성된다.서브 쿼리는 서브 쿼리 레벨과는 상관없이 항상 메인 쿼리 레벨로 결과 집합이 생성된다.결과 집합을 잘보고 서브 쿼리를 써야 할 때 조인을 쓰지 않도록 하자 (DISTINCT로 결과를 원하는대로 낼 수 있지만 비효율적종류동작 방식 :비연관(un-correlated) 서브쿼리, 연관(correlated) 서브 쿼리반환데이터 형태 : Single Row 서브 쿼리, Multi Row 서브 쿼리, Multi Column 서브 쿼리위치에 따라 : 조건절, Select 절 (스칼라 서브 쿼리), From절 (인라인 뷰), Having 절서브쿼리의 논리적 실행 순서는 항생 메인 쿼리에서 데이터 읽음 -> 서브 ..

계기기존에 네트워크 지식이 없을 때는 certbot을 이용하면서도 내가 만들어놓은 WAS가 80 번을 listen하게 한 상태로 nginx-proxy 도커를 설치해서 proxy를 해왔다. 나중에는 갱신까지 포함된 docker를 쓰면서 신세계라고 생각하기도 했다.Go로 짠 프로그램으로 Nginx, Apache 같은 Web Server를 대체할 수도 있다는 사실을 알게 된 뒤로는 (사실 같은 원리로 node.js로도 이런 설정을 할 수 있지만 느릴 수 있다.) 굳이 Nginx를 안 써도 되겠다는 생각이 들었다.마침 이번에 아버지 홈페이지를 만들어드리면서 '주의 요함' 이 뜨길래 이를 해결하고자 도전해 봤다.배경 지식HTTPS암호화 통신을 시작하기 위한 public key가 필요하고, 이 public key에..
x.y.z 형식으로 되어 순서대로 major.minor.patch 를 의미한다.Major하위 호환이 안 될 수도 있는 기능의 변경이다. 예를 들어 python2로 작성한 코드는 python3에서 실행이 제대로 안 될 수 있고, Angular18로 작성한 코드는 Angular19에서 안 될 수 있다.deprecated로 경고하던 기능들이 이 때 사라질 가능성이 있다.Minor하위 호환은 가능한 변경이다. minor 버저닝을 잘지키는 정상적인 라이브러리라면 마음놓고 업데이트해도 현재 작성한 코드에 영향이 없다.Patch가벼운 버그 수정, 주석 변경 등이 있을 수 있다.내 생각현재 진행하는 프로젝트에도 버저닝을 적용하고 , 패치노트도 쓰면 롤백이 필요할 때 많은 참고가 될 것 같다.그런데 minor가 바뀐 ..
결론적으로 push_back보다 빠르다.vector, deque,list 등 컨테이너에는 push_back() 을 통해 끝에 요소를 추가할 수 있다.emplace_back()은 괄호 안에 해당 컨테이너의 요소 생성자를 컨테이너 안에서 직접 호출하여 생성한다.push_back()과 비교하면 더 이해가 되는데, push_back은 밖에서 생성한 요소를 복사, 이동하는 형식을 취한다.vector> vec;pair temp = {1,2};vec.push_back(temp); //복사vec.push_back({3,4}); //이렇게 하더라도 외부에서 생성돼 복사된다.그러나 emplace_back()은 vector 내부에서 생성하기 때문에 이동, 복사 과정이 없다.vector> vec;vec.push_back(..

계약 정보 조회를 하는 기능이 있었는데, 검색 조건으로 계약에 해당하는 상품과, 계약과 관련된 멤버를 통해 조회할 수 있는 기능을 추가했다. 그런데 기존에 다른 join을 했을 때는 빨랐던 조회가 눈에 띄게 느려진게 느껴졌다. 확인해보니 server reponse 시간이 거의 5초가 되어가고 있었다.나중에 최적화할 수도 있었겠지만, 프론트에서 개발하는데 속도가 너무 걸리는 것 같아서 간단하게라도 성능을 개선해보고자 했다.내가 쓰는 dbms는 mariadb10.6.4다.문제 파악기존의 쿼리는 크게 두 단계로 되어있었다.검색 조건을 바탕으로 테이블을 한 번 만드는 서브 쿼리 (페이지네이션까지 처리)페이지네이션된 테이블을 바탕으로 다시 한번 추가 join을 하는 쿼리이번에 추가한 상품과 멤버를 검색조건으로 거..

Go 에서는 swaggo라는 패키지를 이용해서 swagger 문서화를 지원한다.그런데, 곤란하게도 swaggo에서도 자체적으로 fiber용으로 패키지를 만들고, fiber에서도 자체적으로 swagger를 위한 middleware를 만들었다.사진의 위에 있는 게 fiber에서 만든 것, 세번째에 있는게 swaggo에서 만든 것이다.(중간에 v2를 제공하는 스파이가 있는 것 같지만, 공식이 더 좋을 것 같아 패스)GPT에 물어봤을 때는 fiberSwagger가 더 좋다고 하지만, 실제 써봤을 때는 달랐다. 커스텀이 swagger가 더 좋다고 느껴졌다.그래서 pkg.go.dev 에 들어가 검색해본 결과, import 부터 gofiber의 swagger가 높았다.둘다 github의 readme가 친절하지 않..
Context엔드포인트 내부에서 클라이언트 통신 단절이나 타임아웃 등을 context.Context만 알 수 있다.중단 처리를 감지하지 못하면, 요청이 타임아웃 됐지만 처리를 계속 하거나, 서버를 정지하고자 중단 처리를 실행해도 요청 처리가 중돤되지 않아 서버 프로세스가 종료되는 순간까지 처리를 계속하게 된다.net/http 패키지의 *http.RequestContext 메서드에서 얻는 context.Context 타입값을 사용한다. fiber에는 *fiber.Ctx 의 .Context() 메서드를 이용해 가져올 수 있다.gorm에서는 다음처럼 시작하면 된다.tx := db.WithContext(ctx).Begin()이를 위해서 호출하는 메서드의 맨 앞에 ctx를 넘겨주는 패턴을 쓰는 것이 좋다.주의할 ..
Go 탄생신화에 따르면 Go는 45분의 빌드 타임 동안에 잉태되었다고 한다.C, C++의 방식/* 긴 길이의 저작권과 라이센스 알림 */#ifndef _SYS_STAT_H_#define _SYS_STAT_H_/* 타입과 다른 정의들 */#endifc는 이렇게 guard 하는 ANSI C 방식이 널리 퍼져있었다. 이 방법은 의존성 파일을 중복 임포트하지 않기 위한 것이지만, 이 guard를 읽기 위해 여러번의 의미 없는 i/o가 일어났다.아티클에서는 Unix의 ps 명령어가 #include 를 37번 사용하는 것을 발견했고, 이는 의미없는 36번의 파일 I/O가 일어나는 것을 의미한다.이 문제 해결을 위해 Plan 9이라는 라이브러리의 디자이너는 다른 방법을 사용했다. 모든 헤더파일에서 #include ..
해결하고자 하는 문제수십분, 수시간이 걸리는 빌드 -> 설명동일한 내용의 표현 방법이 프로그래머마다 달라서 생기는 가독성 저하 -> gofmt라는 자동 포맷팅 툴 제공자동화 툴 작성이 어려움 -> net/http, os/exec, sync 등 강력한 패키지 제공높은 비용이 드는 버전 관리 및 버전 변경멀티 코어 프로세서, 네트워크 시스템, 대규모 계산 클러스터 및 웹 프로그래밍 모델에서 개발할 때 발생하는 문제 -> 고루틴과 채널 이를 해결하기 위한 목표동적 타이핑 언어의 특징인 쉬운 프로그래밍정적 타이핑 언어가 가진 효율성과 타입 안정성-> 타입추론 키워드 := 를 이용하여 동적 타이핑의 쉬운 장점을 가져갔고, 컴파일 타임에 타입 검사를 해 오류 가능성을 줄였다.네트워크 프로그래밍, 멀티 코어 프로그래..