분류 전체보기 367

[Database] 무결성 제약조건

1. 무결성 제약조건이란 데이터 무결성: 데이터의 정확성 또는 유효성을 의미 무결성 제약조건: 데이터베이스 상태가 만족시켜야 하는 조건이자 사용자에 의한 데이터 베이스 갱신이 데이터베이스의 일관성을 깨지 않도록 보장하는 수단 무결성 제약조건의 목적: 일관된 데이터 베이스 상태를 정의하는 규칙들을 명시적으로 정의하여서 권한을 가진 사용자들로부터 데이터베이스의 정확성을 지키는 것 무결성 제약조건의 장점: 스키마를 정의할 때 일관된 데이터베이스 상태를 정의하는 규칙들을 한 번만 명시하면 되고, 데이터베이스가 갱신 될 때 DBMS가 자동적으로 이러한 일관성 조건을 검사해주므로 응용 프로그램단에서 이를 일일이 신경써주지 않아도 된다. 2. 무결성 제약조건의 종류 도메인 제약조건: 각 애트리뷰터 값이 반드시 원자값..

[TDD] node-mocks-http 모듈, Jest의 beforeEach 사용

[TDD] TDD 시작하기 (Unit Test, Jest)의 와 에서 몽구스 모델을 이용한 Products 데이터베이스 테이블에 product 데이터를 저장(create)할 때 단계적으로 유닛테스트를 진행하면서 구현해보았다. 그래서, 구현하고자 했던 것은 product 데이터 생성을 위한 함수 작성 createProduct 함수를 호출할 때 Product Model의 Create 메소드가 호출 이었고, 이에 대한 유닛 테스트 코드는 // test/unit/product.test.js const productController = require('../../controller/products'); const productModel = require('../../models/Product'); //Mock함..

Dev/SW Engineering 2021.02.24

[TDD] TDD 시작하기 (Unit Test, Jest)

Unit Test 유닛 테스트란 프로그래밍 후 소스 코드의 프로그램의 기본 단위인 모듈이 의도대로 정확히 작동하는지 검증하는 절차이다. 즉, 소스 코드의 개별 단위를 테스트하여 사용할 준비가 되었는지 확인하는 테스트 방법이다. 1) 유닛 테스트를 하는 이유 프로그램이 커서 메모리가 많이 들고 다른 리소스(데이터베이스 등)이 막 필요한 경우 로컬 환경에서 코드를 실행시켜보기도 어렵고, 그걸 매번 수동으로 QA해보기도 어렵다. 그래서 유닛 테스트를 만들어서 빠르게 자신의 코드가 정상적으로 작동 하는지 확인 하는 것이 좋다. 종속성이 있는 다른 클래스들에서 버그가 나는 것을 방지하기 위해서이다. 예를 들어, A Class에서 버그가 나는데, 그것이 A class 내의 Common class 에서 발생하는 에러..

Dev/SW Engineering 2021.02.22

[운영체제] 가상 메모리의 이해

가상 메모리(Virtual Memory) 리눅스의 각 프로세스마다 4GB를 차지한다. 그런데 통상 메모리는 16GB? 정도인 것도 있고, 코드는 메모리에 반드시 있어야 하는데 여러개의 프로세스들 실행할 때 메모리 크기의 한계를 어떻게 극복할 수 있을까? 즉 어떻게 하면 한정된 메모리에서 여러 프로세스를 실행시킬 수 있도록 메모리 구조를 가져갈 것인가? 이때 활용하는 것이 가상 메모리이다. 또한 가상 메모리를 통해 프로세스간 공간 분리로 프로세스 이슈가 전체 시스템에 영향을 주지 않을 수 있다. 가상 메모리의 기본 아이디어는 프로세스는 가상 주소를 사용하고, 데이터를 사용(읽고/쓰기) 할 때 물리 주소로 변환해주면 된다는 것이다. 즉, 가상 메모리 시스템을 사용하기 위해서는 가상 주소(virtual add..

[운영체제] Semaphore와 deadlock, starvation

+ 운영체제를 공부중이고, 오늘은 Semaphore와 deadlock, starvation에 대해서 공부하였는데...ㅠ 해당 내용에 대해서는 깊은 이해가 아직 부족합니다. 앞으로 계속 보충하여 해당 포스트를 수정해 나갈 것입니다. [운영체제] Thread 여기서 thread의 동기화 이슈를 살펴보았다. 다시 한번 정리해보면, 공유 데이터(shared data)의 동시 접근(concurrent access)은 데이터의 불일치 문제(inconsistency)를 발생시킬 수 있다. 이를 해결하기 위한 몇가지 충족 조건 1) Mutual Exclusion 이를 해결하기 위해서는 Mutual exclusion(상호 배제)기법이 필요하다. 스레드는 프로세스의 모든 데이터에 접근 할 수 있으므로 여러 스레드가 변경하..

동적 계획법(Dynamic Programming)

동적계획법이란, 부분 문제를 해결한 결과를 이용하여 전체 문제를 해결하는 것이다. 즉, '나'를 해결함으로써 더 큰 '나'를 해결하는 것 => '나'가 두 번 나오는 것으로 봐서 딱 떠오르는게 있다면?!! 바로 재귀호출! 즉, 동적계획법은 재귀호출을 사용한다. 동적계획법이 어떤 식으로 활용 될 수 있는지 예제 문제를 통해 살펴보자. 예) 피보나치 수 구하기 - 피보나치 수열의 n번째 수를 구하시오 풀이 1. 먼저 피보나치 수열의 특성 상 '재귀만 사용하여' 풀 수 있다. def getFibo(n): if n < 2 : return n else: return getFibo(n-1) + getFibo(n-2) 그런데 이 해결법이 가장 효과적일까? 아니다. 이 방법은 이전에 한 번 계산한 적이 있던 것이 다시..

[운영체제] Thread

1. Processs vs Thread Process 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램, 즉 메모리에 올라와 실행되고 있는 독립적인 프로그램 인스턴스 Thread 프로세스 내에서 동작되는 여러 실행의 흐름 단위 Processs는 독립적, Thread는 프로세스의 서브넷 Process는 각각 독립적인 자원을 가진다. Thread는 프로세스의 자원을 공유한다. Process는 자신만의 주소 영역을 가진다. Thread는 주소 영역을 공유한다. Process간에는 IPC기법으로 통신해야하지만 Thread는 필요없다. (IPC에 대해서는 아직 공부가 더 필요한 상태..) 2. Thread - Light Weight Process라고도 함 - 프로세스 간에는 각 프로세스의 데이터 접근이 불가하다..

[운영체제] Process 구조, Process와 컨텍스트 스위칭

프로그램을 작성하다보면 실제 실행파일의 구조를 이해해야하는 경우가 많다. (깊게 디버깅을 해야하는 경우) 이런 경우를 위해서라도 프로세스 구조를 알아야할 필요가 있다. 프로세스의 구조 TEXT(CODE): 컴파일된 코드가 들어가는 부분 DATA: 변수/초기화된 데이터 STACK(스택 프레임): 임시 데이터(함수 호출, 로컬 변수 등) HEAP: 코드에서 동적으로 만들어지는 데이터 아래의 코드를 예시로 프로세스 구조를 그려보면 이와 같다.(단, 프로그램에서 파이썬 코드를 예시로 들었지만 C언어처럼 컴파일 된다고 가정하게 보기!) HEAP 여기서 HEAP이 코드에서 동적으로 만들어지는 메모리인데, 어떻게 만들어지고, 사용되는지 알아보자, C언어에는 malloc이라는 메서드가 있다. 이 메서드로 명시한 메모리..

[운영체제] Interrupt

인터럽트란, 어느 한 순간 CPU가 실행하는 명령은 PC(Program Counter)가 가리키는 명령 하나이다. 이렇게 CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치와 커뮤니케이션 해야할 때나, 예외상황이 발생하여 처리가 필요할 경우가 생길 수 있다. 이 때 CPU에 알려서 처리하는 기수를 인터럽트라고 한다. 인터럽트의 필요성 1. 선점형 스케쥴러를 구현 하기 위해서는 프로세스 running중에 스케쥴러가 이를 중단시키고, 다른 프로세스로 교체하기 위해, 현재 프로세스의 실행을 중단시킨다. 그러려면 스케쥴러 코드가 실행되어야 하는데, 이 때 잠시 인터럽트가 사용된다. (타이머 인터럽트) 2. I/O Device와의 커뮤니케이션 예를 들어, 저장 매체에서 데이터 처리가 완료됐을 때, ..

[운영체제] 선점형/비선점형 스케쥴러

1. 비선점형 스케쥴러(Non-preemptive Scheduling) 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없음 예를 들어, CPU에 있는 A프로세스의 상태가 자체적으로 block되거나, terminated되어야만, 그제서야 스케쥴러가 B프로세스가 실행 시킬 수 있다.즉,스케쥴러가 CPU에 있는 프로세스를 선점,제어 할 수 없다. 그림으로 비선점형 스케쥴러가 작동하는 방식을 보면, 2. 선점형 스케쥴러(Preemptive Scheduling): 하나의 프로세스가 다른 프로세스 대신에 프로세서(CPU)를 차지할 수 있음. 즉, 프로세스 상태가 running 중에도 스케쥴러가 이를 중단(ready) 시키고, 다른 프로세스로 교체할 수 있다. 예를 들어, 시분할 시스템같은 경우..