다시 읽고 싶은 글 (계속 업데이트)

|

저장하고 다시 읽고 싶은 글

학습

기타

git

170222_TIL

|

오늘 한 일

  • 외출하느라 강의를 듣지 못했다.
  • 장바구니에 담아두었던 정호영님 파이썬 장고 수업 을 결제했다. 아직은 파이썬 문법을 몰라서 바로 듣지는 못하겠지만 조만간 꼭 듣고 싶은 강의다.
  • 영어 스터디 시간에 재미있는 블로그 글을 준비해서 공부했다. Should designers code… or should developers design? ( https://medium.muz.li/should-designers-code-or-should-developers-design-23e480c6700a#.y6cji1f9e) 평소에도 궁금했던 부분이라 흥미롭게 읽었다. 종종 이런 주제로 자료를 준비해야겠다.

오늘 느낀 것

  • [어려운 것을 쉽게 배우는 방법]

내일 할 일

  • 컴퓨터 공학 수업 의견 물어보기
  • 프디스 2기 모임 참석
  • nodejs 강의 듣기
  • 알고리즘 문제 풀기

nodejs 데이터베이스 소개 - orientdb

|

nodejs 데이터베이스 소개

생활코딩 Node.js 강의
데이터베이스를 이용해서 웹에플리케이션을 제작하는 방법을 알아봅니다.

데이터베이스 (DB)

데이터베이스(DB)

  • 데이터를 저장하고, 꺼내오는 것 등을 전문적으로 담당하는 고도로 복잡한 소프트웨어
  • 데이터베이스라는 단어는 특정한 제품을 가르키는 것이 아닌, 여러가지 제품군을 아우르는 총칭

데이터베이스의 종류

  • 관계형 데이터베이스(Relational Database)
    • 그동안의 주요 패러다임 (ex. Oracle, mySQL, SQL SERVER)
    • 관계형 데이터베이스가 사용하는 공통의 언어 SQL
    • 데이터베이스를 배우려면 관계형 데이터베이스를 먼저 배우는 것을 추천
  • 관계형 데이터베이스가 아닌 것
    • 현대의 복잡한 데이터를 처리하기 위해서 관계형 데이터베이스가 아닌 데이터베이스들이 출현하기 시작
    • 2010년을 전후로 해서 NoSQL 운동이 일어나기 시작 (Not Only SQL)

데이터베이스에 대한 이고잉님 의견

  • 과거에 비해서 데이터베이스를 다루는 것이 점점 용이해지고 있음
  • 클라우드 컴퓨팅위에서 돌아가는 데이터베이스는 백업, 업그레이드, 하드웨어의 안정성 등을 클라우드 컴퓨팅 사업자가 대신 제공해줌, 따라서 DB의 주요 기능에 더 집중할 수 있게 됨
  • 앞으로 점점 더 중요해 지는 것
    • DB를 깊게 이해해서 어떤 문제를 효율적으로 처리하는 것
    • 다양한 DB를 접해서 하고자 하는 일에 적합한 최선의 DB를 선택 하는 것

nodejs 파일 업로드 - multer 모듈사용

|

nodejs 파일 업로드

생활코딩 Node.js 강의
사용자가 업로드한 파일을 받아서 저장하는 방법에 대해서 알아봅니다

파일 업로드 소개 및 준비

만드려고 하는 것

  • 사용자가 앱에게 전달하는 정보는 크게 텍스트파일 2가지로 나눌 수 있다.
  • 사용자가 파일을 앱에게 전달하는 방법에 대해서 알아본다.
  • 동작 개요
    • 파일 선택 form
    • 파일 선택 후 submit 버튼을 눌르면 파일 전송
    • 루트 디렉토리 내 uploads 폴더에 전송된 파일이 저장
    • 전송된 파일명을 화면에 표시
  • express는 사용자가 업로드한 파일을 받아서 저장하는 기본 기능을 제공하지 않는다.
  • 따라서 모듈을 설치해서 (ex. multer) 사용자가 전송한 파일을 처리하는 작업을 해야한다.
  • multer 모듈 설치코드 (터미널)
npm install --save multer

파일 업로드 양식 (form)

라우팅 1 - /upload path의 GET 방식 접속

  • http://localhost:3000/upload path 로 접속하면 업로드 화면을 보여주도록 라우터 연결
// 업로드 - 파일 업로드 폼
app.get('/upload', function(req, res){
  res.render('upload');
});

탬플릿 파일

  • 탬플릿 파일 저장 경로인 /views_file/ 폴더 내에 업로드 화면 구현을 위한 탬플릿 파일 작성 (upload.jade)
  • form 의 type을 enctype="multipart/form-data" 로 설정해야 사용자가 전송한 파일을 서버로 전송할 수 있다.
  • 업로드폼 탬플릿 파일 (upload.jade) 코드 예시
doctype html
html
  head
    meta(charset='utf-8')
  body
    form(action='upload' method='post' enctype="multipart/form-data")
      input(type='file' name='userfile')
      input(type='submit')
  • 업로드폼 탬플릿 파일 (upload.jade) 랜더링 결과
jade 랜더링 결과
upload.jade 파일 랜더링 결과

라우팅 2 - /upload path의 post 방식 접속

  • form을 통해서 입력된 데이터가 upload 경로로 post 방식으로 전송되었을 때 (action=’upload’ method=’post’) 전송된 데이터를 처리하기 위한 라우터 연결
app.post('/upload', function(req, res){
  res.send('업로드 성공!');
});

multer 소개

multer 모듈 적용 코드

var multer = require('multer'); // express에 multer모듈 적용 (for 파일업로드)
var upload = multer({ dest: 'uploads/' })
// 입력한 파일이 uploads/ 폴더 내에 저장된다.
// multer라는 모듈이 함수라서 함수에 옵션을 줘서 실행을 시키면, 해당 함수는 미들웨어를 리턴한다.

multer 모듈을 사용하여 post로 전송된 파일 처리

  • multer 가이드 문서
  • 사용자가 post 방식으로 전송한 데이터가 upload 라는 디렉토리를 향하고 있다면,
  • 그 다음 함수를 실행하여 콘트롤러로 연결한다.
  • 미들웨어 upload.single('avatar')는 뒤의 function(req, res)함수가 실행되기 전에 먼저 실행.
  • 미들웨어는 사용자가 전송한 데이터 중에서 만약 파일이 포함되어 있다면,
  • 그 파일을 가공해서 req객체에 file 이라는 프로퍼티를 암시적으로 추가도록 약속되어 있는 함수.
  • upload.single('avatar') 의 매개변수 'avatar'는 form을 통해 전송되는 파일의 name속성을 가져야 함.
app.post('/upload', upload.single('userfile'), function(req, res){
  res.send('Uploaded! : '+req.file); // object를 리턴함
  console.log(req.file); // 콘솔(터미널)을 통해서 req.file Object 내용 확인 가능.
});
터미널 콘솔 결과
console.log(req.file) 터미널 콘솔 결과화면

multer 심화

multer 모듈을 통해서 post로 전송된 파일의 저장경로와 파일명 등을 처리한다.

multer - 저장경로, 파일명 설정

  • multer 모듈을 통해서 post로 전송된 파일의 저장경로와 파일명 등을 처리하기 위해서는 DiskStorage 엔진이 필요하다. (참고 DiskStorage : The disk storage engine gives you full control on storing files to disk.)
  • DiskStorage 적용 예시 (app_file.js)
var multer = require('multer'); // multer모듈 적용 (for 파일업로드)
var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/') // cb 콜백함수를 통해 전송된 파일 저장 디렉토리 설정
  }
  filename: function (req, file, cb) {
    cb(null, file.originalname) // cb 콜백함수를 통해 전송된 파일 이름 설정
  }
})
var upload = multer({ storage: storage })

저장한 파일 조회 - static 파일 제공

  • 정적인 파일이 위치할 디렉토리의 이름 선언 (app_file.js)
  • 정적인 파일이 접근할 라우터 path 설정
    (express.static 함수를 통해 제공되는 파일에 대한 가상 경로)
app.use('/users', express.static('uploads'));

  • 이를 통해서 /users 경로를 통해 uploads 디렉토리에 포함된 파일을 로드할 수 있음
    (ex. http://localhost:3000/users/siwa.png)

javascript 객체지향프로그래밍 03 - namespace

|

javascript 객체지향프로그래밍03

윤지수님의 웹 프론트엔드 강의
네임스페이스를 이용해 실제 웹서비스 코드를 만드는 형태를 알아본다.

  • namespace : 전역을 피하는 자바스크립트 코딩 기법

    객체 소유권과 밀접히 관련된 이론으로, 전역 변수나 함수 사용을 가능한 한 피해야 한다. 이는 스크립트가 실행되는 환경을 항상 일정하게, 관리하기 쉽게 만드는 일이다. 전역 변수는 단 하나만 생성하고 그 안에 다른 객체와 함수가 존재하도록 해야 한다.

  • JS로 웹서비스 코드를 만드는 형태를 말들때는 여러가지 형태를 사용할 수 있다.
  • 서비스의 형태, 규칙을 갖고 개발할지 정해야한다.
  • 네임스페이스를 통해서 전역 공간에 있는 것들을 하나로 만들 수 있다. (자바의 패키지와 유사)
  • Yahoo의 예시
    • 전역 객체 YAHOO가 컨테이너이며 이 안에 다른 객체가 정의된다. 이런 식으로 단순히 기능을 한데 묶기 위해 사용하는 객체를 네임스페이스 라고 한다. ```
  • YAHOO.util.Dom - DOM을 조작하는 메서드이다.
  • YAHOO.util.Event - 이벤트를 다루는 메서드이다.
  • YAHOO.lang - 저수준 언어 기능과 관련된 메서드이다. ```
var MBC = {};
MBC.manager = {
	_init : function(){
		console.log('프로그램 시작!');
	},
	_attachEvents : function(){
		document.body.addEventListener('click', function(){
			console.log('body clicked!');
		},false);
	}
};
MBC.Viewer = (function(){
		function View(name){
		this.name = 'new viewer';
    }
		View.prototype.printName = function(){
			console.log(this.name);
    }
		return { View : View } // 즉시실행 함수 반환 값  
})(); // 즉시 실행 함수

MBC.Utility = {};

var myobj = MBC.Viewr; // Object{View: function}
var myinstance = new myobj.View(); // = new MBC.Viewer.View();
myinstance.printName() // new viewer 리턴
  • 이렇게 만들 때 주의사항은 네임 규칙을 계층적으로 설정해야 한다.
  • 네임스페이스 객체를 사용했을 때 장점
    • 계층적으로 의미에 맞춰서 기능들을 그룹화 할 수 있다.
    • 해당 기능을 어디서 호출하는지 혼란스럽지 않다.유지보수에 용이하다.
    • 전역변수를 획기적으로 줄일 수 있다.
  • 네임스페이스 객체 이름은 유니크하게 정하는게 좋다. (중복을 체크하고 이름을 생성해주는 네임스페이스 라이브러리 존재)
  • 네임스페이스 안에는 어떠한 코드 패턴도 사용 가능 (프로토타입 기반의 생성자 패턴, 모듈 패턴 등)