[TIL] 1월 28일

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커란?

컨테이너 기반의 오픈소스 가상화 플랫폼

서버에서의 컨테이너란?

다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

컨테이너

  • 격리된 공간에서 프로세스가 동작하는 기술
  • 프로세스를 격리
  • VirtualBox와 같은 가상 머신은 호스트 OS 위에 게스트 OS 전체를 가상화하는 방식, 무겁고 느리다는 단점
  • 리눅스에서 프로세스를 격리하는 방식을 리눅스 컨테이너라 함
    • 단순히 프로세스를 격리시켜서 가볍고 빠르게 동작한다.
    • CPU나 메모리는 프로세스가 필요한 만큼만 사용하고 성능적으로 거의 손실이 없다.
      • 도커의 기본 네트워크 모드는 Bridge 모드
      • 이건 약간의 성능 손실 있음
      • 네트워크 성능이 중요한 프로그램은 - -net=host 옵션 고려
  • 하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행됨, 마치 가벼운 VM을 사용하는 느낌

이미지

  • 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것 (Immutable)
  • 컨테이너는 이미지 실행 상태
  • 추가되거나 변하는 값은 컨테이너에 저장됨
  • 같은 이미지에서 여러개의 컨테이너 생성 가능
  • 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 그대로 남아있다.(변하지 않음)
  • 우분투 이미지는 우분투를 실행하기 위한 모든 파일을 갖고 있고, MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 명령어, 포트 정보등을 갖고 있다.

Database의 기초

Database의 기초

데이터 베이스(DB)는 공유되어 사용될 목적으로 관리되는 데이터 집합

관계형 데이터베이스(RDBMS)

비 관계형 데이터베이스(Non-relational database)

DB를 왜 사용할까?

애플리케이션에서 데이터는 램에 존재하는데, 애플리케이션 종료시 메모리에 존재했던 데이터를 다시 읽을 수 없다.

데이터를 장기 보관하기 위해서 DB를 사용한다.

관계형 데이터베이스 관리 시스템

관계형 데이터 모델에 기초를 둔 데이터베이스 시스템

관계형 데이터 : 데이터를 서로 상호관련성을 가진 형태로 표현한 데이터

SQL(Structured Query Language)로 관계형 데이터베이스의 데이터를 관리한다.

관계형 데이터베이스의 특징

  • 모든 데이터들은 2차원 테이블로 표현한다.
  • 각각의 테이블은 row(각 항목의 실제 값들), column(테이블의 각 항목)으로 구성된다.
  • 각각의 row는 고유 키(Primary Key)가 있고, 주로 이 primary key 를 통해서 row를 찾거나 인용(reference)한다.
  • 테이블들은 서로 상호관련성을 가지고 서로 연결될 수 있다.

테이블

테이블끼리의 연결에는 3가지 종류가 있다.

  • One To One : 테이블 A의 row와 테이블B의 row가 정확히 일대일 매칭이 되는 관계
  • One To Many : 테이블 A의 row가 테이블B의 여러 row와 연결되는 관계
  • Many To Many : 테이블A의 여러 row가 테이블B의 여러 row와 연결이 되는 관계

테이블을 나누고 연결하는 이유?

테이블들은 Foreign Key(외부 키)라는 개념을 사용하여 연결한다.

  • 하나의 테이블에 모든 정보를 넣으면 중복될 수 있다.
    • 이 경우 테이블 하나에 부하를 크게 준다.
    • 고객이 개명해서 아이디는 동일한데 이름이 다른 row가 있을 경우, 어떤 이름이 정확한지 구별하기 힘들다.
  • 결론 : 테이블을 나누고 필요한 테이블끼리 연결하면 중복되는 데이터도 없고, 서로 같은 데이터이지만 부분적으로 다른 데이터가 생기는 문제를 해결할 수 있다. (normalization)

트랜잭션(Transaction)이란?

  • 데이터베이스의 쿼리를 가장 작은 단위의 업무로 쪼갠 것
    • 쿼리 ? : 데이터베이스에 정보를 요청하는 것
  • ACID를 제공함으로서 트랙잭션이 안전하게 수행되는 것을 보장
  • 트랜잭션은 일련의 작업들이 하나의 작업으로 취급되어 모두 다 성공하거나 모두 다 실패하게 된다. (Commit & rollback)

ACID(Atomicity, Consistency, Isolation, Durability)

ACID는 트랜잭션의 4가지 속성

  • 원자성(Atomicity)
    • 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는다는 것을 보장하는 것
    • 예를 들어, 자금 이체는 성공할 수도 있고 실패할 수도 있지만 보내는 쪽에서 돈을 빼오는 것만 성공하고 받는 쪽에 돈을 넣는 작업을 실패하면 안된다.
  • 일관성(Consistency)
    • 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성있는 데이터베이스 상태로 유지하는 것
  • 고립성(Isolation)
    • 트랜잭션 수행 시 다른 트랜잭션의 연산 작업에 끼어들지 못하도록 보장
    • 트랜잭션 밖에 있는 연산은 중간 단계의 데이터를 볼 수 없다는 것을 의미
    • 트랜잭션 실행 내역은 연속적이어야 함을 의미
  • 지속성(Durability)
    • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미
    • 일반적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.

비관계형 데이터베이스(Non-Relational DataBase)

  • 비관계형 데이터베이스는 NoSQL로 명칭된다.
  • 비관계형 타입의 데이터를 저장할 때 사용됨
  • 비관계형이기 때문에 데이터를 저장하기 전에 테이블을 정의 할 필요 없다.
  • MongoDB, Redis, Cassandra 등이 가장 대표적인 NoSQL 데이터베이스 이다.

SQL과 NoSQL 비교

MySQL 기초 문법 정리 / SQL DDL 이해 및 실습 (SQL 명령어)

MySQL 기초 문법 정리

MySQL에서 키워드와 구문, 문자열은 대소문자를 구분하지 않는다.

테이블 명과 필드의 이름은 대소문자를 구분한다.

SQL DDL(Data Definition Language) 이해 및 실습

  • 데이터 베이스
    • 데이터 베이스 안에는 여러개의 데이터 베이스 이름 존재
    • 각 데이터 베이스 이름 안에는 여러개의 테이블 존재

데이터 베이스

  • 데이터베이스 생성
    • CREATE DATABASE dbname;
  • 데이터베이스 목록 보기
    • SHOW DATABASES;
  • dbname 데이터 베이스 사용 시
    • USE dbname;
  • dbname 데이터베이스 삭제
    • DROP DATABASE [IF EXISTS] dbname;
    • IF EXISTS 옵션은 해당 데이터베이스 이름이 없더라도 오류를 발생시키지 말라는 의미

테이블

  1. USE dbname;
  2. 아래와 같이 테이블 생성
mysql> CREATE TABLE 테이블명 (
					컬럼명 데이터형,
					컬럼명 데이터형,	
					.
					.
				Primary Key 가 될 필드 지정
				);
  • 숫자 타입의 컬럼 정의
mysql> CREATE TABLE tablename {
	-> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  • id : 컬럼명, 가능한 영어 소문자 중심으로 명명

  • INT : 컬럼에 대한 데이터 타입

  • UNSIGNED : 옵션 사항

  • NOT NULL : 데이터 입력시, 해당 컬럼 데이터에 값이 할당되지 않는 경우를 허용하지 않는다는 의미

  • AUTO_INCREMENT : 테이블에 데이터 등록시 해당 컬럼은 자동으로 숫자가 1씩 증가하여 저장됨, 테이블 안에서 AUTO_INCREMENT 컬럼은 하나만 지정 가능함

  • 숫자형 데이터 타입

    • TINYINT : 정수형 데이터 타입(1byte) -128 ~ 127 또는 0 ~ 255
    • SMALLINT : 정수형 데이터 타입(2byte) -32768 ~ 32767
    • MEDIUMINT : 정수형 데이터 타입(3byte) -8388608 ~ 8388607 또는 0 ~ 16777215
    • INT : 정수형 데이터 타입(4byte)
    • BIGINT : 정수형 데이터 타입(8byte) 무제한 수 표현 가능
    • FLOAT : 부동 소수형 데이터 타입(4byte)
    • DECIMAL : 고정 소수형 데이터 타입 고정(길이 + 1byte)
      • 예) DECIMAL(5, 2) : 12345.67 과 같은 수 표현
    • DOUBLE : 부동 소수형 데이터 타입(8byte)
  • 문자 타입의 컬럼 정의

mysql> CREATE TABLE tablename {
	-> name VARCHAR(50),
  • name : 컬럼명, 가능한 영어 소문자 중심으로 명명

  • VARCHAR(n) : 컬럼에 대한 문자형 데이터 타입 선언

  • 문자형 데이터 타입

    • CHAR(n) : 고정 길이 데이터 타입(n ≤ 255)
      • 예) CHAR(5) 'Hello'는 5byte 사용, CHAR(50) 'Hello'는 50byte 사용
    • VARCHAR(n) : 가변 길이 데이터 타입 (n ≤ 65535)
      • 예) VARCHAR(50) 'Hello'는 5byte만 사용
    • TINYTEXT(n) : 문자열 데이터 (n ≤ 255)
    • TEXT(n) : 문자열 데이터 (n ≤ 65535)
    • MEDIUMTEXT(n) : 문자열 데이터 (n ≤ 16777215)
    • LONGTEXT(n) : 문자열 데이터 (n ≤ 4294967295)

이후 내용은 내일 마저 학습하고 정리하기


자바의 정석 12장 지네릭스 학습

지네릭스의 제약 (673p)

  • static 멤버에 타입변수 사용 불가

    → 타입 변수에 대입은 인스턴스별로 다르기 때문

    class Box<T> {
    		static T item;  // 에러!!!
    		static int compare(T t1, T t2) {...}   // 에러!!!
    }
    Box<Apple> appleBox = new Box<Apple>();
    Box<Grape> grapeBox = new Box<Grape>(); 
  • 지네릭 타입의 배열 생성 불가능

    • 지네릭 배열 타입의 참조변수 선언은 가능하지만, 'new T[10]'와 같이 new 연산자를 사용하여 배얼을 생성할 수 없다.

      class Box<T> {
      		T[] itemArr;   // OK.
      
      		T[] toArray() {
      				T[] tmpArr = new T[itemArr.length];   // 에러!!! 지네릭 배열 생성 불가
      				...				
      				return tmpArr;
      		}
      }
    • new 연산자 뒤에 오는 타입은 확정되어 있어야 하는데 T는 아직 확정된 것이 아니여서 안됨

제한된 지네릭 클래스(676p)

타입 문자로 사용할 타입을 명시하면 한 종류의 타입만 저장할 수 있도록 제한할 수 있지만, 새로운 객체를 생성할 때 여전히 모든 종류의 타입을 지정할 수 있다.

→ 클래스 선언 시 타입 매개변수 T에 지정할 수 있는 타입의 종류를 제한할 수 있다.

  • extends 를 사용하여 특정 타입의 자손들만 대입할 수 있게 제한 가능
class FruitBox<T extends Fruit> {
		ArrayList<T> list = new ArrayList<T>();
		...
}
  • 특정 인터페이스를 구현하는 것을 제한으로 두어도 'extends'라고 한다. (주의)
class FruitBox<T extends Fruit & Eatable> { ... }
  • Fruit의 자손이면서 Eatable 인터페이스도 구현해야 한다면 & 기호로 연결한다.

  • 예제

public class FruitBoxEx2 {
    public static void main(String[] args) {
        FruitBox<Fruit> fruitBox = new FruitBox<>();
        FruitBox<Apple> appleBox = new FruitBox<>();
        FruitBox<Grape> grapeBox = new FruitBox<>();
//        FruitBox<Toy> toyBox = new FruitBox<Toy>();   // 에러!!!

        fruitBox.add(new Fruit());
        fruitBox.add(new Apple());
        fruitBox.add(new Grape());
//        appleBox.add(new Grape());    // 에러!!! Grape는 Apple의 자손이 아님 
    }
}

class FruitBox<T extends Fruit & Eatable> extends Box<T> {}

class Box<T> {
    ArrayList<T> list = new ArrayList<>();

    void add(T item) {
        list.add(item);
    }

    T get(int i) {
        return list.get(i);
    }

    int size() {
        return list.size();
    }

    public String toString() {
        return list.toString();
    }
}

class Fruit implements Eatable {
    public String toString() {
        return "Fruit";
    }
}

class Apple extends Fruit {
    public String toString() {
        return "Apple";
    }
}

class Grape extends Fruit {
    public String toString() {
        return "Grape";
    }
}

class Toy {
    public String toString() {
        return "Toy";
    }
}

interface Eatable {}

오늘 한 일

  • Docker란? 컨테이너? 이미지?

  • 데이터 베이스의 기초 학습

    • DB 사용이유? 관계형 DB와 비관계형 DB? 테이블 연결의 종류? 테이블을 나누고 연결하는 이유? 트랜잭션? ACID(트랜잭션의 네가지 속성)? SQL과 NoSQL의 장단점?

      → 이 내용들을 완벽히 알 정도로 학습한 것은 아니고, 이런것들이 있구나 하고 이해할 정도로만 학습했다.

  • MySQL 데이터베이스 생성, 삭제, 조회, 테이블 생성하는 법, 숫자형 컬럼 정의, 숫자형 데이터 타입, 문자형 컬럼 정의, 문자형 데이터 타입 학습

  • 자바의 정석 지네릭스 학습

Reminder

  • 지치지 않게 욕심내서 공부하지 않기

좋은 웹페이지 즐겨찾기