전체 글 361

소규모 서비스와 대규모 서비스의 차이 + 스케일 업(scale-up), 스케일 아웃(scale-out)

스케일 업(scale-up), 스케일 아웃(scale-out) ? 대량의 서비스를 서버 1대로 처리할 수는 없게 됩니다. 더 많은 트래픽을 처리하기 위해서 스케일 업(서버의 성능을 업그레이드하는 것)과 스케일 아웃(서버의 대수를 늘려서 연결하는 것)이 있는데, 일반적으로는 스케일 아웃을 하게 됩니다. 왜냐하면 하드웨어 성능과 가격이 비례하지 않기 때문이죠. 대량생산되는 부품이 훨씬 싸기 때문이죠. 하지만, 스케일 아웃도 단점이 있습니다. 서버의 대수를 늘릴수록 관리가 힘들어지죠. 로드 밸런서로 연결해야 하기 때문에 엔드 포인트가 더 생기고 작업이 복잡해지는 것이죠. DB 동기화도 해야하구요. 동시성 제어도 힘듭니다. 이런 점 때문에 요즘 엔지니어들의 몸값이 비싸지는 것 같아요 ! 데이터 처리 데이터는 디..

Server 2021.12.22

NodeJS - JSON null필드를 Response에서 생략하는 방법!

const app = express(); // JSON null 필드 생략 app.set('json replacer', (k, v) => (v === null ? undefined : v)); 위와 같은 방법으로, 익스프레스에 json replacer를 정의해서 필요한 경우 null필드를 response에서 제외할 수 있습니다. ORM으로 sequelize나 type orm을 사용하는 경우에는 exclude, attributes 등을 사용해서 response를 원하는 범위로 조작할 수도 있습니다!

Server/Node.js 2021.12.21

Sequelize - 자식 테이블까지 한 번에 Insert 치는 방법 (Join Insert) + 상황에 따라 다른 쿼리를 날리는 방법

자식 테이블까지 Insert 하기 const result: Product = await Product.create(createProductDto, { include: includeStatement }); // ProducdtDto.ts export interface CreateProductDto { name: string; description?: string; count?: number; productImages?: ProductImageDto[]; } typescript 예시입니다. Sequelize의 include를 사용하면 관계를 맺고있는 자식 테이블까지 함께 insert를 칠 수 있습니다. hasOne이든 hasMany든 Sequelize가 그에 맞게 insert를 해줍니다 ! 상황에 다른 쿼리..

Server/Node.js 2021.12.19

데이터베이스 - 순서(정렬) 컬럼 두는 전략 비교

순서 컬럼? 일반적으로는 정렬을 id로 하지만, 특정 컬럼을 둬야 하는 경우가 생깁니다. 가령, 순서 수정이나 순서 변경 기능을 제공하는 백엔드에서 그렇죠. pk를 바꾸려면, 관련 테이블과 로그를 전부 수정해야 하기 때문이에요. 이 때는 순서 컬럼을 어떻게 두면 좋을까요? 방법 소개 stackoverflow를 통해, 존재하는 다양한 방법들을 살폈는데요. 대표적으로 4가지 방법이 있습니다. 1. 소수를 이용한 방법 2. bigint를 사용해서 bit hole을 두는 방법 3. next_id를 저장하는 방법 4. 기본적인 int를 저장하는 방법 비교 1. 소수를 이용한 방법의 경우 소수를 이용해서, 앞에 올 컬럼의 순서보다 0.01 정도씩 높여서 이동시키는 방법 적절하지만, 동작을 보장하지 않습니다. flo..

Database/SQL 2021.12.04

REST - 상태 등 세부 컬럼 수정 엔드포인트 (End-point) 설계

예시 어떤 엔터티에 대한 한 가지 컬럼에 대해서만 수정할 때 엔드포인트 설계를 어떻게 하면 좋을까요? 가령 어떤 품목(product)에 대한 예약(reservation)이 있다고 가정합니다. 예약(reservation)에는 승인 대기, 승인 완료, 반납 완료 - 총 3가지 상태가 있다고 가정합니다. 이런 세부 상태 등 하나의 컬럼을 변경하는 API를 설계하는 방법들에 대해서 알아보겠습니다. uri 비교 떠오르는 방법은 아래 5가지가 있습니다. PUT /bookings/{id} PATCH /bookings/{id} PUT /bookings/{id}/status PATCH /bookings/{id}/status POST /bookings/{id}/approve + POST /bookings/{id}/retu..

Operation/Rest API 2021.11.28

[Mysql] enum vs tinyint, boolean 차이점

MySQL enum? ERD 설계, 엔터티 설계, DTO 설계를 할 때 고민되는 부분이 있습니다. enum vs boolean, enum vs tinyint 어떤 차이가 있을까요? 비교 ERD를 많이 보신 분들이라면, enum('Y', 'N')을 사용하는 경우를 종종 볼 수 있습니다. 상태(State) 또는 코드(Code)에서도 enum("CANCEL", "STOP", "COMPLETE")등을 사용하기도 합니다. 하지만, 이는 그리 좋은 방법이 아닐 수 있습니다. 왜 Why? Enum은 DB 비표준이자, MySQL의 확장입니다. 여기서 문제가 발생할 수 있습니다. 다른 종류의 DBMS로 마이그레이션이 불가능합니다. 지정된 문자열이 아닌 다른 문자열이 들어왔을 때 빈 문자열이 저장될 수 있습니다. 값이 변..

Database/SQL 2021.11.24

Boolean 컬럼 이름 짓기 (Flag naming convention)

Boolean 명명 관례 Boolean 변수는 자바 등 각종 프로그래밍 언어 뿐만 아니라, 데이터 베이스에서도 많이 쓰입니다. Boolean 변수, 컬럼, 필드 등 이름은 어떻게 정하면 좋을까요? prefix 사용 의미에 따른 prefix를 활용합니다. (Is, Has, Can, Allows, should) is_activated is_available allows_booking 예시 1. 모든 경우가 참인지 확인하는 Boolean 값 (모든 유저들이 로그인을 했는지 여부) isUsersLoggedIn 🤨 문법이 틀림 areUsersLoggedIn 🤔 are보다는 is isEveryUserLoggedIn 👍 적절함 isEachUserLoggedIn 🥰 가장 적합함 2. 모든 경우 중 하나가 참인지 확인하..

Database/SQL 2021.11.24

StringBuilder를 초기화 하는 방법 3가지 성능 비교

StringBuilder와 StringBuffer는 String의 불변성(Immutable) 때문에 연산이 많아질수록 속도, 메모리 효율 등 퍼포먼스가 크게 떨어지는 점을 극복하기 위해서 사용하는 대표적인 클래스입니다. 알고리즘 문제를 풀 때는 비동기적이지만 퍼포먼스가 뛰어난 StringBuilder를 주로 사용하죠. 보통 반복문에서 지역변수를 사용할 때는 어떻게 사용하시나요? 그럼 StringBuilder는? Q. 아래는 반복문에서 지역변수를 사용하는 예시 2가지입니다. 다음 코드 중 더 좋은 코드는 몇 번 일까요? 변수를 매번 새로 할당하는 방법 변수를 1번만 할당하고 초기화하는 방법 // 1번 int num = 0; for(int c : array) { num = c + 10; System.out...

Language/Java 2021.10.07

서버리스(Serverless)란 무엇인가?

서버리스란 ? 서버리스(Serverless)는 직역하면 "서버가 없다"라는 뜻입니다. 하지만, 서버가 없는 것은 아니고, 서버를 직접 관리할 필요가 없는 아키텍처를 뜻해서 서버리스 아키텍처(Serverless Architecture)라고 부르는 것 같습니다. 서버가 필요 없다는 뜻은 아니다! 서버를 관리하거나 신경 쓸 필요가 없다는 뜻 나노 수준의 함수로 구성된다. 서버리스 아키텍처의 구현 방식 서버리스 아키텍처의 대표적인 두 가지 구현 방식은 아래와 같습니다. BaaS (Backend as a Service) : Firebase, Kinvey, Parse ... 등 FaaS (Function as a Service) : AWS Lambda, Azure Functions, Google Cloud Func..

JAVA - 재귀함수 파라미터 vs 전역변수

요즘 구직을 위해 코딩테스트를 보고 있습니다. 프로그래머스 문제를 풀다가 재귀함수를 사용할 때 사용할 변수의 위치가 제각각이라는 것을 알게 되었습니다. 아래의 문제를 예시로 들겠습니다. https://programmers.co.kr/learn/courses/30/lessons/43165 코딩테스트 연습 - 타겟 넘버 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+ programmers.co.kr 아래 함수는 숫자 배열(numbers)와 목표 숫자(target)을 인자로 받고, 주어진 숫자 배열을 가지고 적절히 연산해서..

Language/Java 2021.09.17