목록분류 전체보기 (107)
정글에서 온 개발자

문제도커 배포 이후에 데이터가 변한게 없는데도 불구하고 위와 같이 스케줄이 보였다.Response 비교컨테이너화 이후에는 startDate, endDate의 timeZone이 설정이 안 되고 있다.확인 결과 실제 db에는 timezone정보를 따로 저장하지 않고, 쿼리 시에 DSN에서만 local로 요청하고 있었다."DSN": "계정:password@tcp(192.xxx.124.163:4306)/database_name?parseTime=true&loc=Local", 그런데 도커화 전에는 머신의 시간 자체가 한국 시간으로 돼있어서 잘 돌아갔던 것이다.그런데 도커는 서버가 docker에서 설정한 image 안에서 돌기 때문에, 기준시를 따로 설정해주지 않으면 UTC가 기준이 된다.이를 고쳐주기 위해 go..

contract, business_units, activities, activity_item은 공통적으로 product와 member를 M개 가지고 있다.이 로직은 contract-product 를 맵핑하는 테이블, contract-member 를 맵핑하는 테이블... 이런식으로 각각 만들어줄 수도 있었겠지만, 사실상 추가 제거 로직이 정확히 일치하므로 테이블을 줄일 수 있었다.엔티티에 products, contract등 엔티티가 추가, 제거되는 기능도 새로 구현해야했는데 이것 역시 log를 추가하고 제거하는 로직은 같았기에 여러 엔티티에서 한 테이블을 돌려 쓸 수도 있게 됐다.여기서 선택해야했다. polymorphic 테이블을 하나 만들어서 테이블 관리를 편하게 갈것인가? 아니면 mapping tab..

기존 시스템, 개선과 문제우리회사의 레거시 배포 시스템은 zip 파일을 서버에 전달해 배포하는 방식이였다.대략 아래와 같다.1. `build.bat` 파일을 실행하면 ng build 와 go build 를 실행하고, build된 파일에 날짜를 붙여 zip 파일로 만든다.2. 해당 zip 파일을 배포하고자 하는 머신으로 ftp 전송한다.3. 옮긴 파일을 unzip 한다 (덮어쓰기)4. 미리 설정해준 systemctl 을 이용하여 `sudo systemctl restart myservice` 명령어로 재시작한다.4단계밖에 안 돼 보이지만, 정확한 경로에 복사하고 unzip해야하기 때문에 귀찮아서 개선해보려 한 적이 있다.2024.11.22 - [구현 혹은 적용] - 웹앱 Delivery 자동화. Github..

Docker로 말아올린 서비스, 로컬에서는 업로드해도 문제 없는 사진이, 서버단에서는 업로드했을 때 에러가 났다.이미지가 크게 다를 게 크기밖에 없다고 판단해 크기에 주목했다.역시나 413 에러가 났다.서버단에서는 따로 413 status를 반환하게 안 짰는데, 그럼 왜 날까?지금 돌리는 서비스가 일단 기존 도메인의 /pg라는 url 아래에서 돌게 해달라고 해서, nginx-docker를 구성해서 routing을 해주고 있었다. nginx에서 막고 있는 것 같다.아래와 같이 구성해서 원래 8080에서 돌던 서비스 전에 /pg/로 접속할 경우 연결되는 서비스를 연결해줬다.//docker-compose.ymlservices: nginx: image: nginx:latest ports: ..
동시성은 여러가지를 한 번에 다루는 것이지만, 병렬성은 여러 가지 일을 동시에 하는 것 - 롭 파이크동시성(Concurrent)여러 작업을 시작, 실행, 완료하는 과정이 서로 중첩된 시간에서 특별히 정해진 순서 없이 일어나는 것병렬성(Parallel)여러 작업을 여러 컴퓨팅 자원을 이용해 병렬로 동시에 실행하는 것 (여기서 '동시'라는 단어가 들어가서 헷갈릴 수 있지만, 핵심은 코어를 동시에 돌리는 것이다.)상황동시적이며 병렬적요리사 두명이, 한명은 썰고, 한명은 젓기를 함동시적이지만, 병렬적이지 않음싱글 코어로 스케줄링 된 프로세스들이 실행됨병렬적이지만, 동시적이지 않음단일 작업의 하위 작업 여러개를 동시에 처리ex) 분할정복 전략에서, 단순이 같은 작업을 여러 코어에서 동시에 실행함.참고그로킹 동시..

배경현재 시스템에 호환성이 없는 기능 업그레이드가 있어서 브랜치를 두개 파서 운영하고 있었다.기존 버전이 1.0.1, 새 버전을 1.0.2로 설정했다. (시맨틱 버전을 공부하고 나니, 1.1.0 이 맞다는 걸 나중에 깨달았다.)새 버전을 한창 개발하고 있는데, 기존 버전도 일부 기능을 업데이트 해달라는 요청이 지속적으로 와서 두 브랜치 사이에서 줄 바꿔 타기를 하는 날의 연속이였다. 파일 구조가 안 바꼈을 때는 개발한 feature branch를 양쪽에 다 merge해도 문제가 없었는데, 파일 구조가 크게 바뀌면서 커밋 중 일부만 적용하는 게 필요했다.그래서 cherry-pick 과, 새 구조에 맞춰 새로 코드 작성하기를 혼용하고 있었다.그러던 중, 새 버전에 구 버전 업데이트의 backend 부분..
서브 쿼리조인은 집합간의 곱 관계라, 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(..