'React.js, 스프링 부트, AWS로 배우는 웹 개발 101'을 읽고 정리한 글입니다. 백엔드 개발을 위해 사용할 도구들은 다음과 같다. 스프링 부트 Gradle Lombok Postman REST Layered Architecture 도구의 사용법을 아는 것도 중요하지만 이 도구들을 사용하는 이유를 아는 것도 중요하다. 이 도구들이 어떤 문제를 해결하는지, 또 어떻게 해결하는지에 대해 알아볼 예정이다. Todo 서비스는 Todo 생성/검색/수정/삭제 라는 네 가지 기본적인 기능을 제공한다. 생성, 검색, 수정, 삭제의 네 가지 기본 기능을 CURD Create, Retrieve, Update, Delete 라고 한다. 이 기능을 REST API의 형태로 구현하고 그 과정에서 아키텍처 디자인, 아키..
'React.js, 스프링 부트, AWS로 배우는 웹 개발 101'을 읽고 정리한 글입니다. 1.1 Todo 웹 애플리케이션 1.1.1 Todo 웹 애플리케이션 기능 Todo 생성: + 버튼을 클릭해 Todo 아이템 생성 Todo 리스트: 생성된 아이템 목록을 화면에서 확인 Todo 수정: Todo 아이템을 체크하거나 내용 수정 Todo 삭제: Todo 아이템 삭제 회원가입: 사용자는 회원 가입하고 계정을 통해 Todo 애플리케이션에 접근 가능 로그인: 계정으로 로그인 로그아웃: 로그인한 사용자는 로그아웃 가능 1.1.2 Todo 웹 애플리케이션 아키텍처 프론트엔드와 백엔드 서버가 분리된 이 아키텍처에서 브라우저는 백엔드의 REST API를 이용해서 HTTP 요청을 보낸다. 로컬 환경에서 실행하거나 EC..
'React.js, 스프링 부트, AWS로 배우는 웹 개발 101'을 읽고 정리한 글입니다. 서비스 개발 및 운영에 대해 전반적인 경험을 할 수 있다. 다수의 사용자를 지원하는 웹 기반의 Todo 애플리케이션을 구현하고 배포한다. 그 과정에서 프론트엔드와 백엔드 서버가 분리된 아키텍처를 직접 경험하고 구현한다. 프론트엔드 - React.js 백엔드 - 스프링 부트 Todo 애플리케이션의 기본적인 기능을 구현한 후, 인증 기능을 추가해 다수의 사용자를 지원할 예정이다. 백엔드에서는 JWT를 이용해 스케일의 한계를 극복하는 방법 프론트엔드에서는 로그인 상태를 유지하는 방법에 대해 알아보고 구현 만든 애플리케이션을 AWS에 배포 로드 밸런서, 오토스케일링그룹 등 스케일링에 필요한 서비스를 사용하고 도메인을 구..
Linking? 메모리에 로드(복사)하고 실행할 수 있는 단일 파일로 다양한 코드와 데이터를 수집하고 결합하는 프로세스 Memory에 Load하고 실행할 수 있는 단일 파일로, 다양한 코드와 데이터를 수집하고 결합하는 Process Compile time, Load time, Run time에 Linking이 수행된다. Linking은 최신 시스템에서 Linker라고 하는 프로그램에 의해 자동으로 수행된다. Why we have to learn about linking? build large programs Linker가 reference를 해결하는 방법, Library가 무엇인지, 그리고 Linker가 reference를 해결하기 위해 Library를 사용하는 방법을 이해하지 않는 한, 이러한 종류의 ..
Garbage collection void foo() { int *p = malloc(128); return; /* p block is now garbage */ } 위 코드에서 p는 stack에 할당되어있고, malloc(128)은 heap에 할당되어 있다. 이 함수가 return 되면 heap에 할당되어 있는 malloc(128)은 어느 변수도 참조하지 못하는 Garbage가 된다. 이러한 Garbage를 자동으로 free 시켜주는 것을 Garbage collection이 한다. C에서 Garbage Collection을 구현하려면 몇 가지 어려움이 존재한다. memory가 언제 free 되는가? 조건에 따라 달라지기 때문에 일반적으로 미래에 어떤 것이 사용될지 알 수 없다. 그러나 특정 Block에..
Dynamic Memory Allocation 프로그래머들은 일반적으로 런타임에 추가적인 가상 메모리를 획득해야 할 때 Dynamic Memory Allocator를 사용 하는 것이 더 편리하다고 생각한다. Dynamic Memory Allocator(mallc)는 Heap이라는 가상 메모리 영역을 관리한다. 세부 정보는 시스템마다 다르지만 일반성의 손실 없이 Heap은 초기화되지 않은 Data 영역 전후에서 시작되어 위로 확장되는 demand-zero memory라고 가정한다. 각 프로세스에 대해 Kernel은 Heap의 상단을 가리키는 변수 brk("break")를 유지한다. Allocator는 Heap을 다양한 크기의 Block들의 모음으로 유지한다. 각 Blcok은 할당되거나 사용 가능한 가상 메..
Crucial concept: Thread Safety 함수가 여러 Concurrent Thread에서 반복적으로 호출될 때 항상 올바른 결과를 생성하는 경우에만 Thread-safe라고 한다. Thread-unsafe 함수의 Class Class 1: 공유 변수를 보호하지 않는 함수 Class 2: 여러 호출에 걸쳐 상태를 유지하는 함수 Class 3: static 변수의 pointer를 반환하는 함수 Class 4: thread-unsafe 함수라 불리는 함수 Thread-Unsafe Functions (Class 1) 공유 변수를 보호하지 못한 함수 FIx: P와 V Semapore 연산을 사용한다. Example: goocnt.c 문제점: 동기화 연산은 코드 실행 속도를 저하시킨다. Thread-..
Using Threads for Parallelism 현대 기계들은 대부분 Multi Core Processor를 가지고 있다. Multi Core Processor의 기계들은 운영 체제 Kernel이 Single Core에 순차적으로 배치되는 것이 아니라 여러 Core에 Parallel로 Concurrent Thread를 Scheduling하기 대문에 이러한 기계에서 Concurrent 프로그램이 더 빨리 실행되는 경우가 많다. 이러한 Parallelism을 이용하는 것은 웹 서버, 데이터베이스 서버, 대형 과학 코드와 같은 응용 프로그램에서 매우 중요하며 웹 브라우저, 스프레드시트, 문서 프로세서와 같은 주류 응용 프로그램에서 점점 더 유용해지고 있다. Exploiting parallel execut..
Improper Synchronization 공유 변수는 편리할 수 있지만 심각한 동기화 오류가 발생할 수 있다. Example /* WARNING: This code is buggy! */ #include "csapp.h" void *thread(void *vargp); /* Thread routine prototype */ /* Global shared variable */ volatile long cnt = 0; /* Counter */ int main(int argc, char **argv) { long niters; pthread_t tid1, tid2; /* Check input argument */ if (argc != 2) { printf("usage: %s \n", argv[0]); ex..
Shared Variables in Threaded Programs Concurrent Programming 접근법을 3가지 배웠다. Process Process는 자신만의 주소 공간이 있기 때문에 공유 메모리가 없다. IPC를 통해서 공유 메모리나 메시지 패싱을 OS의 도움을 받아 Process 간 통신이 가능하다. Event (I/O Multiplexing) Epoll이나 Select같은 시스템 콜을 사용해서 Process 하나에 File Descriptor Socket을 배열로 만들어서 Socket에 메시지가 오면 이벤트가 발생했다는 것을 확인할 수 있다. 단일 주소 공간을 가지고 있지만, 공유가 용이했다. Thread Thread는 Process내에서 생성 소멸된다. Context Switch 오..
Threads thread는 프로세스의 context에서 실행되는 logical flow다. 현대의 시스템은 하나의 프로세스에서 동시에 실행되는 여러 스레드를 가진 프로그램을 작성할 수 있게 해 준다. 스레드는 커널에 의해 자동으로 schedule 된다. 각 스레드는 고유한 정수 스레드 ID(TID), 스택, 스택 포인터, 프로그램 카운터, 범용 레지스터, 조건 코드를 포함한 자체 thread context를 가지고 있다. 프로세스에서 실행되는 모든 스레드는 해당 프로세스의 전체 가상 주소 공간을 공유한다. 스레드에 기반한 logical flow는 프로세스 및 I/O multiplexing의 flow에 기반한다. 프로세스와 마찬가지로 스레드는 커널에 의해 자동으로 schedule 되며 정수 ID에 의해 ..
Concurrent Programming with I/O Multiplexing 사용자가 표준 입력에 입력하는 대화형 명령에 응답할 수 있는 echo server를 작성하도록 요청받았다고 가정한다. 이 경우 server는 connection request를 하는 network client와 키보드에서 command line을 입력하는 사용자 등 두 가지 독립적인 I/O 이벤트에 응답해야 한다. 어떤 이벤트를 먼저 기다려야 할까? 어느 쪽도 이상적이지 않다. connection request이 accept되기를 기다리는 경우 입력 명령에 응답할 수 없다. 마찬가지로, read에서 명령 입력을 기다리는 경우 connection request를 응답할 수 없다. 이 딜레마에 대한 한 가지 해결책은 I/O mu..