7. Template

1. Template 엔진 소개

  1. Template 엔진을 사용하게 되면 우리는 복잡한 html 코드를 간단하게 표현할 수 있습니다./

       // html
       <html>
     <head>
         <title>Hello world</title>
     </head>
     <body>
         <h1>Hello Template & Pug</h1>
         <ul>
             <li> coding </li>
             <li> coding </li>
             <li> coding </li>
             <li> coding </li>
             <li> coding </li>
         </ul>
         <div></div>
     </body>
     </html>
    
       // template
       html
     head
         title Hello world
     body
         h1 Hello Template & Pug
         ul
             -for(var i=0; i<5; i++)
             li coding
         div= time
    
  2. 위와 같이 비교적 간단하게 표현할 수 있게 됩니다.

2. Template 엔진 사용하기

  1. 다양한 Template 엔진들이 존재합니다. 이번에는 우리는 pug를 설치해서 사용해보도록 하겠습니다.
  2. 패키지 형태이기 때문에 npm을 이용해서 해당 내용을 가져 와야 겠지요?
  3. 이제는 익숙해지셔야 합니다.

       npm install pug --save
    
  4. 설치가 완료 되었다면, 이제 어떠한 템플리트를 사용할지를 알려줘야 합니다. 그리고 어디에 템플릿을 저장할지에 대해서도 알려줘야 합니다.

       app.set('view engine', 'pug');
       app.set('views', './views');
    
  5. 물론 default로 템플릿이 저장되는 곳을 views로 저장되어 있기 때문에 명시적으로 적을 필요는 없지만 익숙해진다는 의미에서 일단 남겨 두겠습니다.
  6. pug라는 확장자를 가지는 파일을 만들고 내부에는 html만 입력해 놓습니다.
  7. 크롬 브라우져에서 실행 시킨 후 개발자툴을 확인해 보면 html이 있는 것을 확인 할 수 있을 것입니다.

6. Express

1.Express 도입

  1. node를 통해 서버를 만들고 구동에 대한 응답을 실시해 보도록 하겠습니다.

    const http = require('http');
    
    const hostname = '127.0.0.1';
    const port = 3000;
    
    const server = http.createServer((req, res) => {
       res.statusCode = 200;
       res.setHeader('Content-Type', 'text/plain');
       res.end('Hello World\n');
    });
    
    server.listen(port, hostname, () => {
       console.log(`Server running at http://${hostname}:${port}/`);
    });
    
  2. 위와 같은 코드를 여러분의 IDE에 입력하고 터미널에서 출력해 봅니다.

  3. 서버가 구동되었음을 확인하고 웹페이지에 접근하게 되면 hello world라는 문구를 보게 될것입니다.
  4. 이미 여러분은 서버를 구축하고 동작한 상태입니다.
  5. 각각의 코드에 대한 리뷰는 계속 진행해 나가면서 설명 드리겠습니다.

2. Express 설치하기

  1. Express를 설치하기 위해서는 두가지 코드만 실행하면 됩니다.

    // 1. 현재의 디렉토리 폴더를 동일한 패키지형태로 만들어줍니다. 왜냐하면 우리가 패키지에 들어있는 모듈인 express를 사용하고 싶기 때문입니다.
    npm init
    // 2. 이제 express를 설치하고 defendencies에 해당 express를 추가해 줍니다.
    npm install express --save
    // 3. 끝
    

    3. Express를 활용한 웹앱만들기

  2. express는 하나의 모듈이기 때문에 그동안 모듈을 불러왔던 방식으로 불러오게 됩니다.

     var express = require('express');
     // express라는 모듈을 불러오게 됩니다.
     var app = express();
     // express는 사실 하나의 함수 입니다. 이것은 application을 return하게 되고 우리는 이것을 이용해서 app을 만들 수 있게 됩니다.
    
     app.get('/', function (req, res) {
     res.send('Hello Main Page')
     });
     // 여기서 기억해야 할 것은 get의 역할입니다. get은 라우터로서 routing이라는 역할을 수행하게 됩니다. 즉 길을 안내해주는 역할을 하며 길의 분기는 '/'다음의 문자를 통해 구분할 수 있습니다.
     app.get('/login', function (req, res) {
         res.send('Hello This is Login page')
     });
    
     app.listen(3000, function () {
         console.log('Connect 3000 port!')
     });
    

4. 연결성

  1. 옥스포드 블럭의 관점에서 봤을 때 우리는 제한적인 블록으로 엄청나게 많은 서로 다른 형태의 블록들을 만들어 낼 수 있습니다.
  2. 예를 들어 10 개의 색상이 다른 1개짜리 블록, 10개의 색상이 다른 2개짜리 블록, 10개의 3개짜리 색상이 다른 블록이 있다고 했을 때 우리는 총 30개의 블록을 이용해 1000개의 서로 다른 형태의 블록을 만들 수 있습니다.
  3. 그리고 블록의 순서까지 고려하게 된다면, 이 숫자는 더욱 폭발적으로 증가하게 되겠지요.
  4. 지금까지 우리가 배운 블록들은 아래와 같습니다.
    1. Modules
    2. nodeJs에서 HTTP, OS, FS 각각에서 사용할 수 있는 메소드들
    3. JavaScript에서 해당 메소드를 조합하는 방법
  5. 각각의 것들을 적절하게 사용할 수 있게 된다면 우리는 엄청나게 다양한 앱들을 만들 수 있게 됩니다.

5. 정적파일 제공하기

  1. 정적 파일들을 한곳에 저장해 두고 우리가 필요할 때마다 꺼내 쓸 수도 있습니다.
     var express = require('express');
     var app = express();
     app.use(express.static('public'));
     app.get('/', function (req, res) {
         res.send('Hello World');
     });
     app.listen(3000, function () {
         console.log('Connected 3000 port');
     });
    

6. Express로 웹페이지를 표현하는 방법

  1. 동적과 정적에 대한 이해가 필요합니다.
  2. 동적 언어는 사용자와의 interaction에 대해 동적으로 반응하는 것이며, 이는 컴파일 과정 중에 수행하게 되는 일들을 런타임에 수행하는 고급 언어를 의미하는 용어입니다. 통상 동적 언어가 런타임에 수행하는 일은 코드 추가, 타입 시스템 변경등이 있습니다.
  3. 정적 언어에서는 사용자의 요청에 대해 결과값(html문서)등을 보여주는 것만 하게 됩니다.
  4. 동적이냐 정적이냐를 결정하는 것은 컴파일 이후, 런타임 도중에 특정 이벤트에 대해 어떻게 대처하느냐에 대한 문제입니다.

3. 모듈

1. NPM은 무엇인가?

NPM(Node Pakage Manager)입니다. 즉 Node에서 사용할 수 있는 아주 기초가 되는 부품이라고 할 수 있습니다. 우리의 선배님들이 후배들을 위해 구현에 복잡할 수도 있는 기능들을 미리 모듈화 해서 저장해 놓을 수도 있을 것입니다. 이것을 우리는 NPM이라는 마치 앱스토어 같은 플랫폼을 활용해서 손쉽게 사용 할 수 있는 것이지요. 주요한 기능으로는

  1. 모듈의 설치
  2. 모듈의 삭제
  3. 모듈의 업데이트
  4. 모듈의 의존성 관리

입니다. 여기서 모듈의 의존성 관리는 만약 우리의 프로젝트가 NPM을 통해 몇가지의 모듈을 사용한다면 어떠한 모듈을 사용하는지에 대한 JSON 형태의 문서를 NPM이 쉽게 관리 해주게 되는 것이죠. NPM을 통해 우리가 설치할 수 있는 것은 크게 2가지 종류가 있습니다.

  1. 독립적으로 동작하는 앱 (예를 들어, npm install uglify-js-g)
  2. 모듈 (예를 들어, npm install uglify-js)

두 가지 모두를 포괄하는 개념은 Package입니다.

2. NPM 독립적으로 동작하는 앱

  1. 먼저 uglify-js를 독립적인 앱으로 한번 설치해 봅시다.
  2. 터미널을 열고 'npm install uglify-js-g'를 입력하고 설치합니다.
  3. 앞서 살펴 봤던 것처럼 -g의 유무는 -g가 있는 경우에는 독립적인 앱으로 설치해서 특정 폴더 밖에서도 설치한 앱에 접근하여 실행할 수 있게 됩니다.
  4. 여러분이 설치한 IDE에 pretty.js라는 파일을 하나 만든위 아래와 같은 코드를 입력하고 저장합니다.

    function hello(name){
       console.log('hi' + name);
    }
    hello('TS');
    
  5. 터미널에서 여러분이 파일을 저장한 폴더로 이동합니다.

  6. 이동 후 uglifyjs pretty.js를 입력하면 띄워쓰기와 줄바꿈이 사라진 한 줄짜리 결과를 얻게 될 것입니다.
  7. 관습적으로 최소화한 파일의 이름은 'uglifyjs pretty.js -o pretty.min.js -m'와 같은 코드로 이름을 저장하게 됩니다.

3. NPM을 이용해서 나의 앱의 모듈로 사용하기

  1. underscore를 설치해 봅시다.
  2. 다른 사람이 만든 모듈(상대방의 패키지)을 사용할 때에는 자신의 프로젝트도 하나의 패키지임으로 패키지화할 필요가 있습니다. 이는 npm init을 이용해 달성 할 수 있습니다.
  3. 기본적인 정보들을 입력하게 되면 그동안은 존재 하지 않았던, package.json이라는 파일을 확인할 수 있습니다. 해당 파일을 클릭하면 우리가 터미널에서 입력했던 값들이 JSON 형태로 변환되어 저장된 것을 확인 할 수 있습니다.
  4. 지금부터는 터미널을 열고 underscore를 설치해 보도록 합시다.
  5. 'npm install underscore --save'를 입력하면 설치가 자동으로 실행됩니다. 여기서 '--save'를 입력하는 이유는 json에 명시적으로 저장하는 것입니다. 이는 협업과 긴밀한 관계를 가지고 있습니다. 만약 2명의 사람이 github를 이용해 프로젝트를 수행하는 중에 A라는 컴퓨터에는 underscore라는 모듈을 사용하고 있지만 B라는 컴퓨터에는 사용하고 있지 않아 다른 환경에서 프로젝트를 진행하게 되면, 자칫 잘못하면 재앙을 가져올 수도 있습니다. 동일한 작업 환경을 구성하기 위해 우리는 package.json파일을 dependencies를 참고하면 쉽게 동일한 개발 환경을 구성할 수 있겠지요.
  6. 그리고 다시 package.json을 열어보면 defendencies라는 항목이 생긴것을 확인 할 수 있습니다. 이것을 통해 모듈성 관리를 쉽게 하도록 도와주는 역할을 수행하게 됩니다.
  7. 만약 --save를 해서 문제가 발생하는 경우 'npm cache clean'으로 cache정리를 해보세요.

4. 모듈 사용하기

  1. underscore를 사용해 봅시다.
  2. 아래의 코드를 여러분의 IDE에 입력해 보세요.

    var _ = require('underscore');
    
    var arr = [1,2,3,4,5]
    
    // 가장 처음의 값에 접근하기
    console.log(arr[0]);
    console.log(_.first(arr));
    // 마지막 값에 접근하기
    console.log(arr[arr.length - 1]);
    console.log(_.last(arr));
    
  3. underscore라는 모듈을 설치함으로해서 우리는 배열의 값들에 접근할 수 있는 방법을 얻게 되었습니다. 우리에 앞선 선배들이 만들어 놓은 다양한 모듈들을 단순히 가져오는 것만으로도 우리는 간편하게 다양한 기능들을 쓸 수 있게 된 것이죠.

  4. 여기서 중요한 시사점이 있습니다. 하나의 완성된 앱을 건담 프라모델이라고 생각해 봅시다. 극단적인 상황을 가정하여 여러분이 하나의 프라모델을 완성하기 위해 원하는 플라스틱을 가공하고 이것들을 조립한다고 생각한다면, 너무도 큰 일이고 힘든 일이 될 것입니다. 즉, 생산성이 매우 떨어 지게 되는 것이죠. 만약 여러분들이 만들게 되는 부품을 표준화된 형태로 만들어서 다른 사람도 함께 쓸 수 있게 된다면, 여러분의 부품을 사용하게 되는 다른 사람은 좀 더 빠르고 쉽게 다음 단계로 나아갈 수 있을 것입니다. 인간이 다른 동물과의 가장 큰 차이점이 지식을 전달할 수 있는 언어와 인쇄기술을 발달시킨 것입니다. 우리는 새로운 부품을 만들어 내는 선구자가 될 수도 있지만, 다른 선구자들이 만들어 놓은 부품들을 사용해 혜택을 보는 후손이 될 수도 있습니다. 이것은 지식의 발전적 관점에서 보면 매우 중요한 인식의 전환입니다. 사설이 길었지만 제가 하고 싶은 말은 모든 것을 혼자 다 하려고 하지마세요. 누가 미리 만들어 놓은 부품을 사용한다고 해서 여러분이 정직하지 못하거나, 실력이 모자란 것이 아닙니다. 부품을 잘 사용하고 여러분도 나중에 많은 사람들의 사랑을 받는 부품을 만듦으로써 보답하면 됩니다. (사실 이건 저의 얘기 입니다.ㅎㅎ 위와 같은 이유로 다른 사람이 만들어 놓은 모듈을 사용하는 것을 꺼렸거든요.)

4. Callback

Callback함수는 무엇인까요?

  1. 먼저 Callback함수에 대한 정의부터 하고 진행해 보겠습니다. 통상 함수를 정의하고 함수를 호출하기 위해 우리는 정의된 이름의 함수를 호출해 줍니다. 여기서 함수를 호출하는 것을 Call이라고 하고 이때 함수내에 정의된 실행코드들이 개발자의 의도에 따라 실행되게 됩니다. 즉, 함수를 Call(호출) 할때 실행되는 함수를 일반적인 함수라고 합니다. 그렇다면 Callback함수는 Call(호출)시에 실행되는 것이 아니라, Callback(응답)할때 호출되는 함수입니다. 여기서 유의해야 하는 것은 사람은 프로그램이 실행되는 와중에 여러분이 의도한 실행코드를 순차적으로 실행하기 위해 개입하거나 할 수 없다는 것입니다. 여기서 이해가 필요한 중요한 것은 비동기 입니다. 프로그램이 실행된 뒤 특정 함수를 호출하고 함수내에서 그 결과를 이용해서 또다른 작업을 수행하고자 할때 우리는 callback함수를 사용하게 됩니다.

비동기를 이해하기 위해서는 하나의 소설을 이해할 필요가 있습니다. TS는 보디빌딩 대회 참여를 위해 극단적인 식단관리에 들어갑니다. 대회가 끝나고 그동안 먹지 못했던 음식들을 먹기 위해 평소 먹지 못했던 피자, 햄버거, 라면, 족발, 김밥을 먹기로 합니다. 하지만 점심시간이었고, 한집 한집 들러 TS가 원하는 모든 음식을 받아오기에는 너무나 시간이 걸립니다.(하나의 작업이 완료되고 다음 작업이 수행되는 것: 동기처리) 좋은 아이디어를 생각하던 중 순X이라는 어플을 떠올리고 본인이 원하는 음식점을 들러 번호를 받습니다. 각각의 음식점의 음식이 준비되면 먼저 완료되는 지점부터 방문해서 음식을 받게되는 것이죠.(한번에 모두 실행하고 먼저 완료되는것 부터 처리하는 방법: 비동기처리)

  1. 터미널에서 node라고 타이핑 합니다. 이렇게 되면 우리는 한줄 한줄 입력하는 형태로 프로그래밍 할 수 있게 됩니다. 즉각적인 결과값을 확인할 수 있지만, 앞선 코딩에서 수정 사항이 발생 하면 수정에 어려움이 있다는 점에서 저희는 지금까지 IDE에서 파일형태로 코드를 입력하고 한꺼번에 컴파일하는 과정을 거쳤습니다. 어쨌든 지금은 node를 타이핑하고 한줄 한줄 바로 결과를 확인해 보도록 하겠습니다.

    node
    
  2. 지금부터 한줄한줄 실행할 수 있게 됩니다. 함수와 Obejct를 하나 정의해 보도록 하겠습니다.

     a = [3,1,2]; function b(v1, v2){return v2-v1;}; a.sort(b); console.log(a);
    
  3. 다음을 실행하게 되면 3,1,2로 선언되어 있던 Object 값이 3,2,1로 출력되는 것을 확인할 수 있습니다. sort라는 메소드에 대한 documentation을 확인해 보면 함수를 인자로 받을 수 있다는 것을 확인할 수 있습니다. 또한 인자로 받게 되는 함수를 적절히 선언하면 여러분들이 원하는 의도대로 함수를 수행할 수 있게 됩니다.

5. 동기와 비동기

1. 의미

  1. 동기: 여러가지 일을 순차적으로 수행, 앞선 일의 완료시점은 다음 일의 시작시점.
  2. 비동기: 여러가지 일을 한꺼번에 수행, 완료시점 알수 없음.

2. 활용

  1. 지금부터는 활용을 통해 동기와 비동기를 이해해 보도록 하겠습니다.
  2. 먼저 filesystem에 관련된 documentation을 node 웹사이트에서 확인해 보시면, 파일을 읽어 오는 방식에 있어서 명시적으로 sync가 붙어 있는 method를 확인할 수 있을 겁니다. 되도록 동기 방식의 사용을 지양해라고 말하고 있지만 일단 어떤 식으로 활용하는지 확인해 보도록 하죠.

    var fs = require('fs');

    console.log(1); var data = fs.readFileSync('hello.txt', {encoding: 'utf8'}); console.log(data)

    console.log(2);

    fs.readFile('hello.txt', {encoding: 'utf8'}, function(err, data) {

    console.log(3);
    console.log(data);
    

    })

    console.log(4) 1 hello sync & async 2 4 3 hello sync & async

  3. 결과를 확인해 보면 아래 나와 있는 형태를 확인할 수 있습니다. 여기서 주목해야 할 점은 비동기적으로 처리 되고 있는 함수의 경우 콜백함수가 호출되기 이전에 readFile함수 뒤에 있는 내용이 먼저 호출되고 있다는 점입니다. 즉, reaFile 함수의 처리가 완료 되었을 때 해당 내용을 출력하고 그 이전에 먼저 실행할 수 있는 내용을 실행하는 것이죠.

DataBase2

  1. Intro

    • 1960년대 부터 폭발적으로 늘어나는 데이터를 처리 할 방법에 대한 고민이 시작됩니다.
    • 1970년 에드가 프랭크 테드가 포는 관계형 데이터 베이스를 고안해 냅니다.
    • 지금까지 관계형 데이터 베이스는 절대 강자로 군림하고 있습니다.
    • 관계형 데이터 베이스를 통해 표로 정리 할 수 있으며, 빠르게 데이터를 searching 할 수도 있게 됩니다.
    • MySQL, Oracle, SQL Server, DB2, Access 모두 이와 같은 관계형 데이터 베이스에서 만들어진 기술들입니다.
    • 여기에서 세손가락안에 들어가는 마법의 케비닛인 MySQL을 배워 보도록 합시다.
  2. 데이터베이스의 목적

    • 스프레드 시트 VS MySQL
    • 스프레드 시트는 GUI로 우리가 어떤 데이터를 Sorting하거나 추출하려고 할때 클릭을 이용해서 편리하게 가져 올 수 있습니다.
    • MySQL은 데이터베이스를 코딩을 통해서 데이터를 가져오게 됩니다.
    • 예를들어 웹사이트에 특정 정보를 제공하는 경우 데이터 베이스를 통해 모두가 동일한 결과물을 확인할 수 있게 됩니다.
  3. MySQL

    • 데이터 베이스(= 스키마)
      • 표들의 묶음
      • 연관된 표들의 묶음
    • 데이터베이스 서버
      • 스키마들의 묶음
    • 권한의 제한
      • 특정 권한(읽기, 쓰기)을 제한적으로 제공 할 수 있다.
      • ./mysql -uroot -p를 터미널에 적고 인스톨시에 제공되는 비밀번호를 입력하면됩니다.
    • 스키마 만들기
      • 데이터베이스 만들기: CREATE DATABASE 데이터베이스이름
      • 데이터베이스 지우기: DROP DATABASE 데이터베이스이름
      • 데이터베이스 보기: SHOW DATABASES
    • 사용 순서
      • 사용하기전 MySQL에게 사용함을 알리기: USE 데이터베이스이름
  4. SQL (Structured Query Language)
    • Structured
      • 표로 만들어서 정리 정돈한다는 의미입니다.
    • Query
      • 데이터베이스에게 표를 만들고, 수정하고, 삭제하고는 등의 요청을 말합니다.
    • Language
      • 데이터베이스도 이해하고 개발자도 이해할 수 있는 언어라는 말입니다.
    • 종합
      • 사람이 SQL이라는 언어를 통해서 MySQL Server에게 표와 같은 구조화된 데이터를 만들고, 수정하고, 삭제하는등의 요청을 위한 언어라고 생각시면 됩니다.
    • 특징
      1. 쉽습니다.
      2. 중요합니다.
    • 사용되는 용어 정리
      • table, 표
        • row, record, 행
        • column, 열
  5. 표 만들기

    • 테이블에 대한 cheatSheet를 참조하게 되면 쉽게 SQL과 관련된 Syntax를 배울 수 있습니다.
    • 통상 스프레드시트와 같은 경우 하나의 column(열)에 다른 데이터 타입을 넣을 수 있지만 SQL에서는 하나의 데이터 타입으로 강제 할 수 있습니다. 이것을 통해 우리게 얻게 되는 장점은 꺼낼때 어떠한 데이터를 가져오게 될지에 대해서 신경 쓸 필요가 없게 되는 것입니다.
    • 그렇다면 질문

      • 각 열을 어떠한 데이터 타입으로 강제 해야 할 것인가?
      • 우리가 저장하게 될 데이터의 종류 중에서 최대치 또는 최소치를 커버할 수 있는 데이터 타입으로 정하는 것이 타당해 보입니다.

      MySQL 데이터 타입 정리가 잘 된 사이트 입니다. https://www.techonthenet.com/mysql/datatypes.php

    • 테이블 열 구성하기

        CREATE TABLE 테이블이름(
                                id INT(11) NOT NULL AUTO_INCREMENT,
                                title VARCHAR(100) NOT NULL,
                                description TEXT NULL,
                                created DATETIME NOT NULL,
                                author VARCHAR(30) NULL,
                                profile VARCHAR(100) NULL,
                                PRIMARY KEY(id) <- id가 main키야! 기억해
      
    • id값을 사용하는 이유
      • 성능에 대해서는 나중에..
      • 중복: 개별 데이터에 유일한 ID를 제공함으로해서 데이터를 다루는데 있어 매우 유리하게 됩니다.
  6. Create Read Update Delete

    • 모든 데이터 베이스가 가지고 있는 4가지 주요한 기능 입니다.
    • Create, Read는 데이터에서 가장 중요한 꽃입니다.
    • 어떤 데이터에서는 수정과 삭제를 죄악시 하기도 합니다.(종범 실록, 다스 장부)

      INSERT

      INSERT INTO 테이블이름 (컬럼이름1, 컬럼이름2, 컬럼이름3, ... ) VALUES(컬럼값1, 컬럼값2, 컬럼값3, ...);
      

      통상 우리가 저장해 놓은 테이블의 형태를 까먹는 경우가 많습니다.(적어도 저는... 또륵) 우리가 저장한 테이블의 형태를 알기 위해서는 DESC(Description이겠지요?) 테이블 이름을 적어 주면 됩니다.

      DESC 테이블이름;
      

      READ

      SELECT * FROM 테이블이름;
      

      구체적으로 가져오고자 하는 정보를 말하지 않는다면 우리는 모든 정보를 가져오게 됩니다.

      SELECT id,title,created,author FROM 테이블이름;
      

      SELECT와 FROM 사이에 입력한 PROJECTION(컬럼이름)에 해당하는 값들만 가져오게 됩니다.

      SELECT id,title,created,author FROM 테이블이름 WHERE author='PACMAN';
      

      SELECT와 FROM 사이에 입력한 PROJECTION(컬럼이름)에 해당하는 값들 중에서 author의 값이 PACMAN인 row만 가져옵니다.

      SELECT id,title,created,author FROM 테이블이름 WHERE author='PACMAN' ORDER BY id DESC;
      

      SELECT와 FROM 사이에 입력한 PROJECTION(컬럼이름)에 해당하는 값들 중에서 author의 값이 PACMAN이며 정렬 순서는 내림차순으로 정렬됩니다.

      SELECT id,title,created,author FROM 테이블이름 WHERE author='PACMAN' ORDER BY id DESC LIMIT 2;
      

      엄청나게 많은 데이터가 저장되어 있는 경우 예를 들어 1억, 10억개... 한꺼번에 데이터를 가져오게 된다면 우리의 컴퓨터는 감당할 수 없을 것입니다. 이것을 예방하기 위해 우리는 limit을 걸 수 있습니다.

      UPDATE

      UPDATE userInfo SET description='Oracle is ...', title='Oracle' WHERE id=2;
      

      특정 위치에 있는 정보를 바꿀 수도 있습니다. 여기서 반드시 기억하셔야 할 것은 WHERE문입니다. 만약 특정 위치를 정해 주지 않는다면 SET 뒤에 명시한 컬럼의 정보들이 모두 입력한 정보로 바뀌게 되기 때문입니다.

      DELETE

      DELETE FROM userInfo WHERE id = 5;
      

      특정 위치에 있는 정보를 삭제 하고 싶을 때 사용하면 됩니다. 여기서 중요한 것은 반드시 어느 위치의 정보를 삭제할 것이고 해당 위치를 구분 할 수 있는 유일한 값에 대한 정보를 함께 제공해 줘야 한다는 것입니다.

  7. 수업의 정상

    • Relational(혁신) Database(본질 = Create Read Update Delete)
  8. 관계형 데이터베이스

    • 왜 이것을 사용하는가?
      • 기분 좋은 상상을 해봅시다. 여러분이 만든 서비스를 매우 많은 사람들이 이용하게 되었고, 유저의 정보량이 1억개이며 여기에서 1000만개 이상이 중복되는 정보라고 생각해봅시다. 중복된 정보는 제거 되어야 할 것인데 이것을 관계형 데이터로 바꿔 놓는다면 우리는 이와 같은 작업을 쉽고 빠르게 해낼 수 있습니다.
      • 장점
        • 유지보수의 편의성이 있습니다.
        • 예를 들어서, author의 이름을 관계형 데이터 베이스로 만들어 놓고 author_id 제공을 통해 참조하게 한다면, 참조된 값과 연결되어 있는 author의 값이 들어 있는 테이블만 변형 시키면 모든 테이블에 동시에 적용됨으로 아주 편리합니다. 그렇지 않다면.. 우리가 하나하나 다 바꿔야 겠지요(재앙).
        • 동일한 정보를 가지고 있는 사람을 구분 할 수 있게 됩니다.
      • 단점
        • 표에 참조값만 있는 경우 해당 참조값이 내포하고 있는 정보를 파악하기 위해 다른 표를 봐야 하는 번거로움이 생깁니다.
        • 이러한 번거로움을 제거 하기 위해 우리는 JOIN을 사용하게 됩니다.
    • JOIN
      SELECT * FROM userInfo LEFT JOIN author ON userInfo.author_id = author.id;
      
    • 다음과 같이 표현하게 되면 우리는 분리한 두개의 테이블을 하나의 테이블로 보여줄 수 있습니다.
    • 출력시 author_id와 id가 겹쳐 보이는 모습을 보이게 되므로 특정 컬럼의 값만 가져오는 코드를 이용해 가져오도록 합니다.
      SELECT userInfo.id, title, description, created, author, profile FROM userInfo LEFT JOIN author ON userInfo.author_id = author.id;
      
    • 여기서 명시적으로 userInfo.id라고 말해주는 이유는 MySQL이 author 테이블에 있는 id와 구분하지 못하기 때문입니다.
      SELECT userInfo.id AS USER_ID, title, description, created, name, profile FROM userInfo LEFT JOIN author ON userInfo.author_id = author.id;
      
    • 여기서 첫번째 들어가는 userInfo.id를 USER_ID로 바꿔 줄 수도 있습니다.
    • 여기서 관계형 데이터베이스는 JOIN과 함께 강력한 힘을 발휘하게 됩니다.

      잠깐 관계형 데이터베이스는 테이블의 1:1 대응이 아니라 Many : Many의 대응이 가능하게 한다는 점이 인상적인입니다. 즉 테이블들 사이에서 서로 공유하고 있는 유일한 값인 ID를 통해서 하나의 테이블 정보가 바뀌게 되면 이를 참조하고 있는 모든 테이블내의 정보가 바뀌게 된다는 것이죠. 생각만해도 매우 강력한 기능입니다.


DataBase

  1. Database?

    • 데이터 베이스에 저장된 데이터를 통해 우리는 통찰력 있는 분석을 해낼 수 있습니다.
    • 여기에서 가장 기초가 되는 데이터의 형태는 바로 File입니다.
    • 하지만 File만으로는 모든 것을 할 수가 없습니다.
    • 이것을 위해 고안된 것이 바로 Database입니다.
    • Database를 위한 여러가지 제품들이 존재하며 종류로는 MySQL, Oracle, SQL Server, MongoDB 등등.
  2. Database의 본질

    • 어떻게 입력하고, 어떻게 출력하는지를 할 수 있으면 Database의 50%를 달성한 것입니다.
    • 입력
      1. Create: 입력
      2. Update: 수정
      3. Delete: 삭제
    • 출력
      1. Read: 읽기

Create Read Update Delete

  1. file -> database로 가는 길
    • 우리는 데이터를 저장하는 가장 기본적인 형태를 file이라고 했습니다.
    • 그럼 우리는 file을 이용해서 데이터를 저장하고, 이용하고, 관리해보도록 합시다.
    • 이를 위해서 우리는 총 5개의 파일을 만들도록 합니다.
    • 파일의 형태는 txt이며 들어가는 내용으로는 제목, 날짜, 작성자, 작성자 프로필 정도로 합시다.
    • 자 그럼 만들어 보시죠.
  2. 어려움
    • 데이터를 문서에 저장을 하였으면, 우리는 데이터의 내용에 접근하기 위해서 각각의 텍스트 파일을 열어 확인을 해봐야 합니다.
    • 또한 작성자가 누구이며, 작성자의 프로필과 작성 시간, 제목에 따라 분류를 하고 싶다는 필요성을 가지게 될 것이고, 이것을 통해서 의미 잇는 정보들을 가지기를 바랄것입니다.(그럴 것이라고 믿습니다. :))
    • 이와 같은 니즈를 해결하기 위해 우리가 가장 먼저 취할 수 있는 것은 바로 스프레드 시트(엑셀, 넘버스 등등)를 이용하는 방법일 것입니다.
  3. 해결책
    • File -> SpreadSheet -> Database
    • 파일의 불편함(각 파일에 저장 되어 있는 내용에 접근하기 위해서는 파일을 열어서 확인을 해야 하는 번거로움, 정렬된 표 형태로 데이터 구조화, 원하는 정보만 Filtering 하고싶은 니즈)을 SpreadSheet가 해결
    • SpreadSheet의 번거로움(사람이 데이터에 대해 하나하나 CRUD를 해야 하는 번거로움)을 Database 제품들의 자동화를 통해 해결

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

  1. 관계형 데이터 베이스의 종류
    • Oracle
    • MYSQL
    • SQL SERVER 가장 기본이 되는 내용이기 때문에 먼저 배우는 것이 가장 좋습니다.
  2. 데이터 베이스의 종류는 이것 밖에 없는 것일까요?
    • 관계형 데이터 베이스가 주류를 이루다 이제는 새로운 데이터 베이스의 필요성이 대두되면서 다양한 종류의 데이터 베이스가 등장 하게 됩니다. 그에 대한 운동이 NoSQL운동입니다.
    • 클라우드 컴퓨팅의 등장으로 인해서 이제는 데이터 베이스의 본질적인 기능에 더욱더 집중 할 수 있게 되었습니다.
    • 하나의 데이터 베이스를 깊게 연구해 볼 수 있는 여건이 제공 되었습니다.
  3. 그럼 데이터 베이스 엔지니어로 요청 되는 기능은 무엇인가?
    1. 하나의 데이터베이스를 깊게 알고 있는 것
    2. 다양한 데이터베이스를 두루두루 알고 있는 것 1 + 2 = 많이 알고 깊게 아는것(응? ''?)

제조 서비스 융합

Emerging innovation Stategy

PSS(Product Service System) - 서비스와 제품이 결합된 것. ex) 아마존 킨들, 아이팟 & 아이튠즈

  1. User-Centeredness
    • 고객의 Needs에 맞춰서 Total Offering 개념으로 제공하는 것이 트랜드임.
  2. Technological Progress
    • 스마트 기기, 앱의 보편화로 배달의 민족 서비스가 가능해짐.
  3. Ecological Recognition
    • 소유에서 공유의 개념으로 바뀌었다.

비즈니스 모델 캔버스

  • 여러장의 비즈니스 캔버스 모델을 그릴 수가 있을 것이다.

제조기업의 혁신 전략

  • Down Sizing
  • M & A, Strategic Alliance
  • Process Innovation
  • Servitization, Servicizing

  • 제조기업의 서비스화 B2B - 유형 A

    • 제록스: Pay per Copy (12년동안 매년 41%의 성장을 이룸)
    • 롤스 로이스: Power-by-the-hour (지속적인 유지보수를 통해 엔진의 사용 기한을 보장)
    • Man Truck & Bus UK Ltd. - Cost per Km
    • Phillips: Pay per Lux
  • B2C

    • 나이키 퓨어밴드
    • Stellcase
  • 고객과의 관계를 중요시 하게 되는 Service

    • 공유경제: 이제는 이미 '보편화'된 공유경제
    • Apple
    • SPA brand: 제조 -> 유통으로 전환.

서비스화에 활용 가능한 역량

  • 구매: 협력사 네트워크, 구매 협상력
  • 제조 역량: 연구/ 개발, 생산/품질 (키자니아, 유닉스, CJ 프로시안 쿠킹클래스)
  • 관리 역량: 재무/ 환계, 인사/ 교육
  • 마케팅, 영업: 영업 채널, 고객 기반

제조업의 서비스화 Driver

  • 사물인터넷(IoT)으로 대표되는 ICT 기술의 활용을 통한 스마트화는 제품-서비스간 융합을 가속시키고, 새로운 비즈니스 기회를 제공
  • 사물들이 Senser와 함께 서로 통신하는 것
제품이 서비스 능력을 가지는 것
Smart Something을 찾는 것이 중요하다.

+ Recent posts