Dev 14

[JS] Call by reference가 없는 Javascript

잘못된 생각 최근까지 javascript는 함수 호출 시 참조형이면 넘길 때도 call by reference로 넘겨지고, 원시형이면 call by value로 넘겨지는 줄 알고 있었다. 그러다 최근 질문이 들어와서 답해주려다 자세히 알아보니, 잘못 알고 있었다는 것을 깨달았다. Call by Value & Call by Reference 우선 흔히 알고 있는 두 가지 개념에 대해 살펴보자 Call by Value 호출자가 실제 매개 변수를 평가하고 그 값을 호출자에게 전달하는 관례 호출자에서 값 매개 변수의 수정 내용은 호출자에서 볼 수 없다. Call by Reference 설명을 좀 줄이자면, 호출자(caller)가 함수에 전달한 실제 매개변수(actual parameter)가 변수일 경우, 컴파일..

Dev 2023.04.23

where 대신 join을 사용하는 경우

최근 아는 개발자 분께 질문을 드리다 여러 데이터를 가져올 때는 where 문보다 join 문의 성능이 더 좋을 수 있다는 것을 알게 되었다. 기존 query 기존에 프로젝트를 진행하면서 특정 유저의 콘텐츠를 조회할 때, 해당 user와 content 테이블은 서로 1 : N의 관계로 연결되어있었기 때문에 user의 id를 where 조건문에 사용하여 content 테이블에 query를 날려 데이터를 조회하고 있었다. 코드의 일부분을 보여주자면 다음과 같다. await this.contents .createQueryBuilder('content') .where('content.userId = :userId', { userId: user.id }) .leftJoinAndSelect('content.cate..

Dev 2023.04.15

HA(고가용성)와 DR(재해 복구)

GDSC 세션에서 발표한 내용을 포스트로 재구성했습니다. 만약 내가 운영하는 프로젝트를 서비스하다가 문제가 생기면 어떻게 해야할까? 하는 궁금증을 가지고 있었는데, 최근 있었던 일을 겪으며 '고가용성' 서비스를 어떻게 하면 제공할 수 있을 지 직접 알아보게 되었습니다. 고가용성이란, 장애가 생기더라도 빠르게 복구할 수 있는, 시스템을 최대한 중단 시간 없이 운영할 수 있는 성질을 말합니다. 하나의 시스템에서 서비스가 불가한 장애 발생 시 다른 시스템으로 옮겨 서비스의 중단을 최소화하는 기술입니다. 사실상 완전히 중단을 막을 순 없으며, 서비스 중단을 막기 위한 최선의 방법을 선택하는 것이 고가용성입니다. 일반적으로 가용성에 따른 서비스 제공 시간은 아래와 같습니다. Availability Downtime..

Dev 2022.11.19

Docker timezone 설정하기

프로젝트를 진행하면서 aws ec2에 띄워둔 docker container에서 로그를 요일별로 정리하여 파일로 저장하고 있었다. 근데 로그에 표시할 시간은 적절한 조치를 통해 한국 시간으로 표시하고 있었지만, docker container 자체의 timezone이 UTC+0으로 설정되어 있었기 때문에 한국 시간을 기준으로 00시부터 새로운 로그파일이 생성되지 않는 문제가 있었다. 그래서 docker container의 timezone 자체를 Asia/Seoul로 설정하고자 한다. Dockerfile의 설정을 통해서도 timezone을 지정해줄 수 있지만 현재 필자의 프로젝트는 EC2에 docker-compose를 통해 API 서버 & PostgreSQL 서버 & Redis 서버 로 배포되고 있었기 때문에..

Dev 2022.10.19

github action을 통한 ci cd 자동화(feat. shell script)

프로젝트를 진행하면서 CI / CD의 자동화 필요성을 절실하게 느끼게 되었다. 다른 것도 많았지만 기본적으로 github를 사용하고 있다보니 자연스레 github action을 사용해보자라고 생각했던 것 같다. 여기서 CI / CD 란 무엇일까? 필자가 자동화의 필요성을 절실하게 느낀 것처럼 매번 개발자가 코드를 수정하고 직접 빌드 및 테스트를 하고 배포까지 하게 된다면 그 시간 비용은 엄청날 것이다. 때문에 CI / CD의 개념을 알고 도입하는 것이 필요하다. CI : 빌드와 테스트를 자동화하는 것 지속적 통합(Continuous Integration) CD : 배포 과정을 자동화하는 것 지속적 서비스 제공(Continuous Delivery) or 지속적 배포(Continuous Deployment)..

Dev 2022.10.17

Intellij 단축키 정복하기

Intellij를 사용한 지 얼마 되지 않아 vscode를 사용할 때와 달리 자꾸 마우스에 손이 가서 흐름이 끊긴다는 느낌을 받고, 또 그 때문에 단축키를 찾느라 심심찮게 스트레스를 받았다. 그런데 조금 전, 구글링을 하다가 단축키를 알려주는 플러그인이 있다는 사실을 알게 되었다. Key Promoter X https://github.com/halirutan/IntelliJ-Key-Promoter-X GitHub - halirutan/IntelliJ-Key-Promoter-X: Modern IntelliJ plugin to learn shortcuts for buttons Modern IntelliJ plugin to learn shortcuts for buttons - GitHub - halirutan..

Dev 2022.05.22

Singleton Pattern(싱글톤 패턴)

싱글톤 패턴이란 것을 Spring을 공부하면서 접했는데, 희미하게 머릿속에 떠다니는 것 같아 글로 정리하고자 한다. Singleton Pattern이란? 클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴 어플리케이션이 시작될 때 어떤 클래스가 최초 1회만 메모리에 인스턴스를 생성하는 방식이다. 예제 기존 코드를 기반으로 한 Test 코드(spring X) @Test @DisplayName("Pure DI Container without Spring") void pureContainer() { AppConfig appConfig = new AppConfig(); // 호출 시마다 객체 생성됨. UserService userService1 = appConfig.userService(); User..

Dev 2022.05.10

Dependency Injection(의존성 주입 - DI)란?

NestJS 공부할 때부터 접하던 개념인데 이번에 Spring을 공부하면서 제대로 짚고 넘어가야겠단 생각이 들었다. Dependency Injection 만약 A 객체가 B 객체의 변화에 영향을 받는다면 A는 B를 의존한다고 한다. 예를 들면 아래와 같다. public class UserService { private final UserRepository users = new MemoryUserRepository(); ... } 위의 UserService는 MemoryUserRepository를 의존한다고 할 수 있다. MemoryUserRepository가 변한다면, 결국 UserService도 변화하게 되는 것이다. 소프트웨어 엔지니어링에서 의존성 주입이란 하나의 객체가 다른 객체의 의존성을 제공하는..

Dev 2022.05.07

Github Copilot 설정하기

https://github.com/github/copilot-docs GitHub - github/copilot-docs: Documentation for GitHub Copilot Documentation for GitHub Copilot. Contribute to github/copilot-docs development by creating an account on GitHub. github.com 군 복무 중 깃허브의 copilot이란 것을 신청했던 것이 갑자기 기억나 waitlist를 확인해보니 이미 사용 가능한 상태였다. 그래서 바로 사용해보고자 한다. Copilot ? Github Copilot이란 Github와 OpenAI가 공동으로 개발한 인공지능 툴이다. 이 툴은 작성 중인 코드를 인공지..

Dev 2022.04.25

address already in use 에러 해결하기 ( awk와 함께 )

Node.js와 함께 작업하다보면 가끔 Error: listen EADDRINUSE: address already in use :::[Port] 이런 에러를 만날 때가 있다. 이는 비정상종료로 인해서 해당 포트가 점유되고 있어 사용할 수 없을 때 나타나는 에러이다. 평소 우리는 이 에러를 해결하기 위해 kill 명령어를 통해 해당 프로세스를 죽여서 해결하곤 했는데, 그 프로세스를 죽이기 위해선 PID 정보가 필요하다. 위와 같이 PID 정보를 확인해야 그제서야 kill -9 [PID] 를 통해 죽일 수 있었는데, 매번 그 과정이 너무 귀찮아서 생각하던 중 awk가 떠올랐다. awk awk란 pattern scanning and processing language이다. 파일의 각 열을 읽어 데이터를 원하는..

Dev 2022.04.02