2015년 6월 29일 월요일

[H3 2011] 하이브리드 앱 아키텍쳐 및 개발방법








자료: http://www.slideshare.net/devparan/h3-2011-c5-hybrid-app-architecture-and-development-method

추가 자료: https://jhpark0803.wordpress.com/%EC%BB%A8%ED%8D%BC%EB%9F%B0%EC%8A%A4-%EC%9E%90%EB%A3%8C-%EB%AA%A8%EC%9D%8C/h3-2011/

[SW 아키텍처] Android 모바일 기반 아키텍처 사례

출처: http://hyeonstorage.tistory.com/138

Android 모바일 기반 아키텍처 사례

* 모바일 기반 아키텍처 정의서


* 문서관리


* 목차


1. Android Application 개발 개요

1.1 Android Application은 Java로 작성되며 Compile된 Class와 데이터, 리소스와 파일과 함께 apk 파일 형태로 묶여진다.

1.2 apk 파일은 Application 배포/설치를 위한 단위이며 하나의 Application으로 간주된다.

1.3 모든 Application은 리눅스 프로세스에서 실행된다.
1) 각 프로세스는 자신만의 VM을 가진다.
2) 각 Application은 고유한 userId를 가지며 Permission이 설정된다.
3) 두 개의 Application은 동일한 userId 공유가 가능하다 (동일 프로세스, VM 공유)

2. Android Application 개발 과정






3. Android Application Start-up (구동 프로세스)



리 눅스 커널 구동 후 최초로 실행되는 프로세스는 Zygote이다. Zygote란 어플리케이션을 빠르게 구동하기 위해서 미리 Fork 되어 있는 프로세스이다. 이것은 시스템에서 exec() 호출을 통해 특정 어플리케이션을 실행하고자 하기 전까지는 중립적인 상태, 즉 특정 어플리케이션과 합체되지 않은 상태를 유지한다.

4. Anroid 프로세스


* Android 프로세스 흐름 

리눅스는 기본적으로 Init이 가장 먼저 실행된다. Init.rc 라는 이름의 파일에는 Init이 해야할 작업들이 기록되어 있다. 파일시스템 마운팅, 폴더 권한설정, 캐시폴더 삭제, 시작프로그램 동작 등이 기록되어 있다.

우선 데몬을 올린다. 데몬은 Init에 의해 리눅스와 같이 시작되었다가 리눅스가 종료될 때 없어지는 프로그램으로서 데몬을 작성하는 규격에 따라 만들어져야 한다.

Zygote가 Dalvik을 초기화 한다. C 밑에 있는 기본라이브러리들은 런타임을 통해 실행되고 상위 서비스들은 Dalvic을 통해 실행된다. 이러한 과정들을 위한 설정은 해당하는 config 파일을 수정하면 된다. 어떤 동작들을 바꾸고 싶으면 기본적으로 init.rc를 바꾸면 되고 Zygote를 바꾸고 싶으면 그 설정파일을 바꾸면 된다.

그리고 시스템서버, 서페이스매니저(SurfaceManager), 오디오매니저들이 올라간다.

그 다음에는 시스템 서비스들이 활성화 된다. 이들은 서비스들이므로 서비스매니저에 등록된다.



5. Android 개발 구성 요소

User Interface, Resource and Assets, Intents & Intent Filter, Data Storage, Contentt Providers, Security & Permission

Graphics, Audio and Video, Location and Maps, App Widgets, Message Handling

[SW 아키텍처] 모바일 기반 아키텍처 (iPhone, Android)

출처: http://hyeonstorage.tistory.com/137

모바일 기반 아키텍처 (iPhone, Android)

1. iPhone

(1) Application Life Cycle


- User taps application icon : 어플리케이션 실행, 어플리케이션이 실행되면서 화면가운데 화면이 확대되는 트랜직션 그래픽스

- main(), UIApplicatonMain() : 메인함수 호출, 어플리케이션이 실작할때 최초로 읽히는 main.m 파일을 의미, 어플리케이션을 초기화

- Event Loop : 프로그램이 이벤트가 발생할때까지 대기상태로 아무것도 하지 않고 이벤트를 받을 준비를 하거나 이벤트를 받으면 응답하고 대기하는 것을 반복한다.

- System asks application to terminate : 어플리케이션 종료를 체크

- Application execution terminates : 어플리케이션 종료

(2) Event Handling Cycle



사용자가 장치를 조작하면 아이폰 운영체제는 터치 이벤트를 감지하고 어플리케이션의 이벤트 큐에 그 이벤트를 배치한다.

그러면 UIApplication 객체의 이벤트 핸들링 하부구조는 이벤트 큐의 TOP에서 각 이벤트를 꺼내와서 그 이벤트를 다루는데 가장 적합한 객체에게 전달한다. 

또한 이벤트는 어플리케이션에서 터치 이벤트를 다루어야 할 간접적인 책임이 있는 컨트롤 객체와 기타 객체에게 전달될 수도 있다.

(3) iPhone App에 사용된 Design Pattern

- Model-View-Conroller

모델-뷰-컨트롤러(MVC) 디자인 패턴은 어플리케이션의 객체들을 세 가지 역할로 나눈다.

모델 객체는 데이터를 나타낸다.

이 어플리케이션에서 데이터가 매우 단순하다. 그냥 문자열이다. 그리고 실제로 하나의 메소드 안에서만 사용될 것이다. 그래서 엄밀히 말하면 모델이 필요하지 않다고도 할 수 있다. 그러나 여기서 중요한 것은 기본 원칙이다. 다른 어플리케이션들에서 모델은 좀 더 복잡할 것이며 여러 곳에서 사용될 것이다.

뷰 객체는 데이터를 보여주는 법을 알며 사용자에게 데이터를 편집할 수 있게 한다.

컨트롤러 객체는 모델과 뷰를 연결한다.

- Delegation

딜리게이션은 한 객체가 자신의 딜리게이트(위임자)로 지정된 다른 객체에게 입력을 요청하거나 이벤트가 발생했음을 알리기 위해 주기적으로 메시지를 보내는 패턴이다.

이것은 클래스 상속을 사용하지 않고도 이미 존재하는 객체의 기능을 확장하여 재사용할 수 있는 방법이다.

딜 리게이트 메소드는 보통 프로토콜로 그룹 지어져 있다. 프로토콜은 기본적으로 단순히 메소드들의 리스트이다. 어떤 클래스가 프로토콜을 따른다면(Conform), 그것은 해당 프로토콜이 필요로 하는 메소드들을 구현했음을 보장하는 것이다. 딜리게이트 프로토콜은 객체가 그 딜리게이트에 보낼 수 있는 모든 메시지를 정의한다.

- Target-action

타겟-액션 매커니즘은 버튼이나 슬라이더 같은 컨트롤 객체가 클릭이나 드래그와 같은 사용자 이벤트에 반응하여, 그 메시지를 해석할 수 있는 다른 객체(타겟)에게 메시지를 보내며(액션) 어플리케이션에서 지정된 명령을 수행

(4) View Class Hierarchy

- 뷰가 다시 그려질 필요가 있으면, UIView 객체의 기제작된 드로잉 코드는 drawRect: 메소드를 호출하여 사각영역으로 전달함

- 추가한 커스텀 뷰 서브클래스에서 이 메소드를 오버라이드하고, 뷰의 컨텐츠를 그리기 위해 사용함

- 처음으로 뷰가 그려지면, drawRect: 메소드에 전달된 Rectangle은 뷰의 전체 가시 영역을 포함함

- 이후의 호출동안 이 Rectangle은 실제로 다시 그려져야할 부분만 표현함

뷰가 다시 그리는 이벤트
> 부분적으로 뷰를 가리는 다른 뷰를 이동하거나, 제거할 때
> hidden 프러퍼티를 NO로 설정함으로써 이전에 숨겨진 뷰를 다시 보이게 할 때
> 뷰의 스크롤을 움직일 때
> 뷰의 setNeedsDisplay나 setNeedsDisplayInRect: 메소드를 명시적으로 호출할 때

drawRect: 메소드를 호출한 후, 뷰는 스스로 업데이트 되었음으로 표시하고, 또다른 업데이트 사이클이 도착하고, 업데이트 사이클을 촉발하는 새로운 액션을 기다림

뷰가 정적인 컨텐츠를 표시한다면, 스크롤과 다른 뷰 때문에 발생하는 이벤트만 신경쓰면 됨

뷰 컨텐츠를 주기적으로 업데이트 한다면, setNeedsDisplay나 setNeedsDisplayRect: 메소드를 언제 호출할 지 결정해야만 함 또한 사용자와 상호작용이나 새로운 컨텐츠의 생성에 응답해 뷰를 업데이트 할 수도 있음

(5) Layered View in Clock Application




2. Android 

(1) Android SDK Emulator 디렉토리 구조와 UI


(2) Android Architecture




안드로이드 플랫폼은 크게 리눅스 커널과, C/C++ 로 작성한 라이브러리, 안드로이드 응용프로그램의 뼈대를 제공하는 어플리케이션 프레임워크와 기본 어플리케이션으로 구성돼 있다. 리눅스 커널은 OS의 기본 기능인 태스크간의 스케쥴링과 메모리, 디스크, 네트워크 등의 자원을 사용할 수 있도록 시스템 콜을 제공한다. 이는 리눅스 커널 윗부분에 초록색으로 표시된 네이티브 라이브러리를 통해 응용프로그램이 편하게 사용할 수 있는 형태로 제공된다.

안드로이드 응용프로그램은 자바 언어로 작성하고, 자바 클래스로 구성된 어플리케이션 프레임워크를 이용한다. 이 자바 파일을 안드로이드 SDK를 이용해 빌드하면 내부적으로 Java 컴파일러와 dex converter를 거쳐 Dalvic VM위에서 동작하는 바이트 코드로 변환하게 된다.
결과적으로 안드로이드 응용프로그램은 어플리케이션 프레임워크를 이용해 버추얼머신에서 제공하는 코어 라이브러리 기능을 사용하게 되고, 이 코어 라이브러리는 리눅스 커널 위에서 동작하는 다양한 C/C++ 라이브러리를 호출하게 된다. 이 라이브러리는 필요에 따라 리눅스 커널의 시스템 콜을 호출하게 된다.

(3) Android Architecture에 사용된 Open Source


안드로이드 플랫폼에는 다양한 오픈소스가 사용되었다.

(4) Android Application Layer


Eclair 기준으로 총 51개 기본 어플이 등록되어 있으며 추가적으로 동일한 어플리케이션 프로그램 인터페이스 라이브러리를 이용하는 서드파티 어플을 추가할 수 있다.

(5) Android Framework


안드로이드 어플리케이션 프레임워크는 자바 기반의 프레임워크이며 대부분이 native C/C++ 코드로 작성되어 있다.

이 프레임워크는 액티비티 매지너, 패키지 매니저 등 핵심 시스템 서비스를 담당하는 코어 시스템 서비스들과 하드웨어와의 인터페이스를 담당하는 하드웨어 서비스들로 구성된다.

(6) Android Library


안드로이드 내장 라이브러리는 Bionic Libc, Function Library, Native Server, Hardware Abstraction Library로 구성된다. 
Bionic은 임베디드에서 사용을 위해 최적화된 직접 구현된 libc이다.
Function Library에는 Webkit, 미디어 프레임워크, SQLite가 속하며, 그리고 Native Server에는 Surface Finger와 Audio Finger가 있다.

(7) Android Runtime


안드로이드 런타임은 Core 라이브러리와 Dalvic 가상머신으로 구성되어 있다. 코어 라이브러리는 강력하지만, 단순하고 익숙한 개발 플랫폼을 제공하는 Java 언어를 위한 Core API를 포함하고 있다. 그리고 Dalvic 가상 머신은 안드로이드에서 자체적으로 만든 것으로 청정영역을 제공하는 가상머신으로써 어플리케이션의 호환성과 실행의 일관성을 제공한다.

(8) Android Kernel


안드로이드에서 리눅스 커널을 사용하는 이유는 메모리 및 프로세스 관리, 인가 기반의 보안 모델, 검증된 드라이버 모델, 공유 라이브러리 지원, 오픈소스 기반 등의 장점 때문이다. 그러나, 안드로이드가 표준 리눅스 유틸리티 전체를 포함하고 있지는 않다. 이는 안드로이드가 리눅스 커널을 기반으로 하고 있지만 내장 윈도우 시스템을 지원하지 않기 때문이다 그리고 알람, 파워 매니지먼트 등은 안드로이드를 위해 확장된 리눅스 커널 영역이다.



* 모바일 기반 아키텍처 요구사항

- 최적화된 리소스 사용으로 경량화 구조를 유지할 것

- 프로세스의 적절한 사용으로 고가용성을 유지할 것

- User Interface 로딩 시간을 최소화할 것

- 확장 가능한 권한/ 인즈 체제를 구축할 것

- Application 수준에서 보안 요구사항을 만족할 것

- Application Download 및 Install 작업이 용이할 것

2015년 6월 28일 일요일

AT-BIOS Interrupt

Read/Write Disk


디스크로부터 읽기, 디스크에 쓰기, 섹터의 검사(verify) 및 찾기
  • AH = 0x02 (읽을 때)
  • AH = 0x03 (쓸 때)
  • AH = 0x04 (검사할 때)
  • AH = 0x0C (찾기 할 때)

  • AL = 처리할 섹터 수 (연속된 섹터 처리 가능)
  • CH = [실린더 번호] & 0xFF
  • CL = [섹터 번호 (bit 0-5)] | ([실린더 번호] & 0x300) >> 2
  • DH = 헤드 번호
  • DL = 드라이브 번호
  • ES:BX = 버퍼 어드레스 (검사 혹은 찾기를 할 때에는 이 값을 참조하지 않음)

  • 반환 값: (JNC 명령으로 체크)
  • FLAGS.CF == 0 : 에러 없음, AH == 0
  • FLAGS.CF == 1 : 에러 있음, AH에 에러 코드 (리셋 기능과 같음) 



2015년 6월 26일 금요일

Max. Size of a Data file (Oracle): ORA-01688

오류 사항

ORA-01688: unable to extend table <schema>.<table> partition <parts> by <number> in tablespace <tablespace> 


-------------------------------------------------------------------------------------------------------------
출처: https://community.oracle.com/thread/521373

Data files are not exactly unlimited in size, so the term "Unlimited" refers to the ceiling your datafile is able to reach, and it depends on the Oracle Block Size. To find the absolute maximum file size multiply block size by 4194303. This is the actual maximum size. You may want to read the Metalink Note:112011.1.

A datafile cannot be oversized, otherwise it could get corrupted. Let's say if your database is 8k blocks that means that one file can not exceed approximately 34GB (34,359,730,176 bytes) without having database corruption.

Sizing datafiles is a matter of manageability, it depends on your storage, the amount of space allocated in a single managed storage unit.

128G is the maximum datafile size in 10g, but considering the maximum number of datafiles a Database can have, it can make a database to potentially size 8E (exabytes = 8,388,608 T).

The maximum data file size is calculated by:
Maximum datafile size = db_block_size * maximum number of blocks

The maximum amount of data in an Oracle database is calculated by:
Maximum database size = maximum datafile size * maximum number of datafile

The maximum number of datafiles in Oracle9i and Oracle 10g Database is 65,536. However, the maximum number of blocks in a data file increase from 4,194,304 (4 million) blocks to 4,294,967,296 (4 billion) blocks.

The maximum amount of data for a 32K block size database is eight petabytes (8,192 Terabytes) in Oracle9i.

Maximum database size is 8Pb in Oracle9i & 10g (Small file Tablespaces).
Block Sz   Max Datafile Sz (Gb)   Max DB Sz (Tb)

--------   --------------------   --------------

   2,048                      8              512

   4,096                     16            1,024

   8,192                     32            2,048

  16,384                     64            4,096

  32,768                    128            8,192
 
The maximum database size is 8Eb in Oracle 10g (Big file tablespaces).
Block Sz   Max Datafile Sz (Gb)   Max DB Sz (Tb)

--------   --------------------   --------------

   2,048                  8,192          524,264

   4,096                 16,384        1,048,528

   8,192                 32,768        2,097,056

  16,384                 65,536        4,194,112

  32,768                131,072        8,388,224
 
 
 

해결 방안

SQL> ALTER TABLESPACE <tablespace_name> ADD DATAFILE
  2  <file_path> SIZE 10240M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED; 
 
 
 
 

Oracle's Data Pump Import: impdp

Syntax Diagrams for Data Pump Import

출처: Oracle Help Center

ImpInit


ImpStart




ImpModes



ImpOpts



ImpFilter



ImpRacOpt



ImptRemap



ImpFileOpts



ImpNetworkOpts



ImpDynOpts



ImpDiagnostics





examples)

$ impdp scott/tiger attach=import_job_name

$ impdp scott/tiger directory=datadumpdir dumpfile=datafile.dmp logfile=logdir:import.log full=yes

$ impdp scott/tiger directory=datadumpdir dumpfile=datafile.dmp full=yes transform=segment_attribute:n

$ impdp scott/tiger directory=datadumpdir dumpfile=datafile.dmp full=yes transform=segment_attribute:n table_exists_action=truncate

$ impdp scott/tiger directory=datadumpdir dumpfile=datafile.dmp transform=segment_attribute:n table_exists_action=append tables=scott.tablename

$ impdp scott/tiger directory=datadumpdir dumpfile=datafile.dmp transform=segment_attribute:n table_exists_action=skip schemas=scott

$ impdp scott/tiger directory=datadumpdir dumpfile=datafile.dmp transform=segment_attribute:n table_exists_action=replace tablespaces=data_tbs

2015년 6월 25일 목요일

JSON / BSON 관련 사이트

http://json.org/json-ko.html
http://ko.wikipedia.org/wiki/JSON
http://www.codeordie.org/wiki/?WhatIsJson

http://bsonspec.org/
http://jsoncpp.sourceforge.net/
http://json.codeplex.com/
http://james.newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx
http://mysqlguru.github.io/programming/2012/03/06/jsoncpp1.html
http://mysqlguru.github.io/programming/2013/05/10/jsoncpp2.html

http://wonderfuldream.tistory.com/319
http://javawork.egloos.com/viewer/2532817
http://game.tistory.com/25
http://www.doccabi.pe.kr/334

http://json2csharp.com/
http://blog.naver.com/h2d2002/50173646706
http://www.newtonsoft.com/json
http://crystalcube.co.kr/53
http://growingdever.tistory.com/157
http://blog.naver.com/agapeuni/60141265090
[출처] JSON / BSON 관련|작성자 쭈니

잘못된 URL 수정함.

VirtualBox VDI 용량 추가


Host (Windows)

  • VirtualBox 설치 경로로 이동
  • 아래 API 명령 입력
        > VBoxManage modifyhd <VID 파일명> --resize <용량 MB 단위>
  • VirtualBox 관리 콘솔에 확인

Guest (Linux):RedHat 계열


    # fdisk -l
    # fdisk /dev/sda
      d (파티션 지우기 선택)
      2 (sda2 실제 삭제)
      n (새 파티션 생성)
      p (primary)
      2 (2번 파티션)
      Enter
      Enter
      w (write)
    # reboot

    # pvresize /dev/sda2
    # pvscan
    # lvextend -l+100%FREE /dev/mapper/ol-home
    # resize2fs /dev/mapper/ol-home
    # df -h

  • resize2fs 실행 시 오류 발생
    # pvresize -v /dev/sda2
    # lvresize -r -l+100%FREE /dev/mapper/ol-home
    # df -h

기타 정보 확인 명령어


    # pvdisplay
    # vgdisplay
    # lvdisplay

Oracle Linux 7 기반 Oracle Database 11g R2 설치

Linux 기초 명령어 (RedHat 계열)



    - hostname 변경
      # vi /etc/hostname
      # vi /etc/sysconfig/network
      # vi /etc/hosts
      # service network restart
      # reboot

    - zip / unzip
      $ zip -r test.zip ./*
      $ unzip happy.zip
      $ unzip happy.zip -d ./target

    - tar.gz
      $ tar -czvf images.tar.gz ./test
      $ tar -xzvf images.tar.gz

    - software update
      # yum list updates
      # yum update –y 


Oracle Database 11g R2 installation


$ su -

# df -h

# usermod -g oinstall -G dba oracle
# useradd -g oinstall -G dba oracle
# passwd oracle

# /sbin/sysctl -p
# /sbin/sysctl -a

# mkdir -p /opt/app/
# chown -R oracle:oinstall /opt/app/
# chmod -R 775 /opt/app/

# su - oracle
$ export TMP=/tmp
$ export TMPDIR=$TMP

$ export ORACLE_BASE=/opt/app/oracle
$ export ORACLE_SID=orcl



After installation

# vi /etc/oratab
SID:ORACLE_HOME:{Y|N|W} ----> Y

# vi /etc/init.d/oracle
#!/bin/bash

# oracle: Start/Stop Oracle Database 11g R2
#
# chkconfig: 345 90 10
# description: The Oracle Database is an Object-Relational Database Management System.
#
# processname: oracle

. /etc/rc.d/init.d/functions

LOCKFILE=/var/lock/subsys/oracle
ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome
ORACLE_USER=oracle

case "$1" in
'start')
   if [ -f $LOCKFILE ]; then
      echo $0 already running.
      exit 1
   fi
   echo -n $"Starting Oracle Database:"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl start"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl start dbconsole"
   touch $LOCKFILE
   ;;
'stop')
   if [ ! -f $LOCKFILE ]; then
      echo $0 already stopping.
      exit 1
   fi
   echo -n $"Stopping Oracle Database:"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl stop"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbshut"
   su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl stop dbconsole"
   rm -f $LOCKFILE
   ;;
'restart')
   $0 stop
   $0 start
   ;;
'status')
   if [ -f $LOCKFILE ]; then
      echo $0 started.
      else
      echo $0 stopped.
   fi
   ;;
*)
   echo "Usage: $0 [start|stop|status]"
   exit 1
esac

exit 0



# chmod 755 /etc/init.d/oracle
# chkconfig --add oracle
# chkconfig oracle on

http://localhost:1158/em
$ emctl stop dbconsole
$ emctl config emkey -repos -sysman_pwd
$ emctl secure dbconsole -sysman_pwd
$ emctl start dbconsole
$ emctl config emkey -remove_from_repos -sysman_pwd


$ lsnrctl start
$ lsnrctl status
$ lsnrctl stop
$ netstat -anp | grep 1521 | grep LISTEN

$ sqlplus "/as sysdba"
SQL> startup
SQL> shutdown normal|immediate|abort



$ vi ~/.bash_profile
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome
export ORACLE_HOME_LISTNER=$ORACLE_HOME/bin/lsnrctl
export ORACLE_SID=TMSRACDB
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export PATH=$ORACLE_HOME/bin:$PATH




Installed information


DB Global Name
SQL> SELECT * FROM props$ WHERE name='GLOBAL_DB_NAME';
SQL> SELECT * FROM global_name;


SQL> ALTER DATABASE RENAME GLOBAL_NAME TO <>;

SID
SQL> select name from v$database;
SQL> SELECT instance FROM v$thread;




re-installation


# rm -Rf /usr/local/bin/oraenv
# rm -Rf /usr/local/bin/coraenv
# rm -Rf /etc/oratab

# chkconfig oracle off
# chkconfig --del oracle
# rm -Rf /etc/init.d/oracle
# rm -Rf $ORACLE_HOME

$ unset ORACLE_HOME
$ unset TNS_ADMIN


기타

** tnsname.ora
- $ORACLE_HOME/network/admin
- 로컬컴퓨터가 원격 서버로 접속할 방법을 서술

** listener.ora
- $ORACLE_HOME/network/admin
- 오라클서버에서 리스너를 기동시킬 때 (즉, lsnrctl start) 사용하게 되는 환경 파일

$ sqlplus -S scott/tiger < /data/script/test.sql
(-S : uses silent mode)

MongoDB에 대한 8가지 오해와 진실

출처: http://cafe.naver.com/mongodatabase/1811


안녕하세요? MongoDB Master 주종면입니다.
2012년 초에 외국 기사에 MongoDB애 대한 부정적 기사가 올아왔어죠~
그리고, NoSQL & MongoDB 사용자들 사에 이슈가 많이 되었던 내용이기도 했구요..
아직도, 당시의 기사에 대한 질문을 하시는 분들이 간혹 걔시며 잘못된 오해로 인해 MongoDB 를 적절하게 사용하고 있지 못하는 문제점을 해소하기 위해 이 기사를 올리게 되었습니다.



1. MongoDB의 기본 설정상태로 빅 데이터에 대한 쓰기작업은 안전하지 않다.


 애플리케이션 레벨에서 드라이버를 통해  MongoD에 접속할 때 getLastError 함수에 의해 데이터 처리에 대한 성공 여부를 Check하게 되는데 이때 그 결과를 리턴 해 주는 레벨을 Safe 모드라고 하며 처리 결과를 돌려주지 않는 레벨을 Unsafe 모드라고 합니다. 기본 설정 모드는 Unsafe 모드인데 이것은 NoSQL의 대표적인 특징인 초당 몇 만 건의 빅 데이터를 빠르게 쓰기 하기 위함입니다.
만약, 기본 설정 모드를 Safe 모드로 설정하게 된다면 빅 데이터에 대한 쓰기 작업 시 매 건마다 처리 여부를 확인해야 하기 때문에 빠른 쓰기 작업을 수행할 수 없게 될 것 입니다.
만약, 데이터의 무결성이 보장되어야 하는 경우라면 사용자의 선택에 의해 safe 모드를 사용할 수 있으며 다만, 이것은 빠른 쓰기 성능을 지연하게 될 것 입니다.

<결론>

MongoDB Write Concern 정책과 빅 데이터를 위한 빠른 쓰기/읽기 솔루션에 대한 이해 부족으로 인한 잘못된 해석으로 판단됩니다..

2. MongoDB 운영 시 다양한 이유로 데이터가 날라가는 경우가 발생한다.


MongoDB 1.8 이전(2011) 버전에는 Journal 기능이 없어 Memory 영역에 대한Crash 발생하는 경우 백업 데이터가 존재하지 않기 때문에 데이터 유실이 발생하였습니다. 하지만, 이러한 문제를 개선하기 위해 이후 버전에서는 메모리 상에 입력, 수정, 삭제된 데이터는 실 시간으로 Journal 파일에 백업부터 되기 때문에 Memory Crash가 발생하더라도 Journal 파일을 통해 거의 모든 데이터에 대한 복구가 가능하며 최근에는 이러한 사례가 보고되고 있지 않습니다.

<결론>

MoggoDBNoSQL 영역에서 아직도 성장하는 기술 중에 하나이므로 몇몇 버그들이 발견되고 있지만 현재 대부분의 관계형 DB에서 발생하는 범주라고 판단됩니다. 1988년 당시 국내 모 신문 기사에는 일부 데이터 유실과 관련된 관계형 데이터베이스의 문제점에 대한 기사들을 종종 볼 수 있었는데 이러한 문제는 시간이 지나면서 자연스럽게 해소되었던 것처럼 현재 버전의 MongoDB에서도 발견되고 있지 않습니다.


3. 빅 데이터 환경에서 써야 할 데이터 양이 많으면 감당하지 못한다.


NoSQL의 대표적인 기술 중에 하나는 Memory Mapping 기술인데 이것은 충분한 시스템 메모리를 요구합니다.
하지만, 대부분의 사용자들은 관계형 데이터베이스 수준의 시스템 메모리 정도로 NoSQL을 운영하고 있으며 빅 데이터를 처리하고 있는 것이 현실입니다.
문제는 이러한 환경에서는 빅 데이터를 효과적으로 처리할 수 없을 뿐만 아니라 오히려 다양한 성능 지연 및 장애 현상을 유발시킬 수 도 있습니다.
관계형 DBMS의 경우에도 부적절한 메모리 할당으로 인한 성능 지연 및 장애가 발생하는 경우 서버 튜닝을 통해 문제 해결을 수행하고 있습니다.

<결론>

대부분의 사용자들은 기술적 기반과 아키텍처 구조가 다른 NoSQL RDBMS 관점에서 접근하고 이해하려는 경향들이 있습니다.  이러한 접근 방법으로는 NoSQL 기술을 제대로 이해하고 사용하는 것은 한계가 있을 수 밖에 없습니다.
** 원문에서는 Global Lock으로 인한 쓰기 성능에 대한 이슈를 강조하였는데    이 문제는 2.0 버전에서 Database Lock 매커니즘을 통해 대 부분 해소되었으며 2013 12월까지 Collection Lock 기능까지 제공하겠다고 발표하였으며 보다 향상된 성능이 기대됩니다.


4. 데이터 분산처리 시스템인 샤딩 환경에서 데이터를 불러올 때 적절한 샤딩이 제대로 작동하지 않을 때가 있다.


MongoDB를 사용하는 대부분의 사용자들은 샤딩 시스템을 구축하는 것 만으로 좋은 성능을 기대할 수 있다고 생각하는 경우들이 종종 있습니다.
하지만, 그렇지 않습니다. 우리나라에는 과유불급이라는 속담이 있습니다.
어떤 좋은 기능이라도 이것을 구축하려는 환경에 적합한지, 구축 시 고려해야 할 사항이 무엇인지, 구축 후 관리 사항에 대한 정확한 기술적 접근과 이해를 바탕으로 구축 여부를 결정하는 것이 올바른 접근 방법입니다.
샤딩이 정상적으로 잘 작동되기 위해서는 몇 가지 전제 조건이 필요합니다.
먼저, 빠른 쓰기 작업에 있어서 Chunk Size Shard Key를 적절하게 설계해야 하는데 대부분 사용자들은 단순히 데이터 양적인 측면에서의 분산 저장 정도로 생각하여 단순 설계하기 때문에 결국 좋은 성능이 보장되지 않는 것입니다.
또한, Peak Time에 과도한 마이그레이션이 발생하는 경우 데이터 읽기 작업이 발생한다면 빠른 읽기 및 쓰기 성능이 보장되지 못할 것 입니다.

<결론>

샤딩 및 복제 기술과 DBMS 운영 기술에 대한 이해 부족으로 잘못 운영함으로서
발생했던 문제점으로 판단됩니다, .


5. 데이터 삭제 또는 변경 했을 때 단편화 문제가 발생하여 데이터 처리에 필요 이상의 메모리를 사용합니다.


단편화(Fragmentation) 현상은 모든 파일 시스템 그리고 RDB에서 발생하는 문제점이며 MongoDB 만의 문제점은 아닙니다. 또한, 단편화가 발생한다고 시스템의 메모리룰 사용하는 것은 아니기 때문에 반드시 과 부하가 발생하지는 않습니다.

<결론>

단편화 현상에 대한 이해 부족과 MongoDB 메모리 구조 및 운영 메커니즘애 대한 이해 부족으로 인해 MongoDB 아키테처 구조의 문제점으로 잘못 이해하고 있는 것으로 생각됩니다.

** 원문에서는 mongos 프로세스가 가끔 shutdown 되는 문제에 대한 이슈를 강조하였는데 일반적으로 mongos 프로세스와 유사한 구조는 기존의 관계형 DB 또는 많은 애플리케이션에서도 발생하는 문제점이기도 합니다.
이러한 문제에 대한 원인은 대부분 시스템 메모리 영역과의 Crash에 의해 발생하게 되는데 이 문제점에 대한 대응은 Crash에 대비하여 여러 개의 mongos를 활성화하여 FailOver에 대비해야 합니다.    


6. 몽고DB 1.8 이후 버전에서 문제가 해결되었지만 데이터 셋을 전부 날리는 경향이.있습니다.


2) 질문 내용에 대한 답변과 동일함.


7. 몽고 DB에서 발견된 버그가 빨리 해결되지 않는다.


미국의 공인된 평가 기관인 PerfectMarket사의 2011년 발표에 의하면 조사 분석된 NoSQL 제품 중 MongoDB는 버그에 대한 빠른 패치 제공이 이루어지고 있고 커뮤니티에 대한 지원이 가장 좋다는 평가 결과가 있습니다.

2.2 (2012년 초) 2.3 (2012년 말) 2.4 (2013 3) 2.5 (201311)

실제 원문에서 말하려고 했던 것은 문제점에 대한 패치를 즉시 제공하지 않고 다음 릴리즈 버전에서 제공한다는 점을 어필했던 것으로 보입니다.
1.8 버전이 발표되었던 시점에 미국 Funding 마켓에서 NoSQL의 비중에 낮았다면 2011년 이후 급속도로 Funding 투자의 활성화로 자금 유입과 함께 보다 빠른 버그에 대한 대응 및 패치가 제공되고 있는 것으로 판단됩니다.


8. 데이터의 안전한 저장을 위한 복제 시스템이 필요 이상의 서버를 차지한다.


Replication은 빅 데이터를 처리할 때 발생하는 데이터 유실을 방지하기 위한 최후의 수단입니다.
몽고 DB ReplicaSets을 통해 여러 대의 서버에 데이터를 복제할 수 있는데 이것은 사용자의 선택이지 필수 조건이 아닙니다. 적절한 시스템 설계를 통해 구현하지 않고 오픈 소스의 장점 만이 부각되어 부 적절하게 구축되는 경우에 해당합니다. 이러한 무절제한 복제가 서버 부하를 유발시키는 것은 당연하며 이것은 모든 NoSQL 뿐만 아니라 관계형 DB에서도 발생합니다.
이 문제를 해결할 수 있는 방법은 MongoDB에서 제공하는 다양한 백업/복구 솔루션과 함께 최소한의 서버로 복제 시스템을 구축하는 것입니다.

<결론>

Replication 시스템 및 운영 메커니즘애 대한 이해 부족으로 판단됩니다.



지금까지 설명된 8가지 사항은 현재 국내 MongoDB 시장에서 사용자 간에 회자되고 있는 MongoDB의 불편한 오해와 진실에 대한 설명이었습니다..
관계형 데이터베이스가 무려 40년이라는 세월 동안 꾸준하게 발전하며 평가 받아온 성숙된 기술이라면 MongoDB는 이제 8년 된 성장하고 있는 기술입니다.
MongoDB의 초기 버전에서 발생했던 몇 가지 문제점들은 상위 버전으로 업그레이드 되면서 많은 발전을 이루어 내었고 이제 안정화 단계로 접어들고 있는 것이 현실입니다. 어떠한 기술이든 초기 버전부터 완벽한 기술과 기능을 제공하는 제품은 없습니다. 많은 사용자의 관심과 지속적인 투자를 통해 사용자의 바램을 충족할 수 있는 기술로 발전하는 것 입니다. 이제 MongoDB는  NoSQL 분야에서 선택될 수 밖에 없는 기술로 평가 받고 있고 사용자의 관심을 끌고 있습니다. 앞서 소개 드린 MongoDB의 불편한 오해를 말끔히 털어내시고 여러분의 비즈니스 분야에 MongoDB를 적극적으로 활용해 보시기를 권장합니다.

감사합니다.

MongoDB와 Key-Value DB 그리고 RDB 간 기능 비교

출처: http://cafe.naver.com/mongodatabase/2264


안냥하세요? MongoDB Master 주종면입니다.
다음은 MongoDB와 Key-Value DB 그리고  RDB 간에 기능 비교 도표입니다.
참고하십시오. (www.mongodb.org)
감사합니다.