Archive

Database 기본 개념

|

Database 기본 개념


데이터베이스란 무엇인가?

데이터(Data)란 이 세상에 존재하는 온갖것을 기록 할 수 있는 자료이다. 데이터는 가공을 거쳐 정보(Information)이 된다. 데이터베이스는 정보 혹은 데이터의 체계적인 집합체이다. 데이터베이스는 데이터베이스 관리 시스템(DBMS : Database Management System)에 의해 제어된다. 대부분의 관계형 데이터베이스는 데이터 작성 및 쿼리 작업에 구조화된 질의 언어(SQL : Structured Query Language)를 사용한다.

데이터베이스는 유형별로 크게 관계형 데이터베이스, NoSQL 데이터베이스로 나뉜다. 관계형이냐 비관계형이냐의 차이인데 이 외에도 객체 지향, 분산, 그래프 등등 수많은 데이터베이스 유형이 있다.


RDBMS vs NoSQL

내가 사용할 MySQL, 학원에서 배우게될 Oracle 혹은 MongoDB, MSSQL, SQLite, MariaDB 등등은 모두 데이터 관리 시스템(DBMS)이다. 그 중 가장 점유율이 높은 Oracle이나 MySQL 등 다수의 DBMS가 관계형 데이터 관리 시스템은 RDBMS이다.

요즘 빠르게 치고 올라오고 있는 MongoDB는 NoSQL이다.

그럼 RDBMS와 No SQL의 차이는 뭘까?


관계형 데이터베이스는 데이터를 저장하기 위해 구조화된 테이블 형식, 즉 행과 열 방식으로 데이터를 2차원화시켜 관리한다. RDBMS는 각 테이블에 있는 데이터 값과 항목이 서로 연관된다. 테이블은 데이터베이스 시스템에서 서로 상호 연결될 수 있어 한 번에 여러 테이블에 명령 쿼리를 실행할 수 있다. RDBMS는 테이블에 값을 추가, 업데이트, 검색, 편집, 검색 등을 하기 위해 다른 쿼리를 실행하는 프로그램이다. 위에서 표기했듯, SQL은 관계형 데이터베이스를 처리하는데 사용되는 표준언어이다.


NoSQL은 Not Only SQL로 비관계형 데이터베이스로 스키마와 관계라는 개념이 없다. 데이터간 관계를 정의하지 않고 자유롭게 데이터를 관리할 수 있다. NoSQL은 데이터베이스 시스템이 방대하거나 같은 종류의 데이터로 분산 된 데이터를 저장하는데 사용된다. 주로 빅데이터나 실시간 웹 앱 운영에 사용되어 차세대 데이터베이스 시스템이라 불린다. NoSQL은 앞서 말한 MongoDB와 Cassandra, CouchDB 등이 있다.



참고 자료


데이터베이스란? - 오라클 kr

DBMS vs RDBMS vs NoSQL

해시넷

2021-01-07 TIL

|

2021-01-07 TIL


  • 오늘 한 것

    1. JavaFX 공부 - scene builder만 있으면 FXML로 GUI를 구현하는 것 자체는 어렵지 않을듯하다. 이벤트 처리도 꽤나 간단했다.

    2. 학원 비대면 수업(15:30~22:00) Applet - applet을 배우긴 했지만.. 전혀 실무에서 쓰이지 않는 내용이므로 패스..

    3. 개인 프로젝트 구상 - 개인 프로젝트 주제를 선정하고 구조를 짜는데 꽤나 많은 시간이 걸렸다. 이 프로젝트를 구현하려면 DB가 꼭 필요하다. 개인 프로젝트를 하기에 앞서 DB공부를 시작하려한다. 학원에서는 Oracle을 배우겠지만 나는 조금 더 범용적으로 쓰이는 MySQL로 시작해야지.


  • 내일 할 것
    1. JavaFX 공부
    2. 학원 비대면 수업(15:30~22:00) Applet
    3. JavaFX JDBC MySQL Tutorial



  • 끝으로

일정을 대폭 바꿔야겠다. 개인적으로 하던 javascript 공부를 잠시 멈추고 개인 프로젝트 준비에 전력투구를 해야겠다. 후딱 끝내놓고 맘편히 리액트 공부를 하는 편이 좋을듯하다. DB공부도 해야하고 할게 무진장 많이 생겼다.

오늘의 한 줄 총평 : 개인 프로젝트 힘내보자


2021-01-06 TIL

|

2021-01-06 TIL


  • 오늘 한 것
    1. JavaFX 공부 - 그동안 awt로 개고생하면서 구현했던 GUI가 screen builder로 마우스 클릭만 몇 번 하면 화면이 구현되는것을 보고 감탄을 금치못했다. javaFX document를 java와 연결하는 방법은 조금 더 연습이 필요할듯. 내일은 이벤트를 거는 방법에 대해 공부해야지.
    2. 학원 비대면 수업(15:30~22:00) 스레드 - 동기화와 임계영역 등 오늘 중요한 내용이 많이 나왔다. 대략적인 개념만 잡은 상태여서 실제로 써먹으려면 책 보고 좀 더 deep하게 파봐야 할 것 같다.

    3. Build 15 JavaScript Projects - 여기서 소개하는 기능들이 대체로 쉬운 편이어서 잠시 강의 화면을 멈추고 스스로 구현해보고 원작자의 소스코드와 비교해보고 있다. 앞으로 더 어려워질듯한데 얼른 내가 몰랐던 테크닉을 전수받고 싶다.

    4. 블로그 포스팅 (Java Day 23, JS Day 10) - 자바스크립트의 구조 분해에 대해 배웠는데 자바스크립트는 정말 자유로운것 같다. 그래도 지금까지 제일 많이 연습한 언어가 자바인데 자바와 비교했을때 스타일이 너무 달라서 자바스크립트적인(?) 코딩 컨벤션을 손에 익히려면 부단히 노력해야겠다.

  • 내일 할 것
    1. JavaFX 공부 이벤트
    2. 학원 비대면 수업(15:30~22:00) Applet
    3. 블로그 포스팅 (Javascript Day 11)
    4. Build 15 JavaScript Projects 수강



  • 끝으로

이번 주말에 자바스크립트로 미니 프로젝트 하나 만들고 리액트로 넘어갈 준비를 해야겠다. 자바스크립트 이론적인 공부는 꾸준히 해야겠지만 얼른 리액트를 경험해보고 싶은 마음이 굴뚝같다.

오늘의 한 줄 총평 : 계획을 잘 짜고 매사에 최선을 다 하자!


JS Day 10 구조 분해 할당

|

JS Day 10 구조 분해 할당


  1. 구조 분해 할당(Destructuring Assignment)

    • 배열 분해하기
    let zoo = ["fox", "mouse"];
    let [first, second] = zoo;
    console.log(first); // fox
    console.log(second); // mouse
       
    // 쉼표로 요소 무시하기
    let zoo = ["fox", "mouse", "horse"];
    let [first, ,second] = zoo;
    console.log(first); // fox
    console.log(second); // horse
    
    • 배열 이외에도 구조 분해 할당 적용이 가능
    let [a,b,c] = "abc"; // ["a", "b", "c"]
       
    let zoo = {};
    [zoo.name, zoo.age] = "fox 13".split(' ');
    console.log(zoo); // {name: "fox", age: "13"}
    
    • 변수 교환 트릭
    let first = "fox";
    let second = "mouse";
    [first, second] = [second, first];
       
    console.log(first); // mouse
    console.log(second); // fox
    
    • … 으로 나머지 요소 가져오기
    let [first, second, ...rest] = ["fox", "mouse", "rabbit", "horse"];
    console.log(first); // fox
    console.log(second); // mouse
    console.log(rest[0]); // rabbit
    console.log(rest[1]); // horse
    
    • default
    /* 할당하고자 하는 변수의 개수가 배열보다 크면 undefined 반환 */
    let [first, second] = ["fox"];
    console.log(first);
    console.log(second);
       
    /* =으로 default value 설정 가능 */
    let [first = "rabbit", second = "horse"] = ["fox"];
    console.log(first); // fox
    console.log(second); // horse
    
    • 객체 분해
    let zoo = {
        first: "fox",
        second: "horse",
        third: "rabbit",
    };
       
    let {first, second, third} = zoo;
    console.log(first); // fox
    console.log(second); // horse
    console.log(third); // rabbit
       
    /* 변수를 설정하여 할당하는것도 가능 (default 설정과 중첩 가능)*/
    let {first: myAnimal, second: yourAnimal, third} = zoo;
    console.log(myAnimal); // fox
    console.log(yourAnimal); // horse
    console.log(third); // rabbit
       
    /* 원하는 값만 뽑기 */
    let {first} = zoo;
    console.log(first); // fox
       
    /* key값과 동일한 변수명 사용하기 */
    let first, second, third;
    ({first, second, third} = zoo); // 괄호로 감싸면 error가 안난다
    




참고 자료


JAVASCRIPT.INFO

Java Day 23 스레드

|

Java Day 23 스레드


  1. Thread

    • Multi-Tasking
      • 프로세스(Process)란 운영체제에서 실행중인 하나의 프로그램
      • 멀티 프로세스(Multi-Process) : 두 개 이상의 프로세스가 실행되는 것
      • 멀티 태스킹(Multi-Tasking) : 두 개 이상의 프로세스를 실행하여 일을 처리하는 것
    • Multi-Thread
      • 스레드(Thread)란 프로세스 내에서 실행되는 세부 작업 단위
      • 멀티 스레드(Multi-Thread)란 하나의 프로세스에서 여러 개의 스레드가 병행처리 되는 것
      • 멀티 스레드로 동작하는 스레드의 예외는 다른 스레드나 프로세스 자체에 영향을 끼칠 우려가 있기 때문에 예외 처리를 잘 해야한다
    • Life cycle of a Thread
      • 스레드는 Thread 객체가 생성되면 생명주기를 갖게 된다
      • New - 스레드가 생성된 상태
      • Runnable - 객체 생성 후 start() 메소드 호출시 Runnanle 상태로 이동
      • Running - Runnable 상태에서 스레드 스케쥴러에 의해 Running 상태로 이동
      • Blocked - 스레드가 다른 특정한 이유로 Running에서 Blocked 상탤로 이동
      • Dead - 스레드가 종료되면 그 스레드는 다시 시작 할 수 없게 된다
    • Thread 생성 방법
      1. Thread를 상속 받아서 클래슬 만들기
      2. Runnable 인터페이스를 상속받아서 클래스 만들기


  2. Thread Class 생성자와 메소드

    • 생성자

    생성자

    • 메소드

    메소드


  3. Thread 구현

    • Thread class 상속받아서 구현
    // Thread를 상속받아 나 자신이 thread가 됨
    public class SingleThreadEx extends Thread {
    	private int[] temp;
    	public SingleThreadEx(String threadName) {
    		super(threadName);
    		temp = new int[10];
    		for(int start = 0; start<temp.length; start++) {
    			temp[start] = start;
    		}
    	}
    	public void run() {
    		for(int start : temp) {
    			try {
    				sleep(1000);
    			} catch(InterruptedException ie) {
    				ie.printStackTrace();
    			}
    			System.out.printf("스레드 이름 : %s ,", currentThread().getName());;
    			System.out.printf("temp value : %d %n", start);
    		}
    	}	
    	public static void main(String[] args) {
    		SingleThreadEx st = new SingleThreadEx("첫번째");
    		st.start();
    	}
    }
    
    • Runnable interface 상속받아서 구현
    // Runnable이기 때문에 Thread 객체를 만들어 그 안에 넣어 사용해야함 
    public class SingleRunnableEx implements Runnable {
    	private int temp[];
    	public SingleRunnableEx() {
    		temp = new int[10];
    		for(int start=0; start<10; start++) {
    			temp[start] = start;
    		}
        }
    	@Override
    	public void run() {
    		for(int start : temp) {
    			try {
    				Thread.sleep(1000);
    			} catch(InterruptedException ie) {
    				ie.printStackTrace();
    			}
    			System.out.printf("스레드 이름 : %s,", Thread.currentThread().getName());
    			System.out.printf("temp value : %d %n", start);
    		}
    	}
    	public static void main(String[] args) {
    		SingleRunnableEx srt = new SingleRunnableEx();
    		Thread t = new Thread(srt, "첫번째");
    		t.start();
    	}
    }
    


  4. join() 메소드

    • join() 메소드는 join() 메소드를 호출한 스레드가 종료할 때까지 현재의 스레드가 기다리게 해준다.
    class MyRunnable implements Runnable {
    	@Override
    	public void run() {
    		System.out.println("Run");
    		first();
    	}
    	public void first() {
    		System.out.println("First");
    		second();
    	}
    	public void second() {
    		System.out.println("Second");
    	}
    }
       
    public class JoinEx {
    	public static void main(String[] args) {
    		System.out.println(Thread.currentThread().getName()+" start!");
    		Runnable r = new MyRunnable();
    		Thread myThread = new Thread(r);
    		myThread.start();
    		try {
    			myThread.join(); // main이 끝나기 전 start() 실행
    		} catch(InterruptedException ie) {
    			ie.printStackTrace();
    		}
    		System.out.println(Thread.currentThread().getName()+" end!");
    	}
    }
    //main start!와 main end!의 사이에 Run, First, Second가 찍혀있다
    


  5. Thread의 종류

    1. User Thread : main의 종료와 상관없이 thread를 계속 실행, setDaemon(false)
    2. Daemon Thread : main 종료시 thread도 같이 종료, setDaemon(true)
    3. setDaemon() 메소드는 반드시 start() 이전에 설정해야 한다
  6. Thread 스케쥴링

    • 우선순위 방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가짐
    • 순환할당 방식 : 시간 할당량을 정해서 정해진 시간만큼 실행 후 다른 스레드를 실행
    • 순환할당 방식은 JVM에 의해 정해지기 때문에 코드로 제어 할 수 없다
    • 우선순위 방식은 setPriority(1~10) 메소드로 1~10 까지의 우선순위를 결정 할 수 있다
    • setPriority() 메소드는 반드시 start() 이전에 설정해야 한다
    class CalcThread extends Thread {
    	public CalcThread(String name) {
    		setName(name);
    	}
    	public void run() {
    		for(int i=0; i<1000000; i++) {
    		}
    		System.out.println(getName());
    	}
    }
    public class PriorityEx {
    	public static void main(String[] args) {
    		for(int i=1; i<=10; i++) {
    			Thread thread = new CalcThread("Thread" + i);
    			if (i != 10) {
    				thread.setPriority(Thread.MIN_PRIORITY);
    			} else {
    				thread.setPriority(Thread.MAX_PRIORITY);
    			}
    			thread.start();
    		}
    	}
    }// 우선순위가 높은 Thread10이 가장 먼저 찍힌다
    


  7. 동기화 (synchronized)

    • 임계 영역 : 멀티 스레드상에서 하나의 스레드만 실행 할 수 있는 코드 영역
    • 상호 배제 : 특정 프로세스가 공유 자원을 사용하고 있을때, 다른 프로세스의 접근을 제어하는 기법, 번갈아가며 쓰도록 임계 영역을 유지하는 기법
    • 동기화 메소드와 블록으로 메소드 혹은 블록에 lock을 걸어 다른 스레드가 임계 영역에 들어오지 못하게 막을 수 있다
    • 메소드에 sychhronized 지정어를 걸거나 메소드 안에서 sychhronized 블록을 생성하여 동기화 할 수 있다
    • 동기화된 스레드는 wait(), notify(), notifyAll() 메소드로 스레드간 통신을 할 수 있다 (synchronized 블록에서만 사용 가능)
    class ATM implements Runnable {
    	private long depositMoney = 10000;
    	public void run() {
    		synchronized(this) { // 동기화
    			for(int i=0; i<10; i++) { // 임계 영역
    				if(getDepositMoney() <= 0) break;
    				withDraw(1000);
    				if(getDepositMoney() == 2000 || getDepositMoney() == 4000 || 
    						getDepositMoney() == 6000 || getDepositMoney() == 8000) {					
    					try {
    						this.wait();
    					} catch(InterruptedException ie) {
    						ie.printStackTrace();
    					}
    				} else {
    					this.notify();
    				}
    			}
    		}
    	}
    	public void withDraw(long howMuch) {
    		if(getDepositMoney() > 0) {
    			depositMoney -= howMuch;
    			System.out.println(Thread.currentThread().getName()+", ");
    			System.out.printf("잔액 : %,d 원 %n", getDepositMoney());
    		} else {
    			System.out.println(Thread.currentThread().getName()+", ");
    			System.out.println("잔액이 부족합니다.");
    		}
    	}
    	public long getDepositMoney() {
    		return depositMoney;
    	}
    }
    public class SynchronizedEx {
    	public static void main(String[] args) {
    		ATM atm = new ATM();
    		Thread mother = new Thread(atm, "mother");
    		Thread son = new Thread(atm, "son");
    		mother.start();
    		son.start();
    	}
    }
    /* 출력 결과
    잔액 : 9,000 원 
    mother, 
    잔액 : 8,000 원 
    son, 
    잔액 : 7,000 원 
    son, 
    잔액 : 6,000 원 
    mother, 
    잔액 : 5,000 원 
    mother, 
    잔액 : 4,000 원 
    son, 
    잔액 : 3,000 원 
    son, 
    잔액 : 2,000 원 
    mother, 
    잔액 : 1,000 원 
    mother, 
    잔액 : 0 원 
    */
    





참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료