1. 배경테스트 환경테스트 환경은 프로젝트 설정을 할 때 가장 중요한 부분 중 하나이다. 가장 어렵고 귀찮은 작업이기도 하지만 처음 한번만 고생하면 추후 테스트 작성 시에 걱정 없이 아주 깔끔한 테스트 코드를 짤 수 있게 된다. 하지만 그만큼 프로젝트 환경 설정에서 가장 많은 시간을 들이게 되고, 많은 시행착오를 겪는 구간 중 하나라고 볼 수 있다. 테스트 환경을 만드는 과정에서 신경써야 할 부분은 다양하겠지만 그중에서도 특히나 주의해야할 부분 중 하나는 바로 멱등성이다. 멱등성을 간과한 경우에는 예상치 못한 상황에서 다른 테스트 혹은 외부 모듈로 인해 테스트가 간헐적으로 실패할 수 있으며, 이 경우 실패 구간을 찾기 매우 어렵다는 특징을 가지고 있기 때문이다. 여기서 멱등성(idempotent)이란? ..
프로세스메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태. 스레드프로세스의 한계과거에는 프로그램을 실행할 때 프로세스 하나만을 사용해서 이용했었다. 하지만 기술이 발전됨에 따라 프로그램이 복잡해지고 다채로워짐으로써 프로세스 작업 하나만을 사용해서 프로그램을 실행하기에는 한계가 있었다. 과거에는 파일을 다운받으면 실행 시작부터 실행 끝까지 프로세스 하나만을 사용하기 때문에 다운이 완료될때까지 하루종일 기다려야 했다. 그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다. 스레드(Thread)는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생 하였다. 스레드의 개념하나의 프로세스 내에서 동시에 진행되..
REST는 HTTP의 메서드를 활용해 CRUD를 구현하고, URI를 통해 자원을 명시하는 등 HTTP 통신의 특성을 최대한 활용하는 아키텍처 REST API구성 요소자원(RESOURCE) - URI자원을 구별하는 ID는 /orders/order_id/1와 같은 HTTP URI이다. 행위(Verb) - HTTP METHODHTTP 프로토콜의 Method를 사용 표현(Representations)리소스에 대한 표현 (HTTP Message Body)Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답현재는 JSON으로 주고 받는 것이 대부분 제약 조건Client-Server Architecture (서버-클라이언트 구조)REST 서버는 API 제공, 클라이언트는 사용..
1. 접근 배경일반적인 서비스에서는 여러 도메인 객체의 다양한 필드들을 유저나 관리자의 API 호출 등으로 수정하게 된다. 단순히 조회수 등이 추가 되는 것이 아니라 도메인의 메인 프로퍼티들이 변경된다. 이런것들은 보통 Restful 에서 PUT /도메인이름/{id} 같은 API 를 통해 수정이 되게 되는데, 구현 방식에 따라 몇 가지 차이가 있을 수 있다. 클라이언트에서 수정요청 보낼 시, 필요한 모든 필드를 채워서 보내는 경우-> 이 경우에는 해당 요청을 받아낼 Request 용 DTO 등을 만들거나 해서 해당 정보를 받아온 후, 무조건 기존에 있던 데이터의 DTO 의 모든 필드를 다 assign 해버리면 된다. 변경이 되든 안되든 그 값이 다 담겨져 있기 때문.반대로 모든 필드가 안 채워서 오는 경..
1. HTTP 특징서버와 클라이언트 모델을 따르고 웹상에서 Request 와 Response 구조로 메세지를 주고받을 수 있는 프로토콜 클라이언트 서버 구조HTTP는 요청(Request)와 응답(Response)로 구성되어 있고, 클라이언트가 요청을 하면 서버가 응답을 하는 구조 무상태 프로토콜(Stateless)HTTP에서는 서버가 클라이언트의 상태를 보존하지 않기때문에 특정 서버에 의존적이지 않고 확장성이 좋다.로그인과 같이 유저 상태를 유지해야 하는 경우엔 브라우저 쿠키, 서버 세션, 토큰등을 이용해야 한다. 비 연결성(Connectionless)HTTP 1.0을 기준으로, HTTP는 기본적으로 연결을 유지하지 않는 모델. 하지만 HTTP/1.1 에서는 지속 연결이 가능하며 클라이언트 요청..
1. 인덱스(Index)란?인덱스(index)란?인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은 책의 맨 앞 또는 맨 뒤에 색인을 추가하는데, 데이터베이스의 index는 책의 색인과 같다.데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 돕고 있다. 인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상된다. 그러한 이유는 해당 연산을 수행하려면 해당 대상..
1. 프라이머리 키(PK, Primary Key)와 클러스터링 테이블프라이머리 키(PK, Primary Key)의 특성데이터베이스, 특히 MySQL에서 프라이머리 키(PK, Primary Key)는 상당히 신중하게 결정되어야 한다. 그 이유는 PK가 레코드의 저장 위치를 결정하기 때문이다. 그래서 PK는 NOT NULL, 유니크 등의 특성을 갖는다. MySQL은 PK를 기준으로 유사한 값들이 함께 조회되는 경우가 많다는 점에서 착안하여, PK가 유사한 레코드들끼리 묶어서 저장한다. 유사한 것들을 묶는 것을 클러스터링이라고 하는데, 그래서 일반적으로 PK는 클러스터 인덱스(Clustered Index)라고도 불리며, 그 외의 일반적인 인덱스는 논클러스터 인덱스로 불린다. 그리고 이러한 클러스터링 특성 때문..
1. 트랜잭션의 격리 수준(Transaction Isolation Level)트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 트랜잭션의 격리 수준은 격리(고립) 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED가 존재한다. 참고로 아래의 예제들은 모두 자동 커밋(AUTO COMMIT)이 false인 상태에서만 발생한다.SERIALIZABLEREPEATABLE READREAD COMMITTEDREAD UNCOMMITED SERIALIZABLESERIALIZABLE은 가장 ..