Hadoop Review



Features of Hadoop

  • Hadoop은 정형 / 비정형 / 반정형의 세 가지 데이터 타입의 처리가 모두 가능

    • 정형 데이터: RDBMS의 Table과 같이 고정된 Column에 저장되는 데이터와 파일, 그리고 지정된 행과 열에 의해 데이터 속성이 구별되는 스프레드 시트 형태의 데이터
    • 비정형 데이터: 데이터 세트가 아닌 하나의 객체화된 데이터(동영상, 이미지, 텍스트, ...)
    • 반정형 데이터: 데이터 내부에 정형 데이터의 스키마에 해당하는 메타데이터를 가지며, 일반적으로는 파일 형태로 저장(JSON, XML, HTML, ...)
  • Map: 데이터를 Key, Value의 Map 형태로 변환

  • Shuffle: Map 함수를 통해 Mapping된 결과를 key에 따라 재분배하여 같은 key를 가진 Map들이 같은 노드에서 실행되도록 작업 수행

  • Reduce: 산출된 결과 데이터를 key에 따라 병렬적으로 처리




hadoop 1.x

  • Core components
    • HDFS: Namenode, Datanode
    • MapReduce: Job tracker, Task tracker

hadoop 2.x

  • Core components
    • HDFS: Namenode, Datanode
    • Yarn: Resource manager, Node manager
  • ApplicationMaster는 작업의 **'Entry point'**로 Nodemanager들을 실행하고 조정하는 데몬 프로세스.
  • Nodemanager는 Container를 실행하고, Container의 라이프 사이클 모니터링 cf. Container는 Nodemanager가 실행되는 서버의 시스템 자원을 표현(kinda task of Hadoop 1.x.x)

Scala Programming

  • Java로 짜여진 소스 코드들은 Compile시, byte code의 용량이 너무 컸던 문제 때문에 JVM 위에서 돌아가는 함수형 언어들이 도래함
  • Scala도 이러한 이유로 등장한 언어 중 하나로 하이브리드 함수형 언어
  • 간결한 코드라인과 이에 따른 적은 메모리 사용으로 성능의 향상을 가져옴

Features of Scala

  • 객체지향적
  • 정적 타입의 언어
  • JVM에서 실행되어, Java와 호환(Java 코드도 실행 가능)
  • 동시 처리 및 동기화 처리의 수행 가능
  • Type inference
  • 모든 타입은 객체이며, 함수도 객체

Scala 실습

  • traits = interface of java
  • 세미콜론은 다른 라인을 한 라인에 넣을 때 구분하기 위해 사용하는 것 따로 필요하지 않을 때는 사용안하는 것이 보기 좋음
  • var로 선언하면 변수(변경 가능). val로 선언하면 상수(변경 불가)
  • Scala의 Object는 기본적으로 Singleton Object로 미리 구현되어 있음
  • Java에서와 같이 객체의 생성 없이 바로 객체로 사용하기 위해 Class가 아닌 Object로 객체를 직접 만들어서 사용할 수 있음

Apache Spark


: 빅데이터 분석을 위해 통합된 병렬 데이터 프레임 워크로 개발자의 생산성을 향상시키며, Hadoop eco system의 Hive와 HBase와 잘 어울러져 사용할 수 있음


  • 일괄 처리
  • 실시간 처리
  • 스트림 분석
  • 기계 학습
  • 대화식 SQL

What make Spark fast?

  • Spark는 In-Memory 클러스터 컴퓨팅을 위한 기본적 환경을 제공
  • Spark는 데이터를 메모리에 load하고 cache 하여 메모리에서 질의를 반복적으로 던지기 때문에 disk-based system보다 빠른 속도를 보임
  • Spark는 Scala와 통합되어 사용되기 때문에 분산 데이터셋을 마치 로컬 콜렉션과 같이 조종할 수 있게 함. 따라서 Map과 Reduce와 같은 작업을 수행하기 위해 모든 것을 구조화할 필요가 없어짐
  • Spark는 데이터를 복제 없이 '메모리'안에 저장하여 사용하기 때문에 HDFS에서 데이터를 가져와서 연산하는 것보다 훨씬 더 빠른 연산 속도를 보임


07.11-07.17

Java

  • this는 멤버 변수를 사용하고자 할 때 사용하는 예약어
  • class를 object화 해서 사용하는 것이 OOP의 핵심
  • Oveloading: Class 안에서 사용되는 메소드의 이름을 동일하게 쓰면서 파라미터의 개수, 타입을 다르게 해서 사용하는 방식. 하나의 메소드 명으로 다양한 기능이 수행 가능하다는 장점
  • generic 개념의 등장 이전에는 Type Casting으로 인한 overhead가 과도했음. 그러나, generic의 등장으로 Type Casting을 줄임으로써 overhead의 감소
  • Maven에 dependency 추가해주면 항상 Maven Clean 후 다시 Build해주는 습관 !
  • import maven project - existing maven project 로 다른 외부 maven project 불러올 수 있음
  • Maven build 안될 시, window - preference - java - installed JRE 에서 jre를 jdk 내의 jre로 변경해주면 가능한 경우 있음

hadoop

  • fsimage는 설정 값들의 Snapshot으로 파일 시스템의 상태를 저장
  • editslog는 작업들의 logging을 수행
  • 이클립스의 run configuration에서 Hadoop의 arguments를 직접 지정해줄 수 있음
  • Mapper에서 output으로 내는 key는 각 라인의 시작 문자의 index, value는 string 값
  • Mapper는 Subdivide and Conquer의 분할과 정복을 수행하며, Reducer는 결합과 Cardinality를 감소시킴
    cf. Cardinality: 집합의 크기로 집합의 '원소 개수'를 의미. 즉, Reducer는 Mapper가 반환하는 Key, Value 쌍을 결합시키며 집합의 원소를 줄이는 역할을 수행

Linux

  • 리눅스 시스템에서 jdk를 다운받기 위해 wget을 통해 링크를 사용할 경우, 종종 html 파일을 받아오는 경우가 많음. 이는 Oracle 사이트 내의 보안 문제로 아래와 같은 옵션을 추가하여 해결 가능
    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" '다운로드 링크 주소'

위 옵션은 jdk의 download를 위한 oracle license check의 기능의 대체와 인증의 문제를 대체하는 옵션

  • ssh Server명 '명령어;명령어'와 같은 형태로 ssh Login/Logout 없이 연결 서버 내 명령어 실행 가능
  • scp는 security copy의 약자로, 로컬 호스트와 원격 호스트 간 또는 두 개의 원격 호스트 간 파일을 안전하게 전송하는 수단
  • 환경변수 수정 이후에는 항상 source '파일명'으로 update 수행해주어야 함

Sqoop

: MySQL과 같은 저장소의 Data를 Import 해오는 기능 수행(SQL to Hadoop) SQL에서 Table을 Import해올 수도 있고, 받아온 SQL Table을 다시 다른 SQL Server에 Export할 수도 있음

  • Why Sqoop?
    • 자원에 대한 처리를 효과적이고 효율적으로 제어 가능
    • 데이터 타입의 mapping과 conversion(자동화 및 사용자에 의한 재정의)
    • meta data의 적용(Sqoop Record, Hive Metastore)

<예제>

  • Import: employees Table을 Sqoop에 Import
    ./bin/sqoop import --connect jdbc:mysql://192.168.111.160:3306/employees?useSSL=false --username 'hadoop' --password 'Pa$$w0rd123' --table employees -m 1 --target-dir /user/hadoop/sqoopMySqlToHdfs

  • Export: Import 해놓은 Table을 emplyees2라는 이름으로 SQL 서버에 Export
    ./bin/sqoop export --connect jdbc:mysql://192.168.111.160:3306/employees?useSSL=false --username 'hadoop' --password 'Pa$$w0rd123' --table employees2 -m 1 --export-dir /user/hadoop/sqoopMySqlToHdfs/part-m-00000


Hbase

: 구글의 빅테이블을 모델로 하여 만들어진, Hadoop eco-system에서 사용되는 NoSQL. NoSQL의 특성으로, 수십 억 개의 레코드에서 Random Access를 통해 단일 행에 대한 낮은 대기 시간의 access를 제공함

  • Master Server
    • region을 region 서버에 할당하고, 이 작업을 위해 Zookeeper의 도움을 받음
    • region 서버에서 region의 Load-Balancing을 처리. 즉, 사용량이 많은 서버를 언로드하고 영역을 덜 점유한 서버로 이동하는 등의 행위를 수행
    • 부하 분산을 협상하여 클러스트의 상태를 유지 및 관리
    • 스키마 변경 및 테이블과 열의 작성과 같은 기타 meta data 조작을 담당
  • Regions
    • region 서버들은 분할되어 지역 서버 전체에 퍼져있는 테이블들을 말함
    • 클라이언트와 통신하고 데이터 관련 작업을 처리
    • 그 아래의 모든 지역에 대한 읽기 및 쓰기 요청을 처리하며, 영역 크기 임계 값을 따라 영역의 크기를 결정

Flume

: 다양한 소스의 로그 파일, 이벤트와 같은 대량의 스트리밍 데이터를 집계하고 수집 및 전송하기 위한 툴이자 데이터 처리 메카니즘. Flume은 신뢰성이 높고 분산처리가 가능함


  • Flume 아키텍처
    • Flume Agent는 Flume의 독립적인 Daemon Process
    • Client 또는 다른 Flume Agent로부터 데이터(이벤트)를 수신하여 다음 Agent(또는 Sink)로 전달
    • Flume에는 둘 이상의 에이전트가 있을 수 있음


실습 시간이 많았던 관계로 필기가 적어 한 번에 모아 올림


- 데이터베이스의 성능을 올리는 가장 좋은 방법은 하드웨어의 스펙을 올려주는 'Scale Up'

--> 그러나, 현실적으로는 비용의 문제로 어려움. 따라서 우리는 'Scale Out'을 사용하는데 이는 병렬 형태의 컴퓨팅을 통한 성능 향상법


- wget 시,  http://archive.apache.org/dist/hadoop/common 사이트 사용

cf. Hadoop 2.x 에서는 Protocol Buffer를 사용하는데, 안정화된 2.5.0 버전을 사용하는 것이 일반적


- Hadoop's core components

: HDFS(Hadoop Distributed File System)으로 대용량 데이터들의 저장

MapReduce를 통해 Batch Processing


- Hadoop은 비관계형 데이터를 저장. 우리가 직접 API를 다 구상해서 사용해야 함


- HDFS는 대용량의 데이터를 Block화 하여 Node들에 나누어 저장하며, Hadoop 2.x 버전에서는 데이터 블록의 기본 용량을 128MB로 가져감


- Hadoop은 Block들 replicate하여 하나의 data block이 오염되거나, 삭제되더라도 다른 복제 set의 사용


- 하나의 네임 노드가 데이터 노드들에게 데이터의 처리와 저장을 분산시키는 것.

--> 네임 노드가 죽으면 그 기능들이 수행되지 않는 문제가 있었으나, 2.x 버전으로 넘어오며 ZooKeeper를 통해 standby 노드가 본래의 네임 노드를 대체할 수 있는 기능을 수행(HA: High Ability)


- 네임 노드는 meta date과 logging file들만 지니고 있음. 데이터 노드들이 실제 Data block 보유


- masters에 등록하는 것은 Secondary Node


- Hadoop 2.x의 구성

: Name node(Resource Manager) + Data node(Node Manager) / YARN 

--> Resource Manager는 Application managing과 scheduler의 역할을 수행하며, Node Manager는 container 생성되어서 task를 수행

- HDFS는 문제 해결을 위해 editslog와 fsimage 파일로 메타데이터 및 기타 장애 처리


- Mapper<Object, Text, Text, IntWritable>

: Object와 Text는 input이며, Text와 IntWritable은 output. 이들은 하둡에서 사용되는 Wrapper Class로 어떠한 자료형이 어떤 Wrapper Class로 사용되는지 알아야 함


- Reducer<Text, IntWritable, Text, IntWritable>

: Mapper는 key, value로 구성된 Java map data들을 만들어주며, Reducer가 반환된 key와 value를 더하는 방식으로 word counting !


* Java

- maven은 일종의 yum과 같은 개념으로 넷상에 존재하는 repository를 사용하는 것


- 인터페이스는 규약적 개념으로 사용하며, 인터페이스를 사용하는 모든 클래스들이 동일한 메소드를 사용하게 하여, 표준화 기능을 수행하도록 함


- static 형태로 method를 만들게 되면 instance를 만들지 않고도 해당 method의 사용이 가능


- class 파일을 jar로 export하는 것이 java의 배포 개념이며, build path -> configure build path -> Import external jar로 다른 패키지의 클래스를 사용 가능


- Type Cast

: public void TestMethod(Object o) vs. public void TestMethod(String o)

-> 전자는 하나의 메소드로 Type Conversion 통해 모든 자료형을 인수로 받을 수 있으나, 후자의 경우 String 자료형만 인수로 받을 수 있기 때문에 자료형에 따른 method를 여러 개 만들어야 하는 단점이 존재

-> 다형성을 이용하여 상위 클래스로 자식 클래스를 받은 후, method들을 interface 통해 모두 통일하는 기법을 많이 사용하는데, 이는 코드의 양을 획기적으로 줄일 수 있음


- 캡슐화 / 상속성 / 다형성 / generic 을 정확하게 아는 것이 매우 중요

- ntsysv 라이브러리는 운영체제 시작 시, 자동으로 실행할 프로그램의 설정 가능


- systemctl stop firewalld 로 방화벽을 끌 수 있으며, systemctl disable firewall로 방화벽이 시스템 재시작 이후에도 자동으로 켜지지 않도록 설정


- cron은 주기적으로 반복되어야 하는 작업이 자동적으로 실행되도록 설정하는 기능

--> etc/cron.hourly 혹은 monthly 등에 .sh의 쉘 스크립트 파일 추가해주는 방식으로 사용

--> 설정 이후, systemctl restart crond로 재시작해주어야 정상적으로 설정

--> 하둡에서는 데이터 수집을 주기적으로 수행할 수 있도록 설정 가능


/etc/crontab에서 등록한 프로그램들의 확인 가능


ex)           요일  사용자  실행명령

        00  05  1   *    *   root   cp -r /home /backup

          * 매월, 요일 등등


- at는 cron과 달리 1번의 예약 실행 기능을 수행

--> at 시간 날짜 수행할 작업을 입력해주고, ctrl + D로 빠져 나옴

--> at -l 명령어로 설정된 at 목록의 출력 가능


- systemctl list-units -t(타입) service 명령어 통해 service 타입만 확인 가능


- /etc/hosts 파일에서 직접 IP에 네이밍하는 방식을 많이 사용. 그 이유는 DNS 서버 죽어버리면 해당 주소에 접근하지 못하는 오류 생길 수 있기 때문 !


- 파이프는 두 개의 프로그램을 연결해주는 연결 통로의 의미

ex) ls -l /etc | more 과 같이 ls를 more로 보여주도록 하는 기능의 수행 가능


- ps는 프로세스 상태들을 보여주는 기능

cf. root 계정 사용하는 것도 하나의 process


- ps -ef | grep 'name' 으로 해당 이름을 가지는 process의 확인 가능


- kill PID#로 프로세스 종료 가능. 종료가 안 될 경우, -9 옵션 추가해 강제 종료 가능


- sort < 파일명은 정렬 기능 수행


- > 는 Redirection 기능 수행

--> >> 는 append 기능이며, > 는 overwrite


- export '환경변수=값'으로 환경변수의 값 설정 가능 (=에 공백 없어야 함!)


- 리눅스 명령어를 결과로 사용하기 위해서는 


- telnet 통해 원격접속 가능하나, 최근에는 보안 문제 때문에 잘 사용하지 않는 추세 (SSH 사용)

--> 잦은 telnet의 사용으로 user의 혼동 있을 수 있기 때문에 who 명령어로 chainig 항상 관리!


- 환경변수의 수정 이후에는 source '해당 파일명' 을 통해 수정이 적용되도록 해주어야 함

--> /home/사용자계정 밑에 .bashrc 혹은 .bash_profile에 PATH 환경 변수 설정 가능


- tar cvfz '압축할 파일명' '원본 파일' 통해 파일의 압축 가능


- scp -r(덮어쓰기) '파일명' '옮길 주소명' 통해 서버 간 파일 전송 가능


- yum groupinstall "Development Tools" 로 개발자 툴들 설치 가능

--> Development Libraries는 CentOS7부터 사용하지 않기 때문에, "Additional Development" 설치함


- yum install java-devel 로 javac 설치 가능


<쉘 스크립트>


- 파일 첫 번째 라인에는 #!/bin/sh 주석을 넣어주는 것이 일반적


- 연산 수행하기 위해서는 $((연산식)) 사용하는 것이 편함


- if - then - else 구조로 조건문 사용 가능


- case 구조도 사용 가능한데, 한 case에 끝에는 항상 ';;'을 붙여 주어야 함


- if 조건문은 fi로, case 구문은 esac 을 추가해주는 것으로 끝내줌


- export를 사용하여 변수를 선언해야 외부 변수로도 사용이 가능. export 없이 선언 시, 지역 변수로만 사용이 가능

- 프로그래밍 언어는 도구에 불과함. 숙련된 개발자들은 수 일만에 개발 언어 하나 정도 이해하고 개발 가능. 따라서 주력 언어 외 인프라를 잘 사용할 수 있는 능력을 갖출 수 있어야 함


- 개발자는 gnome 데스크탑을 Linux 기본 설정으로 설치하는 것이 일반적


- root 계정에서 useradd 'user명' 으로 user 추가 가능하며, passwd 'user명' 으로 해당 user의 패스워드 설정 가능


- home directory에서 dir 명령어로 존재하는 계정들 확인 가능


- 운영체제 설치 후, 가장 처음으로 해주어야 하는 일은 IP Setting 등의 네트워크 세팅


- ping 'IP addr' 로 해당 IP가 작동하고 있는지 확인 가능


- 가상화 기기에서 돌리는 서버의 경우 항상 init 0 명령어 등으로 정상 종료를 해주어야 함. 강제 종료 시도 시, 이미지 파일 깨질 우려가 있음


- hitory 명령어 통해 내가 사용한 명령어 목록 보고, 해당 명령어를 숫자로 재사용 가능


- yum repolist는 현재 참조하고 있는 repository 확인 가능


- . 은 히든파일을 의미하며, ls -la로 히든파일 확인 가능

ex) .test.txt 파일은 ls -la 해야 확인 가능


- which '명령어'로 명령어의 위치 확인 가능


- find / -name '찾을 파일' 통해 해당 이름을 가지는 파일들의 검색 가능


- 관리자 계정에서 명령어 수행하다가 


- 인증: 계정이 시스템에 접근할 수 있는 것

  접근: 계정이 시스템에 접근한 후, 내부 자원을 access할 수 있는 것


- su - 'username' 으로 해당 계정의 사용 가능


- chmod 명령어 통해 계정 혹은 파일의 access permission 변경 가능


- chown 명령어 통해 파일의 소유자 변경 가능


- echo $'환경변수' 명령어 통해 해당 환경변수에 대한 정보 알려줌


- Access permisson의 가장 좌측 'l'은 심볼릭 링크의 사용을의미.

--> 파일 이름에서 -> 이후 나오는 이름이 사용 중인 심볼릭 링크명


- ln 명령어로 심볼릭 링크 설정이 가능 (ln -s)

--> 프로그램 업데이트 될 때, 심볼릭 링크만 바꾸어 주는 방식으로 업데이트된 버전의 사용 가능


- .sh 는 쉘 스크립트 파일


- rpm은 파일의 의존성 문제가 있기 때문에 이를 해결하기 위해 yum이 등장


- tar -xvfz 'tar파일명' 으로 tar 파일 압축 해제 가능

--> x(풀기), v(과정보기), z(tar + gzip), f(파일)


- 관리자 계정으로 상승 후, 작업을 지속적으로 수행하는 실수를 많이 범하기 때문에 관리자 계정 접근 후, 원하는 작업 수행 이후 바로 빠져나오는 습관 들이기.

ex) 관리자 계정에서 파일 압축 해제 시, 사용자들은 접근이 불가능하기 떄문에 Access permisson 일일이 바꾸어주어야 하는 불편 치를 수

- yum install net-tools 통해 IP와 관련한 tool의 설치 가능

-> net-tools 가 깔려 있어야 ifconfig 통해 사용 중인 IP의 확인 가능


- timedatectl 명령어로 현재 시간의 확인 가능


- man 'keyword'로 해당 키워드와 관련한 매뉴얼 확인 가능


- reboot 혹은 init 6 로 reboot이 가능


- touch test.txt 와 같은 명령어로 빈 파일의 생성 가능


- rm 명령어로 파일이나 디렉토리의 삭제 가능

cf. 디렉토리를 삭제할 때는 -r 을 추가해주어야 함 == rmdir과 같은 기능.

-r 명령어의 경우, 서브 디렉토리까지 모두 삭제. 그러나, rmdir의 사용을 위해서는 디렉토리가 비어있어야 함. 때문에 rm -r의 사용이 더 일반적. 

cf. -f 는 파일 삭제 여부를 되묻지 않고 강제 삭제하게 함 


- ./ 가 현재 폴더를 의미하기 때문에, 현재 폴더 내의 파일을 실행하기 위해서는 ./파일명을 사용

- cd ~로 home directory로의 이동 가능


- ls -la 명령어로 hidden files들도 볼 수 있음


- cp 파일경로 현재경로 : 파일의 복사 기능


- mv 파일경로 현재경로 : 파일의 이동 가능


- file 파일명은 파일이 어떤 종류의 파일인지 표시해줌


- head, tail은 파일의 앞 혹은 뒤 10행의 출력


- more: 텍스트 파일을 페이지 단위로 출력 -> space로 페이지 한 장씩 넘길 수 있음


- linux 기본 설치 이후에는 IP의 기본 설정이 필요함

--> vi /etc/sysconfig/network-script/ifcfg-ens32 에서 BOOTPROTO를 'none'으로 수정한 후, NETMASK=255.255.255.0 을 추가해줌

--> NETMASK를 추가해주는 이유는 SSH 접속을 원활하기 위함임

- 네트워크의 수정 이후에는 systemctl restart network를 통해 네트워크를 재시작해주어야 함

--> 이후, 항상 systemctl status network 를 통해 network가 active 상태인지 확인해줌 !


Day03


- union은 합집합, intersect는 교집합, except는 차집합을 수행하는 명령어


- inner join은 교집합과 같이 일치하는 값만 추출해서 보여줌

ex) select * from member inner join dept on member.dept_id = dept.dept_id;


- left, right join은 각 위치에 위치하는 테이블의 table 모두 출력하고 다른 한 쪽은 일치하는 값만 출력


- MySQL에서 full outer join은 지원되지 않기 때문에 left join과 right join을 union하여 같은 결과의 수행 가능

ex) select * from member left join dept on member.dept_id = dept.dept_id

     union   

     select * from member right join dept on member.dept_id = dept.dept_id;


- 서브쿼리는 쿼리 안에 존재하는 쿼리로, 하부의 부수적 질의를 의미하며 대부분의 쿼리에 사용이 가능

ex) select * from member where dept_id = (select dept_id from dept where dept_name = 'Sales');

cf. 대부분 서브쿼리 보다는 join 사용하는 것이 일반적이나 DBMS에 따라 서브쿼리가 성능 면에서 뛰어난 경우도 존재


- 서브쿼리는 단일값을 의미하는 '스칼라 값'을 이용하여 조건이 사용됨

cf. What is Scala value? 


- Database의 중요한 요소는 CRUD(Create / Read / Update / Delete)


- insert 문으로 table에 정보의 추가 가능함

ex) insert into member values(101, '홍길동', ....)

ex2) 특정 column에 정보 추가하기 위해서는 insert into member(column명) values(...)


- delete 문으로 table 내의 행 삭제 가능하나 where 조건을 잘 걸어주어야 table 날리는 실수 안함


- update 문으로 테이블의 행 수정이 가능하며, 이 역시 where 조건을 걸어주어야 특정 행의 수정을 정확히 할 수 있음

ex) update member set name = '김철수' where member_id = 100;


- 상관 서브쿼리는 일반 서브쿼리와 같이 스칼라 값을 반환할 필요 없으며, exist와 not exist를 이용하여 사용


- drop table '테이블명' 으로 테이블의 전체 삭제 가능

cf. drop은 table의 구조와 데이터를 모두 삭제하는 명령어. delete로도 모든 행을 삭제할 수 있지만, delete 명령어는 행 단위로 수행되기 때문에 그 속도가 매우 느림. 따라서 truncate table이라는 명령어를 통해 table의 구조는 유지하되, 입력된 데이터를 모두 삭제할 수 있음


- alter table을 통해 table의 내부 내용 수정이 가능

--> add: table에 열 추가, modify: 열의 속성 변경, change: 열의 이름 변경, drop 열의 삭제


- constraint: NOT NULL, PRIMARY KEY와 같은 테이블의 제약 조건 설정이 가능

--> alter table member drop primary key; 와 같이 제약 조건의 해제도 가능


- transaction: 테이블의 CRUD 기능을 수행

: start transaction; 이후 트랜잭션의 시작 알림. 이후, insert, update, delete 등의 기능 수행 후, commit; 을 입력하면 수행한 트랜잭션을 테이블에 모두 반영. rollback; 을 입력하면 수행한 트랜잭션 모두 초기화한 후, 테이블 변화 없음.


- 데이터베이스에서의 객체

: 데이터베이스 내에 실체를 가지는 '스키마' 우리는 명령어를 통해 실체가 없는 데이터들을 데이터베이스로부터 가져오는 것임. 객체는 SQL Server가 관리하며 우리는 클라이언트로 접속하여 원하는 data를 가져오는 개념임


- Database의 ACID(for. transaction)



원자성(Atomicity)은 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다. 예를 들어, 자금 이체는 성공할 수도 실패할 수도 있지만 보내는 쪽에서 돈을 빼 오는 작업만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안된다. 원자성은 이와 같이 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다.


일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.


고립성(Isolation)은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다. 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 고립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다. 


지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다. 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 함을 의미한다. 전형적으로 모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. 트랜잭션은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.


Day 02


- select 문 말미에 limit 키워드를 추가해 화면에 출력할 row의 숫자 제한 가능

ex) select * from member limit 5;  --> member 테이블에서 5개의 row만 출력


- distinct 키워드 통해 중복되는 element 없이 출력 가능

ex) member 테이블에 Senior Engineer, DBA, FE developer ... 등의 job이 있는데 FE developer라는 직업을 가진 사람이 여러 명이다.

--> select (distinct job) from member; 하게 되면 중복된 job 없이 개별적 직업만 출력이 가능


- as 혹은 '' 키워드의 추가 통해 column의 alias 설정이 가능

ex) select title 'TT' from member; == select title as TT from member; 로 title column을 별명으로 볼 수 있음


- select 문에 조건을 걸어주는 where 구절에 and와 or, not의 조건 추가 가능


- where 구절에 between 으로 범위 지정 가능

ex) select * from member where member_id between 101 and 110;


- order by 의 default 값은 asc(오름차순)이나, order by member_id desc; 와 같이 내림차순으로 사용자가 설정 가능하며, 항상 where 절 이후에 위치

cf) order by member_id desc, name asc; 와 같이 여러 개의 조건의 추가도 가능


- like 키워드로 패턴을 통한 검색이 가능

ex) select * from member where name like 'Jo%';  Jo로 시작하는 이름을 가진 member의 출력(%는 글자 수의 제한 없음)

ex) select * from member where name like 'Joh_'; Joh로 시작하며, 끝의 1글자만 다른 member들 출력 (_는 1글자를 의미)


- in 키워드는 between과 달리 범위가 아닌 포함의 개념을 의미함


- where 구절에 IS NULL 혹은 IS NOT NULL 등의 조건을 추가하여, NULL과 관련된 조건을 걸어줄 수 있음


- limit 키워드 이후에 offset 을 추가하여, limit의 시작 부를 지정해줄 수 있음


- concat 함수로 문자열 결합 기능의 수행 가능

ex) select CONCAT('A', '1'); 의 수행 시, 'A1'의 문자열을 만들 수 있음


- substring 함수로 문자열의 시작 index와 index로 부터 읽어올 문자의 갯수 지정한 자르기 가능


- char(10)은 10개의 공간을 모두 차지하나, varchar(10)은 테이블에 실제로 입력된 값만큼 가변적으로 공간 차지


- trim 함수로 문자열 양쪽의 스페이스 제거 가능

ex) select trim('          abc          '); 의 수행 시, 양쪽의 공백이 모두 제거 된 후 'abc'가 출력


- lpad 혹은 rpad 함수르 좌우측에 원하는 문자열의 padding 가능

ex) lpad(‘hello world’, 20, ‘abc’); 로 총 20글자가 될 때 까지 문자열의 왼쪽을 'abc'로 padding


- select current_timestamp; 로 현재 시간의 출력 가능


- select year(current_timestamp), month(current_timestamp), day(current_timestamp); 와 같이 날짜의 일, 월, 년의 개별적 선택 가능


- case 구문으로 IF 문과 같은 조건의 설정 가능


- count 함수로 개수 구하는 기능 수행 가능

ex) select count(*) from member; 을 수행하면 member 테이블에 존재하는 행의 개수를 출력

cf. count 함수는 NULL을 포함하지 않기 때문에 NULL이 아닌 정보가 존재하는 원소의 출력 가능 + distinct 키워드의 사용 또한 가능


- group by로 table의 grouping 하고 싶은 정보들의 그룹화 가능

ex) select avg(sal) from member group by dept_id; 수행하면 dept_id 별로 평균 급여가 얼마인지 출력해줌


- IF 함수는 C언어의 삼항 조건 연산자와 같은 기능을 수행

ex) IF('Engineer', 'True', 'False');


- inner join은 where 문으로 같은 기능을 수행하도록 설정이 가능

Day 01 


- 데이터베이스: 여러 응용 프로그램을 이용해 접근이 가능한 공유된 형태의 데이터 집합


- 데이터베이스의 특징

  1) 데이터의 독립성: 프로그램과 독립적으로 데이터가 관리됨

  2) 데이터의 무결성: 데이터의 정확성을 보장

  3) 데이터의 보안성: 인증되지 않은 사용자의 접근 통제

  4) 데이터의 중복 최소화: 최대한 중복된 데이터가 적재되지 않도록 설계


- 데이터베이스 구조의 종류

  1) 파일 시스템: 데이터들이 종속된 형태, 데이터의 중복 위험,

  2) 데이터베이스 관리 시스템(DBMS, DataBase Management System)

      - 계층형 데이터 베이스: 트리 형태의 데이터베이스

      - 망형 데이터베이스: 네트워크 상의 노드 형태로 데이터를 표현하는 데이터베이스

      - 관계형 데이터베이스: 데이터 중복 제거가 핵심 by. using 'Primary Key'


- 관계형 데이터베이스에서의 '관계'는 업무적 연관성에서 비롯됨('수동'과 '피동'의 양방관계)

  ex) Parent와 Child의 소유관계: Parent는 Child를 소유하며 Child는 Parent에 의해 소유됨


- 일반적으로 ER(Entity Relation) 다이어그램을 이용하여 데이터베이스의 관계성을 나타냄

  --> ER 다이어그램의 설계는 보통 시니어들이 하지만, ER 다이어그램을 읽고 Entity 간의 관계성을 파악할 수 있는 능력 갖춰야 함


- Inno DB는 다양한 Storage Engine의 일종으로, MySQL을 위한 데이터베이스 엔진


- 사용자가 사용할 어플리케이션을 고려하여 데이터베이스를 설계할 수 있어야 함



- 데이터 모델링의 개념

  1) 정보 모델링: ER 다이어그램을 이용한 개념적 모델

  2) 데이터 모델링: 관계 데이터 모델의 논리적 모델

  3) DB로 구현: 데이터베이스 구현


- 데이터베이스의 생명주기

  : 요구사항 수집 및 분석 -> 설계 -> 구현 -> 운영 -> 감시 및 개선


- 테이블의 특성에 따라 중복이 필요할 수도 있음. 이 경우, 역정규화를 필요로 함


- 개념적 모델링을 할 때, Entity들의 역관계를 고려하여 그 관계성이 1:1일지 n:n 일지 추론할 수 있음

  --> n:n의 관계도 물리적으로는 1:n, n:1의 관계로 설정해주어야 함

  ex) 제품:주문이 n:n의 관계라면, 제품 : '상세주문' : 주문 = 1 : n : 1 의 관계와 같이 설정을 해주어야 함 !




K-ICT 서버를 이용하는 Cent OS에 MySQL을 설치하고, 기본적인 쉘 명령어들을 살펴보았다. 강의는 강사분이 개발 경력을 오래지니셨던 분이셔서 그런지 강의에 막힘이 없으시다. 그리고 지속적으로 현업에서는 어떻게 해당 분야가 사용되고 있는지에 대한 설명을 잘 해주셔서 수업에 유익함이 더해진다고 느낄 수 있었다. 지속적으로 기록을 남겨두고 나중에 복습한다면 좋은 학습거리가 될 수 있을 것 같다.



*Linux basic commands & shortcuts that I learned today


ctrl + L : Shell에 clear를 타입한 것과 같은 기능으로, shell에 띄워진 커맨드 실행 이력들을 모두 지워준다.


alt + B : 윈도우의 ctrl + Left와 같은 기능으로, Word 단위로 좌측으로 이동할 수 있다.


select user, host from user : Linux 서버에 등록된 사용자 목록을 확인할 수 있는 명령어


+ Recent posts