본문 바로가기

(18)

운영체제와 컴퓨터

운영체제 소개 일상 생활 속의 운영체제 일반 컴퓨터나 노트북의 전원을 켜면 가장먼저 만나게 되는 소프트웨어 예시 개인용 컴퓨터: Window, Mac 대형 컴퓨터: Unix, Linux 모바일: iOS, Android MP3, 네비게이션, PMP 등 작은 전자기기: 임베디드 운영체제(or 임베디드 시스템) 임베디드 운영체제는 CPU의 성능이 낮고 메모리 크기가 작은 기계에 설치되기 때문에 일반 운영체제에 비해 몇 가지 기능이 빠져있다. 또한 임베디드 운영체제가 있는 기계는 기능을 계속 향상할 수 있다. 필요성 초기의 컴퓨터는 정해진 계산만 수행했기 때문에 특별한 사용 규칙이 필요 없었다. 그러나 메모리, CPU 등의 성능이 향상되고, 여러 작업을 동시에 할 수 있는 컴퓨팅 환경이 조성되면서 사용 규칙이 ..

[Database] - Anomaly

Anomaly 정규화를 해야하는 이유는 잘못된 테이블 설계로 인해 Anomaly(이상 현상)가 나타나기 떄문이다. 여기서 Anomaly가 무엇인지 알아보자. ex) {Student ID, CourseID, Department, Course ID, Grade} 1) 삽입 이상(Insertion Anomaly) 기본키가 {Student ID, Course ID}인 경우 Course를 수강하지 않은 학생은 Course ID가 없는 현상이 발생한다. 결국, Course ID를 Null로 할 수 밖에 없는데, 기본키는 Null이 될 수 없으므로 테이블에 추가될 수 없다. 굳이 삽입하기 위해서는 '미수강'과 같은 Course ID를 만들어야 한다. 불필요한 데이터를 추가해야 삽입할 수 있는 상황 → ..

[Database] - JOIN

JOIN 조인이란? 두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법 테이블을 연결하려면, 적어도 하나의 컬럼을 서로 공유하고 있어야 하므로 이를 이용하여 데이터 검색에 활용한다. JOIN 종류 INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN CROSS JOIN SELF JOIN INNER JOIN 교집합으로, 기준 테이블과 join 테이블의 중복된 값을 보여준다. SELECT A.NAME, B.AGE FROM EX_TABLE A INNER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP; LEFT OUTER JOIN 기준테이블값과 조인테이블과 중복된 값을 보여준다. 왼쪽테이블 기준으로 JOIN을 한..

[Database] - Injection

SQL Injection 해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법을 말한다. 공격 방법 1) 인증 우회 보통 로그인을 할 때, 아이디와 비밀번호를 input 창에 입력한다. 예를 들어, 아이디가 abc 비밀번호가 1234일 때, 쿼리는 아래와 같은 방식으로 전송될 것이다. SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234"; SQL Injection으로 공격할 때, input 창에 비밀번호를 입력함과 동시에 다른 쿼리문을 함께 입력하는 것이다. 1234; DELETE * FROM USER WHERE ID = "1"; 보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True가 ..

[Database] - SQL vs NoSQL

SQL과 NoSQL의 차이 웹 앱을 개발할 때, 데이터베이스를 어떤 것을 사용할지 고민하게 된다. MySQL과 같은 SQL을 사용할까? 아니면 MongoDB와 같은 NoSQL을 사용할까? 보통 Spring에서 개발할 때는 MySQL을, Node.js에서는 MongoDB를 주로 사용했을 것이다. 하지만 그냥 단순히 프레임워크에 따라 결정하는 것이 아니다. 프로젝트를 진행하기에 앞서 적합한 데이터베이스를 선택해야 한다. 차이점을 알아보자. SQL (관계형 DB) SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있다. 관계형 데이터베이스에는 핵심적인 두 가지 특징이 있다. 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다. 데이터는 관계를 통해 여러 테이블에 분산된다. 데이터..

[Database] - 트랜잭션(Transaction)

트랜잭션 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위 상태를 변화시킨다는 것은 SQL 질의어를 통해 DB에 접근하는 것이다. SELECT INSERT DELETE UPDATE 작업 단위 → 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것 ex) 게시판에서 사용자가 글을 작성하고 올리기 버튼을 누른 후 게시판에 다시 돌아오면 게시판에 내가 쓴 글이 업데이트된 상태를 볼 수 있다. 이때 DB 작업 올리기 버튼을 누른다: INSERT문을 사용해 사용자가 입력한 게시글 데이터를 옮김. 게시판 새로 구성: SELECT문을 사용해 최신 정보를 유지. 현재 작업 단위: INSERT문 + SELECT문 이를 통틀어 하나의 트랜잭션이라고 한다. 즉, 하나의 트랜잭션 설계를 잘 만드는 것이 데이터..

Computer Science/OS

운영체제와 컴퓨터

728x90

운영체제 소개

일상 생활 속의 운영체제

일반 컴퓨터나 노트북의 전원을 켜면 가장먼저 만나게 되는 소프트웨어

예시

  • 개인용 컴퓨터: Window, Mac
  • 대형 컴퓨터: Unix, Linux
  • 모바일: iOS, Android
  • MP3, 네비게이션, PMP 등 작은 전자기기: 임베디드 운영체제(or 임베디드 시스템)

임베디드 운영체제는 CPU의 성능이 낮고 메모리 크기가 작은 기계에 설치되기 때문에 일반 운영체제에 비해 몇 가지 기능이 빠져있다. 또한 임베디드 운영체제가 있는 기계는 기능을 계속 향상할 수 있다.

필요성

초기의 컴퓨터는 정해진 계산만 수행했기 때문에 특별한 사용 규칙이 필요 없었다. 그러나 메모리, CPU 등의 성능이 향상되고, 여러 작업을 동시에 할 수 있는 컴퓨팅 환경이 조성되면서 사용 규칙이 필요해졌다. 복잡한 작업 환경에 규칙이 없으면 기계를 망가뜨릴 수도 있기 떄문에 등장한 것이 바로 운영체제이다.

운영체제 없이도 컴퓨터는 작동한다(ex. 애니악). 운영체제가 없는 기계는 만들 당시에 기능 외에 다른 기능을 추가하거나 성능을 향상할 수 없기 때문에 처음에 설계한 대로만 사용할 수 있다. 반면에 운영체제가 있는 기계는 새로운 기능의 추가나 성능의 변경이 가능하므로 성능 및 효율성의 향상을 꾀할 수 있으며, 이러한 기계를 프로그램이 가능한(programmable) 기계라고 부른다. 운영체제는 성능 향상뿐 아니라 자원 관리(resource management)라는 중요한 역할도 한다. 많은 응용프로그램에 비해 컴퓨터를 구성하는 장치는 매우 제한적이다. 즉, 대부분이 하나의 키보드, CPU, 메모리, 모니터, 마우스, 하드디스크로 이루어져 있어 각각의 응용 프로그램이 장치를 서로 독차지하려한다. 이러한 문제를 해결하려면 자원을 관리하는 강력한 중재자가 필요하다. 이 중재자는 누구에게 먼저 키보드를 주어야 할지, 누구에게 먼저 모니터를 주어야 할지 등을 결정하고, 악의적인 응용 프로그램으로부터 컴퓨터 자원을 보호하는 역할도 담당한다.

운영체제는 사용자가 직접 자원에 접근하는 것을 막음으로써 자원을 보호하고 관리한다. 만약 사용자가 하드디스크에 데이터를 저장할 수 있다면 악의적인 사용자가 데이터를 지우거나 덮어쓰는 일이 발생할 수도 있다. 이를 방지하기 위해 운영체제는 응용 프로그램과 사용자에게 모든 자원을 숨긴다.

운영체제는 사용자가 자원에 직접 접근하지 못하도록 하는 대신 자원을 이용할 수 있는 여러 가지 방법을 제공한다. 이와 같이 사용자가 컴퓨터를 사용할 수 있도록 해주고 그 결과를 알려주는 것을 인터페이스(interface)라고 한다. 운영체제는 사용자가 컴퓨터를 보다 쉽게 사용할 수 있도록 다양한 인터페이스를 제공함으로써 컴퓨터 자원을 보호함과 동시에 사용자의 편의를 도모한다.

이렇듯 운영체제는 다양한 일을 한다. 운영체제는 사용자에게 인터페이스를 제공하고 응용 프로그램에게 컴퓨터 자원을 골고루 배분해준다. 또한 적당한 시점에 응용 프로그램으로부터 자원을 회수하고, 악의적인 응용 프로그램으로부터 컴퓨터를 보호하기도 한다. 즉, 운영체제는 각각의 응용 프로그램이 활동할 수 있는 환경을 제공하고, 응용 프로그램이 필요로 하는 컴퓨터 자원을 나누어주며, 응용 프로그램으로부터 컴퓨터 자원을 보호하는 강력한 '통치자' 역할을 한다. 인터페이스가 무엇인지, 자원 관리가 무엇인지 아직 정확하게 설명하지 않았지만 적어도 운영체제가 필요한 이유는 이해할 수 있을 것이다.

펌웨어: 운영체제는 하드웨어를 조정하고 관리하는 역할을 하므로 하드웨어의 도움 없이 작동하기가 어렵기 때문에 운영체제를 소프트웨어와 하드웨어의 결합 형태인 펌웨어(firmware)라고 부르기도 한다.

운영체제의 정의

운영체제는 사용자에게 편리한 인터페이스 환경을 제공하고 컴퓨터 시스템의 자원을 효율적으로 관리하는 소프트웨어이다.
운영체제는 응용 프로그램이나 사용자에게 컴퓨터 자원을 사용할 수 있는 인터페이스를 제공하고 그 결과를 돌려준다. 그리고 응용 프로그램이나 사용자에게 모든 컴퓨터 자원을 숨기고 정해진 방법으로만 컴퓨터 자원을 사용할 수 있도록 제한한다. 하드웨어에 대한 모든 책임을 맡고 있는 운영체제를 거치지 않고는 하드웨어에 접근할 수 없다.

image

운영체제의 역할

  • 자원 관리
    운영체제는 자원을 응용프로그램에 나누어주며 사용자가 원활하게 작업할 수 있도록 돕는다.

  • 자원 보호

  • 하드웨어 인터페이스 제공
    운영체제는 복잡한 과정 없이 다양한 장치를 사용할 수 있도록 해주는 하드웨어 인터페이스를 제공한다. 운영체제는 CPU, 메모리, 키보드, 마우스와 같은 다양한 하드웨어를 일관된 방법으로 사용할 수 있도록 지원하기 떄문에 우리는 어떤 회사에서 만든 하드웨어인지 신경 쓸 필요가 없다. (하드웨어 인터페이스 지원은 드라이버를 컴퓨터에 설치해야 가능하다) 드라이버는 운영체제를 설치할 때 자동으로 설치되지만 일부 하드웨어의 경우 따로 설치해야 하는데, 이러한 드라이버를 하드웨어 인터페이스라고 한다. 운영체제는 하드웨어 인터페이스가 자동으로 설치되게 함으로써 하드웨어의 종류에 상관없이 사용할 수 있게 해준다.

  • 사용자 인터페이스 제공
    하드웨어 인터페이스가 다양한 부품을 편리하게 사용하기 위한 것이라면, 사용자 인터페이스는 사용자가 운영체제를 편리하게 사용하도록 지원하기 위한 것이다. 과게어 유닉스 MS-DOS와 같은 운영체제로 작업할 때는 마우스 없이 키보드만 사용했기 때문에 여러모로 불편했고 일반인이 사용법을 배우기가 쉽지 않았다. 그러나 지금은 운영체제가 그래픽 사용자 인터페이스(GUI)를 제공하므로 대부분의 작업을 마우스로 수행한다.

유틸리티 : 운영체제의 기능이 많아지고 구조가 복잡해진 데다 바이러스의 침투 수법이 지능적으로 발전하여 이를 막는 데 한계가 있다. 이로 인해 바이러스 검사, 디스크 조각 모음, 압축 프로그램과 같이 운영체제의 작업을 보조하는 소프트웨어가 등장했는데 이를 유틸리티(utility)라고 부른다.

운영체제의 목표

운영체제가 지향하는 목표는 여러가지인데, 운영체제의 역할과 연결지어 목표를 살펴보자!

  • 효율성
    운영체제의 역할 중 '자원 관리'와 연관되는 목표로 같은 자원을 관리하더라도 효율적으로 관리해야 한다는 의미이다. 적은 자원을 사용하여 더 많은 작업량을 처리하거나, 같은 작업량을 처리하는 데 보다 적은 자원을 사용하는 것이다. 효율적인 자원 관리는 다양한 방법으로 이루어질 수 있는데, 일반적으로 운영체제의 크기를 최소화하고 운영체제가 사용하는 코드를 최적화해야 한다.

  • 안정성
    운영체제는 하드웨어 전체를 관리하는 소프트웨어로, 사용자와 응용 프로그램은 운영체제 위에서 작업을 한다고 볼 수 있다. 따라서 운영체제가 불안정하면 모든 작업이 불안할 수 밖에 없다. 운영체제가 불안하면 그 피해가 고스란히 사용자에게 돌아가기 때문에 운영체제는 안정성이 담보되어야 한다. 이 목표는 '자원 보호'와 연관된다. 사용자와 응용 프로그램의 안전 문제와 하드웨어적인 보안 문제를 처리할 수 있어야 하며, 시스템에 문제가 발생했을 때 이전으로 복구하는 결함 포용(fault tolerant) 기능을 수행해야 한다.

  • 확장성
    운영체제는 다양한 시스템 자원을 추가하거나 제거하기가 편리해야 한다. 즉 확장성이 좋아야 한다. 이는 운영체제의 역할 중 '하드웨어 인터페이스 제공'과 연관되고, 운영체제는 하드웨어의 종류에 상관없이 꽂으면 바로 실행할 수 있는 플러그 앤드 플레이(plug & play) 기능을 제공해야 한다. 또한 하드웨어 제작자의 편리성도 고려해야 한다.

  • 편리성
    사용자가 편리하게 작업할 수 있는 환경을 제공하는 것 또한 운영체제의 목표이다. 이는 운영체제의 역할 중 '사용자 인터페이스 제공'과 연관된다. (사실 운영체제의 입장에서는 효율성만 높이려면 응용 프로그램이나 사용자에게 제약을 가하면 된다.)

운영체제의 역사

운영체제의 역사를 훑어보는 것은 운영체제를 이해하는 좋은 방법이며, 나아가 오늘날의 IT환경을 이해하는 밑거름이 된다.

  • 초창기 컴퓨터(1940년대)
  • 일괄작업 시스템(1950년대)

일괄작업 시스템: 모든 작업을 한꺼번에 처리해야 하고 프로그래밍 실행 중간에 사용자가 데이터를 입력하거나 수정하는 것이 불가능하다. 일괄처리 시스템이라고 부르기도 한다.

  • 대화형 시스템(1960년대 초반)
  • 시분할 시스템

시분할 시스템(time sharing system): 여러 작업을 조금씩 처리하여 작업이 동시에 이루어지는 것처럼 보이게 하는 것. 이때 잘게 나뉜 시간 한 조각을 타임 슬라이스 또는 타임 퀀텀이라고 한다. 오늘날의 컴퓨터에는 대부분 시분할 시스템이 사용된다.

  • 분산 시스템(1970년대 후반)

    네트워크 통신 TCP/IP 프로토콜은 이 시기에 만들어졌다.

분산 시스템: 네트워크상에 분산되어 있는 여러 컴퓨터로 작업을 처리하고 그 결과를 상호 교환하도록 구성한 시스템이다.

  • 클라이언트/서버 시스템(1990년대~현재)
    분산 시스템은 시스템에 참가하는 모든 컴퓨터가 동일한 지위이기 때문에 컴퓨터가 고장 나거나 추가되면 작업을 분배하고 결과를 모으기가 쉽지 않다. 클라이언트/서버 시스템(client/system)은 이러한 문제점을 해결하는 기술로, 모든 컴퓨터의 지위가 동일한 분산 시스템과 달리 작업을 요청하는 클라이언트와 거기에 응답하여 요청받은 작업을 처리하는 서버의 이중구조로 나뉜다.

데몬: 클라이언트/서버 시스템에서는 서버가 멈추지 않고 계속 작동하여 클라이언트의 요청을 처리해야 하는데, 이렇게 멈추지 않고 계속 작동하는 프로그램을 데몬(daemon)이라고 한다. 보통은 데몬을 가진 컴퓨터를 서버라고 부르며, 웹 데몬이 설치된 컴퓨터는 웹 서버, FTP 데몬이 설치된 컴퓨터는 FTP 서버, 이메일 데몬이 설치된 컴퓨터는 이메일 서버라고 한다. 웹 데몬의 역할을 하는 프로그램으로는 아파치 톰캣(Apache Tomcat), IIS(Internet Information Service) 등이 있다.

  • P2P시스템(2000년대 초반~현재)

서버의 부하를 줄일 수 있는 시스템으로 P2P(Peer-to-Peer System)이 만들어졌다. peer는 말단 노드, 즉 사용자의 컴퓨터를 가리키며, P2P는 서버를 거치지 않고 사용자와 사용자를 직접 연결한다는 의미이다. P2P 시스템에서는 서버가 파일 검색만 맡고 사용자 간에 파일 전송이 이루어지기 때문에 서버의 부하가 적다는 것이 장점이다.

  • 기타 컴퓨팅 환경(2000년대 초반~현재)
    2000년대 초반에는 P2P 컴퓨팅 환경과 더불어 그리드 컴퓨팅, 클라우드 컴퓨팅, 사물 인터넷 등의 새로운 컴퓨팅 환경이 탄생했다.

그리드 컴퓨팅: 필요한 컴퓨팅 자원을 구매하여 사용하는 컴퓨팅 환경

클라우드 컴퓨팅: 언제 어디서나 응용 프로그램과 데이터를 자유롭게 사용할 수 있는 컴퓨팅 환경으로 그리드 컴퓨팅과 SaaS를 합쳐놓은 형태이다. 하드웨어를 포함한 시스템이 구름에 가려진 것처럼 사용자에게 보이지 않는 컴퓨팅 환경이라는 의미에서 클라우드라는 명칭이 붙게 되었다.

사물인터넷: 사물에 센서와 통신 기능을 내장하여 인터넷에 연결하는 기술이다. 인터넷으로 연결된 사물들이 데이터를 주고받아 스스로 분석하고 학습한 정보를 사용자에게 제공하거나 새로운 서비스를 창출하는 사물 인터넷은 인공지능, 로봇 공학, 무인 운송 수단, 3D 인쇄, 나노 기술과 더불어 4차 산업혁명을 이끄는 기술이다.

운영체제의 구조

커널과 인터페이스

| 커널(kernel)은 프로세스 관리, 메모리 관리, 저장장치 관리와 같은 운영체제의 핵심적인 기능을 모아놓은 것이다. 운영체제의 성능은 커널이 좌우한다.

운영체제는 크게 두 부분으로 나뉜다. 사용자와 응용프로그램에 인접하여 커널에 명령을 전달하고 실행 결과를 사용자와 응용 프로그램에 돌려주는 인터페이스 그리고 운영체제의 핵심 기능을 모아놓은 커널이다.

운영체제는 커널과 인터페이스를 분리하여, 같은 커널을 사용하더라도 다른 인터페이스를 가진 형태로 제작할 수 있다. 같은 커널이라도 다른 인터페이스가 장착되면 사용자에게는 다른 운영체제처럼 보인다.

image

시스템 호출과 디바이스 드라이버

시스템 호출은 커널이 자신을 보호하기 위해 만든 인터페이스다. 커널은 사용자나 응용 프로그램으로부터 컴퓨터 자원을 보호하기 위해 자원에 직접 접근하는 것을 차단한다. 따라서 자원을 이용하려면 시스템 호출이라는 인터페이스를 이용하여 접근해야 한다.

  • 시스템 호출은 커널이 제공하는 시스템 관련 서비스를 모아놓은 것이며 함수 형태로 제공된다.
  • 운영체제는 커널이 제공하는 서비스를 시스템 호출로 제한하고 다른 방법으로 커널에 들어오지 못하게 막음으로써 컴퓨터 자원을 보호한다.
  • 시스템 호출은 커널이 제공하는 서비스를 이용하기 위한 인터페이스이며, 사용자가 자발적으로 커널 영역에 진입할 수 있는 유일한 수단이다.

드라이버는 커널과 하드웨어의 인터페이스 역할을 한다. 커널은 입출력의 기본적인 부분만 제작하고, 하드웨어의 특성을 반영한 소프트웨어를 하드웨어 제작자에게 받아 커널이 실행될 때 함께 실행되도록 한다. 이때 하드웨어 제작자가 만든 소프트웨어를 디바이스 드라이버라고 부른다.

마우스, 키보드와 같이 복잡하지 않은 디바이스 드라이버는 커널에 포함되어 있어 컴퓨터에 꽂기만 하면 작동되지만 그래픽카드, 프린터와 같이 크기가 크고 복잡한 디바이스 드라이버는 사용자가 직접 설치해야 한다.

커널의 구성

운영체제의 핵심 기능을 모아놓은 커널이 주로 하는 일은 프로세스 관리, 메모리 관리, 파일 시스템 관리, 입출력 관리, 프로세스 간 통신 관리 등이다.

커널의 핵심 기능은 유기적으로 복잡하게 얽혀 있다. 커널은 이러한 기능을 어떻게 구현하는가에 따라 단일형, 계층형, 마이크로 구조 커널로 구분된다.

단일형 구조 커널

단일형 구조 커널은 초창기의 운영체제 구조로, 커널의 핵심 기능을 구현하는 모듈들이 구분 없이 하나로 구성되어 있다.

  • 장점 : 모듈이 거의 분리되지 않았기 때문에 모듈 간의 통신비용이 줄어들어 효율적인 운영이 가능하다.
  • 단점 : 모든 모듈이 하나로 묶여있기 때문에 버그나 오류 처리가 어렵다. 운영체제의 여러 기능이 서로 연결되어 있어 상호 의존성이 높아 기능상의 작은 결함이 시스템 전체로 확산될 수 있다. 다양한 환경의 시스템에 적용하기 어렵다. 여러 종류의 컴퓨터에 이식하려면 수정이 필요한데 단일형 구조에서는 수정이 어렵기 때문에 이식성이 낮다. 현대의 운영체제는 매우 크고 복잡하기 때문에 완전 단일형 구조의 운영체제를 구현하기가 어렵다.

계층형 구조 커널

계층형 구조 커널은 단일형 구조 커널이 발전된 형태로, 비슷한 기능을 가진 모듈을 묶어서 하나의 계층으로 만들고 계층 간의 통신을 통해 운영체제를 구현하는 방식이다.

비슷한 기능을 모아 모듈화했기 때문에 단일형 구조보다 버그나 오류를 쉽게 처리할 수 있다. 오류가 발생했을 때 전체 커널을 고치는 것이 아니라 해당 계층만 따로 수정하면 되기 때문에 디버깅하기도 쉽다. MS의 윈도우를 비롯해 오늘날의 운영체제는 대부분 이 구조로 이루어져 있다.

마이크로 구조 커널

계층형 구조 커널의 운영체제는 다양한 하드웨어와 사용자의 요구를 수용하기 위해 계속 계층과 기능을 추가했다. 그래서 커널의 크기가 계속 커지고 필요한 하드웨어의 용량이 늘어났으며, 커널 소스가 방대해짐에 따라 오류를 잡기도 어려워졌다. 이러한 계층형 구조의 접근 방식과 반대로 개발된 커널이 마이크로 구조(micro architecture) 커널이다.

마이크로 구조 커널 운영체제는 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 제공한다. 커널의 구조를 살펴보면 다른 커널에 비해 운영체제의 많은 부분이 사용자 영역에 구현되어 있다.

커널은 메모리 관리와 프로세스 간의 동기화 서비스를 제공하며, 메모리 관리자와 동기화 모듈은 프로세스 간 통신 모듈로 연결되어 있따. 그러므로 각 모듈은 세분화되어 존재하고 모듈 간의 정보 교환은 프로세스 간 통신을 이용하여 이루어진다.

마이크로 구조에서 각 모듈은 독립적으로 작동하기 때문에 하나의 모듈이 실패하더라도 전체 운영체제가 멈추지 않는다. 또한 많은 컴퓨터에 이식하기 쉽고 커널이 가벼워 CPU 용량이 작은 시스템에도 적용이 가능하다. (이 구조를 사용하는 대표적인 운영체제인 마하(Mach)는 애플의 PC 운영체제인 OS X와 모바일 운영체제인 iOS의 커널로 사용되어 유명하다)

image

가상 머신

C언어는 어셈블리어 같은 저급 언어의 기능을 가지고 있어 시스템 프로그래밍 언어로 적합하며, C 언어로 만든 대표적인 운영체제는 유닉스이다. 그런데 C언어는 윈도우처럼 유닉스와 다른 커널을 가진 운영체제와의 호환성이 떨어진다. 즉, 한쪽에서 만든 소스코드가 다른 운영체제에서는 작동하지 않는다는 의미이다.

이러한 호환성 문제를 해결한 언어가 바로 자바이다. 자바가 작동하는 원리는 매우 간단하다. 운영체제 위에 가상머신(virtual machine)을 만들고 그 위에서 응용 프로그램이 작동하게 하는 것이다.

image

가상머신은 운영체제와 응용 프로그램 사이에서 작동하는 프로그램으로, 가상머신을 설치하면 응용 프로그램이 모두 동일한 환경에서 작동하는 것처럼 보인다. 따라서 개발자가 하나의 코드만 만들면 여러 운영체제에서 똑같이 실행할 수 있다. (자바의 경우 JVM)

728x90
Computer Science/DB

[Database] - Anomaly

728x90

Anomaly

정규화를 해야하는 이유는 잘못된 테이블 설계로 인해 Anomaly(이상 현상)가 나타나기 떄문이다. 여기서 Anomaly가 무엇인지 알아보자.

ex) {Student ID, CourseID, Department, Course ID, Grade}

1) 삽입 이상(Insertion Anomaly)

기본키가 {Student ID, Course ID}인 경우

Course를 수강하지 않은 학생은 Course ID가 없는 현상이 발생한다. 결국, Course ID를 Null로 할 수 밖에 없는데, 기본키는 Null이 될 수 없으므로 테이블에 추가될 수 없다.

굳이 삽입하기 위해서는 '미수강'과 같은 Course ID를 만들어야 한다.
불필요한 데이터를 추가해야 삽입할 수 있는 상황 → Insertion Anomaly

2) 갱신 이상(Update Anomaly)

만약 어떤 학생의 전공 {Department}이 "컴퓨터 → 음악"으로 바뀌는 경우
모든 Department를 "음악"으로 바꾸어야 한다. 그러나 일부를 깜빡하고 바꾸지 못하는 경우, 제대로 파악하지 못한다.
일부만 변경하여 데이터가 불일치하는 모순의 문제 → Uodate Anomaly

3) 삭제 이상 (Deletion Anomaly)

만약 어떤 학생이 수강을 철회하는 경우, {Student ID, Course ID, Department, Course ID, Grade}의 정보 중 Course ID를 삭제하면 Student ID, Department와 같은 학생에 대한 정보도 함께 삭제된다.

튜플 삭제로 인해 꼭 필요한 데이터까지 함께 삭제되는 문제 → Deletion Anomaly

728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - JOIN  (0) 2020.09.25
[Database] - Injection  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
Computer Science/DB

[Database] - JOIN

728x90

JOIN

조인이란?

두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법

테이블을 연결하려면, 적어도 하나의 컬럼을 서로 공유하고 있어야 하므로 이를 이용하여 데이터 검색에 활용한다.

JOIN 종류

  • INNER JOIN

  • LEFT OUTER JOIN

  • RIGHT OUTER JOIN

  • FULL OUTER JOIN

  • CROSS JOIN

  • SELF JOIN

  • INNER JOIN
    image

교집합으로, 기준 테이블과 join 테이블의 중복된 값을 보여준다.

SELECT A.NAME, B.AGE
FROM EX_TABLE A
INNER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP;
  • LEFT OUTER JOIN
    image

기준테이블값과 조인테이블과 중복된 값을 보여준다.

왼쪽테이블 기준으로 JOIN을 한다고 생각하면 편하다.

SELECT A.NAME, B.AGE
FROM EX_TABLE A
LEFT OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP;
  • RIGHT OUTER JOIN
    image

LEFT OUTER JOIN과는 반대로 오른쪽 테이블 기준으로 JOIN하는 것이다.

SELECT A.NAME, B.AGE
FROM EX_TABLE A
RIGHT OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP;
  • FULL OUTER JOIN
    image

합집합을 말한다. A와 B 테이블의 모든 데이터가 검색된다.

SELECT A.NAME, B.AGE
FROM EX_TABLE A
FULL OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP;
  • CROSS JOIN
    image
    모든 경우의 수를 전부 표현해주는 방식이다.
    A가 3개, B가 4개면 3 * 4 = 12개의 데이터가 검색된다.

    SELECT A.NAME, B.AGE
    FROM EX_TABLE A
    CROSS JOIN JOIN_TABLE B;
  • SELF JOIN
    image

자기자신과 자기자신을 조인하는 것이다.
하나의 테이블을 여러번 복사해서 조인한다고 생각하면 편하다.
자신이 갖고 있는 칼럼을 다양하게 변형시켜 활용할 때 자주 사용한다.

SELECT A.NAME, B.AGE
FROM EX_TABLE A, EX_TABLE B;
728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - Anomaly  (0) 2020.09.25
[Database] - Injection  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
Computer Science/DB

[Database] - Injection

728x90

SQL Injection

해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법을 말한다.

공격 방법

1) 인증 우회

보통 로그인을 할 때, 아이디와 비밀번호를 input 창에 입력한다.
예를 들어, 아이디가 abc 비밀번호가 1234일 때, 쿼리는 아래와 같은 방식으로 전송될 것이다.

SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";

SQL Injection으로 공격할 때, input 창에 비밀번호를 입력함과 동시에 다른 쿼리문을 함께 입력하는 것이다.

1234; DELETE * FROM USER WHERE ID = "1";

보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True가 되고 뒤에 작성한 DELETE문도 데이터베이스에 영향을 줄 수도 있게 되는 치명적인 상황이다.

이 밖에도 기본 쿼리문이 WHERE절에 OR문을 추가하여 '1' = '1'과 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작할 수도 있다.

2) 데이터 노출

시스템에서 발생하는 여러 메시지를 이용해 공격하는 방법이다.
보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있는 존재이다. 해커들은 이를 역이용해 악의적인 구문을 삽입하여 에러를 유발시킨다. 예를 들면, 해커는 GET 방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러를 발생시킨다.
이에 해당하는 오류가 발생하면 이를 통해 해당 웹앱의 데이터베이스 구조를 유추할 수 있고 해킹에 활용한다.

방어 방법

1) input 값을 받을 때, 특수 문자 여부 검사하기

로그인 전, 검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아낸다.

2) SQL 서버 오류 발생 시, 해당하는 에러 메시지 감추기

view를 활용해 원본 데이터베이스 테이블에 접근 권한을 높인다. 일반 사용자는 view로만 접근하여 에러를 볼 수 없도록 만든다.

3) prepare statement 사용하기

prepare statement를 사용하면 특수문자를 자동으로 escaping 해준다.
(statement와는 다르게 쿼리문에서 전달인자 값을 ?로 받는 것)이를 활용해 서버 측에서 필터링 과정을 통해서 공격을 방어한다.

728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - Anomaly  (0) 2020.09.25
[Database] - JOIN  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
Computer Science/DB

[Database] - SQL vs NoSQL

728x90

SQL과 NoSQL의 차이

웹 앱을 개발할 때, 데이터베이스를 어떤 것을 사용할지 고민하게 된다.

MySQL과 같은 SQL을 사용할까? 아니면 MongoDB와 같은 NoSQL을 사용할까?

보통 Spring에서 개발할 때는 MySQL을, Node.js에서는 MongoDB를 주로 사용했을 것이다.
하지만 그냥 단순히 프레임워크에 따라 결정하는 것이 아니다. 프로젝트를 진행하기에 앞서 적합한 데이터베이스를 선택해야 한다.
차이점을 알아보자.

SQL (관계형 DB)

SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색 할 수 있다.
관계형 데이터베이스에는 핵심적인 두 가지 특징이 있다.

  • 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
  • 데이터는 관계를 통해 여러 테이블에 분산된다.

데이터는 테이블에 레코드로 저장되는데, 각 테이블마다 명확하게 정의된 구조가 있다. 해당 구조는 필드의 이름과 데이터 유형으로 정의된다.

따라서 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다. 즉, 스키마를 수정하지 않는 이상은 정해진 구조에 맞는 레코드만 추가가 가능한 것이 관계형 데이터베이스의 특징 중 하나이다.

또한, 데이터의 중복을 피하기 위해 관계를 이용한다.
image

하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어지는 장점이 있다.

NoSQL (비관계형 DB)

말 그대로 관계형 DB의 반대다.
스키마도 없고, 관계도 없다!

NoSQL에서는 레코드 문서(documents)라고 부른다.
여기서 SQL과 핵심적인 차이가 있는데, SQL은 정해진 스키마를 따르지 않으면 데이터 추가가 불가능했다. 하지만 NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.

문서(documents)는 Json과 비슷한 형태를 가지고 있다. 관계형 데이터베이스처럼 여러 테이블에 나누어담지 않고, 관련 데이터를 동일한 '컬렉션'에 넣는다. 따라서 위 사진에 SQL에서 진행한 Orders, Users, Products 테이블로 나눈 것을 NoSQL에서는 Orders에 한꺼번에 포함해서 저장하게 된다. 따라서 여러 테이블에 조인할 필요없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 NoSQL이다. (NoSQL에는 Join이라는 개념이 존재하지 않음)

그러면 Join하고 싶을 때 NoSQL은 어떻게 할까?

컬렉션을 통해 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하도록 한다.

하지만 이러면 데이터가 중복되어 서로 영향을 줄 위험이 있다. 따라서 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터일 때 NoSQL을 쓰면 상당히 효율적이다.

확장 개념

두 데이터베이스를 비교할 때 중요한 Scaling 개념도 존재한다.

데이터베이스 서버의 확장성은 '수직적' 확장과 '수평적' 확장으로 나누어진다.

  • 수직적 확장: 단순히 데이터베이스 서버의 성능을 향상시키는 것 (ex. CPU 업그레이드)
  • 수평적 확장: 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미(하나의 데이터베이스에서 작동하지만 여러 호스트에서 작동)

데이터 저장 방식으로 인해 SQL 데이터베이스는 일반적으로 수직적 확장만 지원함

수평적 확장은 NoSQL 데이터베이스에서만 가능

그럼 둘 중에 뭘 선택?

정답은 없다. 둘다 훌륭한 솔루션이고 어떤 데이터를 다루느냐에 따라 선택을 고려해야 한다.

SQL 장점

  • 명확하게 정의된 스키마, 데이터 무결성 보장
  • 관계는 각 데이터를 중복없이 한번만 저장

SQL 단점

  • 덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정이 힘듦)
  • 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음
  • 대체로 수직적 확장만 가능함

NoSQL 장점

  • 스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
  • 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐
  • 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능

NoSQL 단점

  • 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
  • 데이터 중복을 계속 업데이트 해야 함
  • 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한번만 수행이 가능)

SQL 데이터베이스 사용이 더 좋을 때

  • 관계를 맺고 있는 데이터가 자주 변경되는 애플리케이션의 경우

NoSQL에서는 여러 컬렉션을 모두 수정해야 하기 때문에 비효율적

  • 변경될 여지가 없고, 명확한 스키마가 사용자와 데이터에게 중요한 경우

NoSQL 데이터베이스 사용이 더 좋을 때

  • 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
  • 읽기는 자주 하지만, 데이터 변경은 자주 없는 경우
  • 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)

하나의 제시 방법이지 완전한 정답이 정해져 있는 것은 아니다.
SQL을 선택해서 복잡한 JOIN문을 만들지 않도록 설계하여 단점을 없앨 수도 있고,
NoSQL을 선택해서 중복 데이터를 줄이는 방법으로 설계해서 단점을 없앨 수도 있다.

728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - JOIN  (0) 2020.09.25
[Database] - Injection  (0) 2020.09.25
[Database] - 트랜잭션(Transaction)  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
[Database] - Key  (0) 2020.09.25
Computer Science/DB

[Database] - 트랜잭션(Transaction)

728x90

트랜잭션

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위

  • 상태를 변화시킨다는 것은 SQL 질의어를 통해 DB에 접근하는 것이다.

    SELECT
    INSERT
    DELETE
    UPDATE
  • 작업 단위 → 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것

  • ex) 게시판에서 사용자가 글을 작성하고 올리기 버튼을 누른 후 게시판에 다시 돌아오면 게시판에 내가 쓴 글이 업데이트된 상태를 볼 수 있다.

  • 이때 DB 작업

    • 올리기 버튼을 누른다: INSERT문을 사용해 사용자가 입력한 게시글 데이터를 옮김.
    • 게시판 새로 구성: SELECT문을 사용해 최신 정보를 유지.
  • 현재 작업 단위: INSERT문 + SELECT문

    • 이를 통틀어 하나의 트랜잭션이라고 한다.
  • 즉, 하나의 트랜잭션 설계를 잘 만드는 것이 데이터를 다룰 때 많은 이점을 가져다준다.

트랜잭션 특징

  • 원자성(Atomicty)
    • 트랜잭션이 DB에 모두 반영되거나 혹은 전혀 반영되지 않아야 한다.
  • 일관성(Consistency)
    • 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
  • 독립성(Isolation)
    • 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
  • 지속성(Durability)
    • 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.

Commit

  • 하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산이다.

Rollback

  • 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우
  • 트랜잭션이 정상적으로 종료되지 않았을 때, last consistent state(ex. 트랜잭션의 시작 상태)로 roll back 할 수 있다.
728x90

'Computer Science > DB' 카테고리의 다른 글

[Database] - Injection  (0) 2020.09.25
[Database] - SQL vs NoSQL  (0) 2020.09.25
[Database] - Index(인덱스)  (0) 2020.09.25
[Database] - Key  (0) 2020.09.25
[Database] - Redis  (0) 2020.09.25