1. 모노레포
지금 회사에서는 1개의 API-Docs를 가지고 여러개의 프로젝트의 코드를 관리한다.
즉, 1개의 API-DOCS Repo를 Database와 Swagger 사용을 위한 공용 레포로 사용하고
나머지 Repo를 가지고 프로젝트 코드를 관리한다.
이유는 1개의 API-Docs를 단일 코드 저장소에 관리함으로써 모델 중복을 줄이고 의존성을 공통으로 관리해 코드 관리를 수월하게 하기 위함이다.
2.재공품
work in progress product 라는 뜻으로 제품이 되기 전인 중간 생산물 정도의 의미이다.
즉, 아직 공정 단계를 거치고 있는 물품으로 이해하면 된다.
3. 트리구조
두 열 간의 참조 관계는 트리구조라 보기 어렵지만, parentWorkLog라는 컬럼이 부모노드 startLog, endLog 가 자식 노드라 생각했을 때, 데이터의 구조상으로 트리 구조로 파악될 수 있다.
논리적인 구조로 트리 구조로 해석될 수 있다 라는 뜻이고 실제 데이터가 트리 구조로 표현되는 것은 아니라는 점을 이해해야한다.
4. LOT
일정 기간 동안 생산된 특정 수량의 제품을 말한다.
LOT는 주문량을 의미할 수도, 생산 공정에서 생산된 일련의 제품을 지칭할 수도 있다.
즉, LOT는 일정기간 동안 생산된 특정 제품이나 부품의 생산량을 의미한다.
5. 부동소수점
0.1+0.2 !=0.3 이다.
부동소수점 때문인데, 이 같은 계산은 공정에서 불량 생산을 증가시킬 수 있다.
를 참고해보면 부동 소수점이 뭔지 알게된다.
해결방법은
- Decimal
- BigNumber.js 라이브러리 사용하기
from decimal import Decimal, getcontext
# 정밀도 설정
getcontext().prec = 28
a = Decimal('0.1')
b = Decimal('0.2')
c = a + b
print(c) # 결과: 0.300000000000000016653345369377
하지만 Decimal도 정밀도 측면에서 부동소수점 연산의 오류를 피하기는 어렵다.
BigNumber 라이브러리를 사용하여 문자열로 숫자를 관리하고 계산할 수 있다.
const BigNumber = require('bignumber.js');
let a = new BigNumber('0.1');
let b = new BigNumber('0.2');
let c = a.plus(b);
console.log(c.toString()); // 결과: '0.3'
string으로 관리해서 저장하면 더 많은 데이터와 더 높은 정밀도의 계산 결과를 보장할 수 있다.
6. TypeORM과 Sequelize의 트랜잭션 관리
const entityManager = getManager();
try {
// 트랜잭션 내에서 사용자 업데이트
await entityManager.transaction(async transactionalEntityManager => {
const user = await transactionalEntityManager.findOne(User, userId);
if (!user) {
throw new Error('User not found');
}
user.username = newUsername;
await transactionalEntityManager.save(user);
});
typeorm은 데코레이터와 레포지토리 패턴으로 EntityManager를 사용해 QueryRunner로 트랜잭션과 세션을 관리한다.
try {
// 트랜잭션 내에서 사용자 업데이트
const user = await User.findByPk(userId, { transaction });
if (!user) {
throw new Error('User not found');
}
user.username = newUsername;
await user.save({ transaction });
// 트랜잭션 커밋
await transaction.commit();
Sequelize에서는 트랜잭션을 시작하고, 연산을 수행한 뒤 커밋하거나 롤백하는 방식으로 트랜잭션을 관리합니다. transaction 객체를 사용하여 트랜잭션을 명시적으로 관리합니다.
그래서 transcation을 파라미터로 넣는 것처럼 보여지기도 한다.
7. swagger는 왜 yaml 파일로 관리할까
json 파일로도 관리가능하다. json 파일은 syntax 에러 감지가 가능해 에러 수정이 가능하지만, yaml 파일은 이것이 하기 힘들다.
물론 yaml syntax 수정해주는 extension도 존재한다.
하지만 json 로 관리하는 것보다 직관적이고 간결하며 주석 기능도 편리해 yaml 로 swagger를 관리하는 편이다.
8. 레포지토리 패턴
데이터 엑세스와 비즈니스 로직을 분리하는데 도움을 준다.
데이터베이스와 ORM을 분리해 데이터베이스 변경에 편리하며, 코드 재사용성이 증가한다.
또한 테스트 코드 작성에서 레포지토리를 모킹하거나 스텁하여 유닛 테스트를 쉽게 작성할 수 있게 된다.
코드 일관성을 유지하고 데이터 접근 방식에 대한 규약을 세워 코드가 깔끔해지는 장점이 있다.
9. npm version
npm은 Semantic Versioning이라는 것을 따른다.
이는 소프트웨어 버전 변경 규칙에 대한 규약을 말한다.
0.0.0 버전을 정한다.
맨 처음 숫자를 Major Version : 대규모 업데이트이며 API 호환성이 깨질만한 변경사항
가운데 숫자를 Minor Version : 많은 업데이트이지만 하위 호환성이 깨지지 않는 API 기능 추가
마지막 숫자를 Patch Version : 단순 버그 수정 및 자잘한 업데이트
MAJOR Version이 올라가면 하위 버전 (MINOR Version, PATCH Version)은 0이 된다.
MINOR Version이 올라가면 하위 버전 (PATCH Version)은 0이 된다.
정식배포전에 pre-release하는 경우에는 -또는 . 을 사용한다.
정식배포전에 git commit후 난수가 붙어서 배포하는 경우 build metadata라고 한다.
ex) 16.9.0-alpha.0
MAJOR에 0으로 시작할 경우 Patch Version과 그 외 난수 (0.y.z)를 붙여서 배포하는데, 이는 초기 개발 용도를 의미한다.
10. npm publish
개발을 위해 모듈을 설치하는데, 내가 주로 사용하는 모듈을 배포해서 관리할 수 있다.
개인도 npm 패키지 배포해서 private 레포에 관리할 수 있다.
도커 이미지 관리하듯 배포하고 가져다가 쓰면 된다.
11. createdAt을 가짜 데이터 사용하는 이유
실제 데이터베이스에 대량 데이터 로드하거나 마이그레이션할때 실제 시간 정보를 사용하기 어렵다.
테스트 코드를 사용할때도 마찬가지이다.
때문에 가짜 시간 정보를 생성해 코드를 테스트하곤 한다.
12. Moleculer 서비스 등록
Moleculer 서비스의 모든 기능을 액션 단위로 구현한다. 이 액션들을 서비스에 등록해서 외부 서비스에서 호출할 수 있도록 할 수 있다.
이를 액션으로만 작성된 것을 서비스에 등록한다라고 한다.
Moleculer에서 서비스 간 통신은 분산 시스템을 구축하는 주요 개념이며 각각의 서비스가 분리되어 독립적으로 서로 다른 노드에 배포되어 서비스간 통신을 할 수 있다.
13. js에서 Import 된 모듈은 언제 실행될까?
import 구문은 해당 모듈이 실제로 사용될 때까지 해당 모듈의 코드를 실행하지 않는다.
필요한 경우에만 로드되고 해당 모듈의 내용이 실행된다.
이런 과정으로 모듈이 실제로 사용될 때까지 리소스를 낭비하지 않고 효율적으로 관리할 수 있게 된다.
웹팩같은 번들러는 미리 모든 모듈을 하나의 번들로 로드시킬 경우도 있지만, 일반적인 모듈은 런타임 중에 필요한 시점에 동적으로 로드되고 실행된다.
'기타' 카테고리의 다른 글
copilot 무료로 사용하기 (0) | 2024.06.16 |
---|---|
항해 플러스 백엔드 5기 [시작하는 마음] (1) | 2024.06.15 |
node-wit 사용 후기 (1) | 2023.12.15 |
iterms에서 warp으로 넘어간 후기 (0) | 2023.07.12 |
Gatsby로 포토폴리오 만들기 - (3) (0) | 2023.03.09 |