전체 글 361

OS - 프로세스와 스레드 차이

프로세스 프로세스를 알기 전에 프로그램을 알아야 한다. 프로그램(Program)은 어떤 작업을 위해 실행할 수 있는 파일을 말한다. 프로세스의 사전적 정의는 다음과 같다. 컴퓨터에서 연속적으로 실행하고 있는 컴퓨터 프로그램 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 운영체제로부터 시스템 자원을 할당받는 자원의 단위 정리하면 프로그램의 실행된 부분을 의미한다. 프로세스는 다음의 특징을 갖는다. 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다. 코드 영역(code area): 프로그래머가 작성한 프로그램이 저장되는 영역 데이터 영역(data area): 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터들이 모여있다. 스택 영역(stack area..

Operation/OS 2022.07.05

Spring - REST API에서 직접 정의한 Error code를 사용하는 이유!

네이버나 카카오 Open API를 보면 Error Response 스펙에 서비스가 자체적으로 정의한 code를 사용한다. API 레퍼런스 kakao: https://developers.kakao.com/docs/latest/ko/reference/rest-api-reference#response naver: https://developers.naver.com/docs/common/openapiguide/errorcode.md 이는 REST API의 Error Response를 이해하기 위해서는 문서를 봐야한다는 치명적인 단점이 있다. 그럼에도 불구하고 직접 정의한 Error code를 사용하는 이유에 대해 알아보자. 개요 이번 주 회사에서 Mail API를 개발 중인 선배분께서 자리로 오셔서 이런 말씀을..

Server/Spring 2022.07.03

Spring - REST에서 예외를 처리하는 다양한 방법!

Spring에서 예외 처리를 구현하는 다양한 방법에 대해 알아본다. Spring 3.2 이전에는 Spring MVC 애플리케이션에서 예외를 처리하는 대표적인 두 가지 방식이 있었다. HandlerExceptionResolver 또는 @ExceptionHandler 애노테이션이었다. 해당 방법들은 분명한 단점이 있었다. Spring 3.2 부터는 이전의 두 솔루션의 단점을 극복하고 통합 예외 처리를 유도하기 위해 @ControllerAdvice 애노테이션을 사용했다. 그리고 Spring 5부터 REST API에서 기본 예외를 처리하기 위해 ResponseStatusException을 제공한다. 이들은 관심사 분리를 훌륭하게 처리한다. Solution 1. @ExceptionHandler Controller..

Server/Spring 2022.07.03

MySQL - 비트마스크 컬럼을 사용하지 않아도 되는 이유 (+ SET Type)

MySQL에서 동일한 여러가지 플래그를 만들 일이 생긴다. 다음 그림은 내가 신입때 만든 프로젝트의 ERD 일부이다. 해당 테이블을 설계하면서 고려했던 방식은 두 가지이다. 비트마스크로 부모 테이블안에 1개 컬럼으로 저장하는 방식 테이블 1개로 추출해서 저장하는 방식 비트마스크로 처리하면 가독성을 망치고 구현이 힘들어진다. 그리고 DBMS에서 컬럼마다 데이터 크기를 정의할 수 있다. 그래서 두 번째 방식으로 테이블을 설계하게 되었다. (발표 때 아무도 태클 걸어 주지 않으셨다.) SET TYPE MySQL 데이터 타입 레퍼런스를 보던 중 SET이라는 것이 눈에 들어왔다. SET은 ENUM처럼 문자열 값을 MySQL 내부적으로 정수 값으로 매핑해서 저장하는 방식의 타입이다. 하지만 SET은 ENUM과 달리..

Database/SQL 2022.06.30

Real MySQL - 파티션이란 무엇인가?!

파티션 파티션 기능은 테이블을 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리해서 관리할 수 있게 해준다. 주로 대용량의 테이블을 물리적으로 여러 개의 소규모 테이블로 분산하는 목적으로 사용한다. 하지만 파티션을 사용하면 무조건 성능이 빨라지는 것은 아니다. 어떤 쿼리를 사용하느냐에 따라 오히려 성능이 더 나빠지는 경우도 자주 발생한다. 파티션의 동작 원리에 대해 더 깊게 알아보자. 인덱스와의 관계 데이터를 탐색할 때 DB는 인덱스를 메모리에 올려서 사용하게 된다. 인덱스가 커지면 SELECT는 물론이고, INSERT, UPDATE, DELETE 작업도 함께 느려진다. 특히 한 테이블의 인덱스 크기가 물리적 메모리 공간보다 크다면 그 영향은 더 심각해진다. 파티션은 데이터와 인덱스를..

Database/SQL 2022.06.29

스토리지 종류 (파일/블록/객체 스토리지)

스토리지의 종류 최근에 사이드 프로젝트를 담당하게 되면서 영상물을 서버에 저장하는 작업이 필요했습니다. 제가 아는 서버에 파일을 저장하는 방법은 두 가지였습니다. DB에 파일명, 확장자와 BinaryData로 내용을 저장하는 방법 파일을 서버에 저장하고 DB에서는 그것을 꺼내쓸 수 있는 데이터만 저장하는 방법 어떤 것이 좋을 지 궁금해서 당근마켓 피드 & 디스커버리 팀에서 일하는 지인에게 어떤 것을 사용하냐고 물어봤어요! 결론은 예전에는 첫 번째 방법처럼 DB에 BinaryData로 저장하다가 CDN 사용 이점때문에 두 번째 방법으로 갈아탔다고 하네요. 추가로 오브젝트 스토리지에 영상물을 저장한다고 했습니다. 저는 오브젝트 스토리지가 어떤 것인지도 잘 몰라서 스토리지 종류에는 어떤 것이 있는 지 알아보기..

Database - 인덱스 알고리즘 정리!

인덱스 알고리즘 인덱스 알고리즘은 인덱스 페이지에 데이터를 저장하거나 찾을 때 사용되는 알고리즘을 의미한다. 대표적으로는 B-Tree 알고리즘과 Hash 알고리즘이 있다. B-Tree 알고리즘 B-Tree는 이진트리와 다르게 하나의 노드에 많은 수의 정보를 가지고 있을 수 있다. M개 자식을 가지는 B 트리를 M차 B-Tree라고 한다. 아래 그림은 차수가 3인 B-Tree 이다. 파란색 부분은 각 노드의 key를 나타낸다. B-Tree 알고리즘은 각 노드의 키보다 작은 값은 왼쪽에, 큰 값은 오른 쪽에 저장하는 방식이다. 이는 다른 알고리즘과 비교했을 때 아래의 특징을 가진다. 각 노드는 항상 정렬된 상태를 가진다. 특정 값보다 크던 작던 간단하게 조회할 수 있다. 데이터가 중복되지 않는다. 참조 포인..

Database/SQL 2022.06.26

Real MySQL - Limit, Offset 절의 동작 원리! (+ No Offset 성능 비교)

LIMIT Limit 절은 쿼리 결과에서 지정된 순서에 위치한 레코드만 가져오고자 할 때 사용한다. 아래의 예제를 보자. SELECT * FROM employees WHERE emp_no BETWEEN 10001 AND 10010 ORDER BY first_name LIMIT 0, 5; 위의 쿼리는 다음과 같은 순서로 실행된다. employees 테이블에서 WHERE 절의 검색 조건에 일치하는 레코드를 전부 읽어 온다. 1번에서 읽어온 레코드를 first_name 칼럼값에 따라 정렬한다. 상위 5건이 정렬이 완료되면 즉시 쿼리를 멈춘다. 정렬된 결과의 상위 5건만 사용자에게 반환한다. Oracle의 ROWNUM과 달리 MySQL의 LIMIT은 항상 쿼리의 마지막에 실행된다. 즉, 데이터 전체를 조회해서 ..

Database/SQL 2022.06.26

Real MySQL - BETWEEN문 튜닝하는 방법! (with MySQL Server 8.0)

BETWEEN BETWEEN은 특정 범위를 스캔할 때 주로 사용한다. 개인적으로 IN절에서 여러 개의 값을 전부 명시하는 것보다 BETWEEN처럼 범위로 한 번에 당겨오는 것이 성능상 좋을 것이라고 생각했었다. 정말 그런지 살펴보자. BETWEEN vs IN 절 dept_emp 테이블에 (dept_no, emp_no)로 구성된 PK가 있다고 가정하자. 아래의 SQL 문을 보자. SELECT * FROM dept_emp WHERE dept_no BETWEEN 'd003' AND 'd005' AND emp_no=10001; 문제는 BETWEEN은 범위 안에 있는 모든 레코드를 읽는다는 점이다. 해당 조회는 먼저 BETWEEN으로 모든 레코드를 읽은 후에 emp_no로 조건을 비교한다. 즉, 많은 데이터가 메..

Database/SQL 2022.06.26

Database - 트랜잭션의 특징 (ACID)

트랜잭션 ? 트랜잭션은 데이터베이스에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위이다. 여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료되며 하나의 명령어라도 잘못되면 전체가 롤백된다. 트랜잭션을 사용하는 이유 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함이다. 데이터베이스에선 테이블에서 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 갱신, 삭제하는데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다. 처리 과정이 모두 성공했을 때만 최종적으로 데이터베이스에 반영한다. 락(Lock) 트랜잭션을 사용하는 이유가 전체 단위를 롤백만 하기 위한 것은 아니다. DB 락이라는 것이 있는데 여러 사용자가 동일한 데이터를 액세스할 때 작업이 순차적..

Database/SQL 2022.06.25