AWS클라우드기반의 Django(2. Django 개발환경 구축)

1. Python Programming

01. Python 설치

-1. Python3 설치

$ sudo apt-get update
$ sudo apt-get upgrade

python3 --version

  • 파일을 만들어서 'Hello World 출력'
$ vi hello.py

# 파일 내용 내부에 작성
print('Hello World')

$ python3 hello.py

# 출력
Hello World


  • 저장 후 종료 : ':wq'
  • 쉘을 이용하여 python3 작성
$ python3
>>> print('Hello World')
Hello World

-2. Python 패키지관리 - pip

  • pip
    • Python Package Index(PyPI)에서 제공하는 Python 패키지 설치 관리자 프로그램
    • Django 프레임워크도 PyPI에서 제공되는 패키지 중 하나이며, 시스템 추가 기능 구현을 위해서는 반드시 pip도 실치되어야 한다
# pip3가 설치되어 있는지 확인, 없다면 설치
$ pip3 --version

$ sudo apt install python3-pip

$ pip3 --version



-3. Django에서의 Python 사용

  • models.py
    • 모델 클래스 정의(MVC의 Model 역할)
  • views.py
    • 웹 페이지구성을 특정 기능 정의(MVC 패턴에 Controller 역할)
  • urls.py
    • URL 지정
  • settings.py
    • Django 환경 설정
  • MVC의 V는 Templates에서 담당
    • Django는 MVC 패턴이 아닌 MVT 패턴이다

02. 기초 문법

-1. 기본 문법

  • 1) 패키지 및 모듈 선언
    • 특정 함수 및 클래스는 패키지나 모듈을 선언해야 사용할 수 있으므로, Python 파일의 최상단에 어떤 패키지 및 모듈을 사용할 것인지를 기입
    • import [모듈명]
      # math 모둘 사용
      $ python3
      >> import math
      >> math.ceil(10.3)
      11
    • from [모듈명] import [클래스명]
      >>> from math import ceil
      >>> ceil(10.3)
      11
    • Django에서는 Python 언어 기반의 패키지를 포함하고 있으며, 또한 사용자가 정의한 다른 Python 파일의 클래스 및 모둘을 사용할 수 있다
    • 패키지 사용은 모듈 사용과 동일하다
# django.shorcuts는 패키지는 Django에서 제공하는 패키지 중 하나로, 그 중 render, redirect 클래스를 사용할 대 선언
>>> from django.shorcuts import render, redirect
# 사용자 정의 패키지, 클래스
>>> from boardapp.models import *
  • 2) 블록

    • 블록
      • Python에서 수행하는 여러 명령어를 하나의 구역으로 설정하는 단위
      • 다른 언어에서는 '{}' 중괄호를 사용하여 블록을 형성하는 경우가 많지만 Python 에서는 ':''tab' 문자를 통해서 블록 구분
      • 주의! Python은 탭 문자를 사용하지 ㅇ낳으면 블록에 속하지 않다고 간주
      # Java
      public class HelloWorld() {
      		  public static void main(String args[]){ 
        		  System.out.println("Hello World");
        	  }
      }
      # Python
      >>> def HelloWorld() :
      		print("Hello World")
    • Python 조건문 코드 예제
      >>> a = -1;
      >>> if a > 0:
      ... 	print("양수")
      ... else:
      ... 	print("0 또는 음수")
      ... 
      0또는 음수
  • 3) 주석

    • 주석
      • 코드에 대한 설명 등을 나타내는 것으로, 실제 코드 수행에 영향을 미치지 않는다.
      • #, """, '''
    >>> print("Hello World") # 출력하는 부분입니다
    Hello World

  • 4) 화면 출력(print)

    • print()
      - Python3 부터는 괄호를 붙여야만 올바른 결과를 확인할 수 있다

-2. 변수(Variable) 및 기본 자료형

  • 1) 변수의 기본 사용
    • 변수
      • 특정 값을 저장하고, 저장된 값을 사용하기 위한 개체
      • 일반적으로 영문자로 시작하고 숫자와 혼합해서 사용
      • Python에서는 ㅂ녈도의 변수 선언 없이도 입력되는 값의 유형에 따라 자동으로 변수 유형이 결정(Dynamic Typing)
      • 값을 변경할 때에도 자유롭게 변경
      • But 한 번 선언된 변수는 값을 변경하기 전까지는 지정된 ㄱ밧의 유형으로 사용(비교 또는 연산에서 주의)
    >>> a = 10
    >>> b = "test"
    >>> print(a)
    10
    >>> print(b)
    test
    >>> a = "1"
    >>> b = a+1
    TypeError ...
  • 2) 기본 자료형과 유형변환
    • 변수의 기본 자료형
      • int, float, str, boolean, true/false
    • 변수의 복합 자료형
      • List, Tuple, Dictionary
    • 유형 변환(Type Casting)
      • int(), float(), str(), list(), tuple(), ...
    >>> a = 10.5
    >>> b = 10
    >>> int(a)
    10
    >>> float(b)
    10.0
    >>> str(a)
    10.5'

-3. 복합 자료형

  • 리스트(List), 튜플(Tuple), 딕셔너리(Dictionary)
    • 단일 값이 아닌 복수의 값을 입력할 때 사용
  • 1) 리스트(List)
    • 리스트 사용
      • 배열과 유사
      • 배열은 구성 요소의 자료형이 모두 동일한 반면, 리스트는 구성 요소의 자료형이 동일하지 않아도 문제가 없다
      • '[]', ','
      • index는 0부터 시작
      >>> a = [1, 'test', 2, 3.5]
      >>> a[0]
      1
      >>> a[1]
      'test'
      >>> a[3]
      3.5
    • 리스트 변경, 추가, 삭제
      • 변경은 인덱스 값을 대입하여 간단히 변경
      >>> a[0] = 2
      >>> print(a)
      [2, 'test', 2, 3.5]
      >>> a[4] = 3
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      IndexError: list assignment index out of range
      • 리스트 추가는 append와 insert를 사용
      • append(value)는 요소의 마지막에 추가
      • insert(position, value)는 요소의 특정 위치에 삽입
      >>> a = [1,2,3,4,5]
      >>> a.append(6)
      >>> print(a)
      [1, 2, 3, 4, 5, 6]
      >>> a.insert(2, 7)
      >>> print(a)
      [1, 2, 7, 3, 4, 5, 6]
      • 삭제는 pop과 remove 사용
      • pop()은 요소의 마지막에 있는 값을 삭제
      • remove()는 요소의 특정 값을 찾아서 삭제
      >>> print(a)
      [1, 2, 7, 3, 4, 5, 6]
      >>> a.remove(3)
      >>> print(a)
      [1, 2, 7, 4, 5, 6]
      >>> a.pop()
      6
      >>> print(a)
      [1, 2, 7, 4, 5]
    • 리스트 정보 확인
      • 변수명[인덱스]는 특정 값 사용
      • index(value)는 반대로 리스트의 특정 값을 찾을 때 사용
      >>> print(a)
      [1, 2, 7, 4, 5]
      >>> a.index(4)
      3
      • len(list|tuple|dictionary|...)은 리스트의 요소 갯수 확인
      • len은 앞에 사용한 함수와 달리 len() 함수의 파라미터로 리스트 변수 또는 자료를 대입
      >>> a
      [1, 2, 7, 4, 5]
      >>> len(a)
      5
      • [n:m] 부분 요소 확인
      • m의 앞 까지(m은 미포함)
      >>> a = [10, 20, 30, 40, 50]
      >>> b = a[:2]
      >>> c = a[2:]
      >>> d = a[1:3]
      >>> print(b)
      [10, 20]
      >>> print(c)
      [30, 40, 50]
      >>> print(d)
      [20, 30]
  • 2) 튜플(Tuple)
    • 튜플 사용
      • 읽기 전용 데이터를 처리할 때 사용
      • 리스트와 유사하게 여러 개의 ㄱ밧을 하나의 변수 형태로 사용
      • But 리스트는 요소의 값 변경이 자유롭다면, 튜플은 한번 선언된 값을 변경할 수 없다
      • '[]' -> '()', ','
      >>> a = (1, 2.3, "4")
      >>> a[0]
      1
      >>> a[0] = 0
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: 'tuple' object does not support item assignment
    • 튜플 정보 확인
      • 리스트와 동일 index(value), len(list|tuple|dictionary|...)
      >>> a.index(1)
      0
      >>> len(a)
      3
  • 3) 딕셔너리(Dictionary)
    • 딕셔너리 사용

      • 딕셔너리는 리스트, 튜플에서 확장된 변수형으로 key-value 형태이다
      • 각 요소에 대한 이름(key)와 값(value)을 기반으로 자료를 저장
      • '[]' -> '()' -> '{}' => '{key:value}'
      • 요소의 값을 나타날 때 인덱스가 아닌 Key 값을 사용
      >>> a = {"title" : "타이틀", "page" : 1}
      >>> print(a)
      {'title': '타이틀', 'page': 1}
      >>> a["title"]
      '타이틀'

    • 딕셔너리 변경, 추가, 삭제

      • 변경은 Key 값을 사용하여 변경
      >>> print(a)
      {'title': '타이틀', 'page': 1}
      >>> a["title"] = "변경된 타이틀"
      >>> print(a)
      {'title': '변경된 타이틀', 'page': 1}

      • 추가는 key-value 대입update(key:value|dictionary) 사용
      • update는 자료를 직접 입력해서 추가할 수도 있고, 다른 딕셔너리 변수를 입력하여 추가할 수도 있다
      >>> a = {"title" : "타이틀", "page" : 1}
      >>> a['name'] = 'Tom'
      >>> print(a)
      {'title': '타이틀', 'page': 1, 'name': 'Tom'}
      
      >>> a = {'title' : '타이틀'}
      >>> b = {'name' : 'Tom'}
      >>> a.update({'page' : 1})
      >>> print(a)
      {'title': '타이틀', 'page': 1}
      >>> a.update(b)
      >>> print(a)
      {'title': '타이틀', 'page': 1, 'name': 'Tom'}

      • 삭제는 del, clear()를 사용
      • del은 함수가아닌 단일 명령어로 'del 변수명[키]' 형태로 사용
      • clear는 모든 값을 지울 때 사용
      >>> print(a)
      {'title': '타이틀', 'page': 1, 'name': 'Tom'}
      >>> del a['page']
      >>> print(a)
      {'title': '타이틀', 'name': 'Tom'}
      >>> a.clear()
      >>> print(a)
      {}

    • 딕셔너리 요소 개수 및 키(Key) 추출

      • len(list|tuple|dictionary|...)으로 요소의 개수 확인
      • keys() 함수를 사용하여 키 추출
      • keys()함수를 사용하면 dict_keys([keys...]) 형태로 key를 나타내지만, 해당 값을 자료형 형태로 사용하기 위해서는 list() 또는 tuple() 함수를 사용
      >>> a = {'title' : '타이틀', 'page' : 1, 'name' : 'Tom'}
      >>> len(a)
      3
      >>> a.keys()
      dict_keys(['title', 'page', 'name'])
      >>> b = list(a.keys())
      >>> print(b)
      ['title', 'page', 'name']
      >>> c = tuple(a.keys())
      >>> print(c)
      ('title', 'page', 'name')

  • 4) 자료형의 혼합 사용
    • 리스트, 튜플, 딕셔너리는 기본 자료형의 유형에 상관없이 복수의 값으로 구성
    • 기본 자료형 뿐만 아니라 서로 다른 리스트, 튜플, 딕셔너리도 구성할 수 있다
    • 리스트, 튜플, 딕셔너리 혼합
    >>> a = [1, 2, (3,4)]
    >>> b = (1, 2, [3, 4])
    >>> print(a)
    [1, 2, (3, 4)]
    >>> a[2]
    (3, 4)
    >>> b[2]
    [3, 4]
    >>> a[2][0]
    3
    >>> c = (1, 2, {'key' : 3})
    >>> c[2]
    {'key': 3}
    >>> c[2]['key']
    3

-4. Python 자료 처리

  • Python 자료처리
    • 연산자 및 반복문, 조건문을 사용하여 처리하는 형태
  • 1) 반복문(for, while)
    • for문은 자료형 데이터 요소를 반복하여 사용하거나 특정 회수만큼 반복할 때 사용
    • while문은 특정 조건을 만족하는 경우에만 반복할 때 사용
    # for문
    >>> a = ['title', 'page', 'name']
    >>> for i in a:
    ...     print(i)
    ...
    title
    page
    name
    >>> a = [1,2,3,4,5]
    >>> i = 0
    >>> while i < 5:
    ...     print(a[i])
    ...     i += 1
    ...
    1
    2
    3
    4
    5
  • 2) 조건문
    • 특정 조건을 만족하거나 그렇지 않을 경우의 명령을 수행하는 것
    • if-elif-else
    >>> a = 10
    >>> if a > 10:
    ...     print('Over 10')
    ... elif a > 5:
    ...     print('Between 5 and 10')
    ... elif a > 3:
    ...     print('Between 3 and 5')
    ... else :
    ...     print('Under 3')
    ...
    Between 5 and 10
    • 조건문 연산자
      • 주로 두 개 이상의 값을 비교하기 위한 비교 연산자가 사용
      • 다수의 조건 설정을 위한 and, or 등 논리 연산자도 사용
      • Boolean 형 결과값을 비교하기 위해서 True/False를 사용
      if a > b :	# a가 b보다 클 경우
      if a == b :	# a와 b가 같을 경우
      if a != b :	# a와 b가 다를 경우
      if a is False :	# a의 값이 False일 경우
      if a :		# a의 변수의 값이 빈 값이 아닐 경우
      if a is None :	# a 변수의 ㄱ밧이 존재하지 않는 경우
      # None은 None만 None이며 None은 값이 없음(빈값)과 같다
      # 값이 없는(빈값) ""은 None이 아니다
  • 3) 예외 처리(try-except, finally)
    • 특정 상황에서 에러가 발생했을 때 이를 처리하기 위한 용도로 사용
    • 일반적으로 try-exceot 블록으로 구성
    • 필요시 예외 발생 여부와 상관없이 항상 실행되는 finally 블록도 동시에 구성
    >>> a = [1,2,3,4]
    >>> try :
    ...     print(a[2])
    ...     print(a[4])
    ... except :
    ...     print(0)
    ...
    3
    0
    • Python에서는 다수의 오류가 존재하며, 오류 유형에 따라서 except를 여러번 사용할 수 있다
    >>> try :
    ...     print(a[2])
    ...     print(a[4])
    ... except IndexError :
    ...     print('인덱스 에러')
    ... except FileNotFoundError :
    ...     print('미존재 파일 에러')
    ...
    3
    인덱스 에러

03. 함수와 클래스

-1. 함수(def)

  • 1) 정의
    • 하나 이상의 복합적인 기능을 한 번에 수행하기 위한 기본 구성단위
    • 프로그램에서 호출을 할 경우에만 사용
    • 특정 값을 반환받기 위하여 사용되는 경우도 있으며, 특정 값을 반환받지 않더라도 특정 기능을 수행하기 위하여 사용되가도 한다
    • def [함수명]([파라미터]): 형태
      • def 명령을 사용하여 함수를 선언
      • 함수 내용은 블록에서 정의
    • 반환 값이 있을 경우 'return [반환 값]' 문장 사용
      • 반환 값이 없을 경우 return 명령어를 사용하지 않는다
  • 2) 함수 사용 예제
    • 기본적인 함수 사용
    >>> def helloWorld() :
    ...     print('Hello World!')
    ...     print('Welcome to Python')
    ...
    >>> helloWorld()
    Hello World!
    Welcome to Python
    >>> helloWorld()
    Hello World!
    Welcome to Python
    • 파라미터가 있는 함수 사용
    >>> a = 'Apple'
    >>> b = 'Orange'
    >>> def printFruit(fruit) :
    ...     print(fruit)
    ...
    >>> printFruit(a)
    Apple
    >>> printFruit(b)
    Orange
    >>> printFruit('Banana')
    Banana
    • 파라미터와 반환값이 있는 함수 사용
    >>> def exp(number) :
    ...     return number*number
    ...
    >>> a = exp(5)
    >>> b = exp(100)
    >>> print(a)
    25
    >>> print(b)
    10000
  • 3) 함수 유형 및 외장 함수
    • 함수는 사용 형태에 따라 크게 사용자 정의 함수, 내장 함수, 외부 함수 등으로 구분
    • 사용자 정의 함수
      • 사용자가 직접 정의한 함수
    • 내장 함수
      • Python에서 기본 기능 수행을 위해서 정의한 함수로, print() 함수와 같이 즉시 사용할 수 있다
    • 외부 함수
      • 패키지 또는 모듈에서 제공하는 함수로, 특정 기능을 사용하기 위한 함수
    • 외장 함수 사용
    >>> print(ceil(10.3))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'ceil' is not defined
    >>> import math
    >>> print(math.ceil(10.3))
    11
    >>> from math import ceil
    >>> print(ceil(10.3))
    11

-2. 클래스(Class)

  • 1) 클래스의 개념 및 정의

    • 객체 지향 프로그래밍에서 사용되는 대표적인 단위
    • 함수가 가지고 있는 한계를 보완하고 복잡한 구조를 다루기 위한 객체(Object)
    • 클래스는 특정 값을 나타내는 필드(변수, Field)와 특정 동작을 나타내는 메소드(Method)로 구성
    • 클래스를 실제로 사용하기 위한 변수(실체화)를 인스턴스(Instance)
    >>> class Apple :
    ...     def set_information(self, location, color) :
    ...             self.location = location
    ...             self.color = color
    ...
    >>> Apple1 = Apple()
    >>> Apple1.set_information('seoul', 'red')
    >>> Apple1.location
    'seoul'
    >>> Apple1.color
    'red'
    • 여기서 'Apple' 클래스는 location과 color라는 요소를 가진 하나의 개념이다
      • '개념'이라 하는 것은 특정 유형의 객체가 존재할 뿐 실체가 있는 것을 뜻하지는 않는다
    • 'Apple1' 인스턴스는 이러한 'Apple'이라는 개념을 가진 실체
  • 2) 생성자 상속, 오버라이딩

    • 클래스에는 다양한 기능이 있지만, 그 중에서도 생성자(Constructor), 상속(Inherit), 오버라이딩(Overriding)은 반드시 알아야 한다

    • 생성자(Constuctor)

      • 인스턴스를 초기 생성할 때 클래스 변수에 값을 대입하거나 특정 기능을 수행하는 역할을 한다
      • def init() : 형태
      >>> class Apple :
      ...     def __init__(self, location, color) :
      ...             self.location = location
      ...             self.color = color
      ...
      >>> Apple1 = Apple('seoul', 'red')
      >>> Apple1.location
      'seoul'
      >>> Apple1.color
      'red'

      • 위 예제에서 set_information() 함수를 사용하는 것 보다 좀 더 유용하게 사용할 수도 있다
    • 상속(Inherit)

      • 클래스를 신규 선언할 때, 다른 클래스로부터 클래스 변수와 메소드를 모두 동일하게 상속 받아 사용한다는 뜻
      • class 클래스명(상속 받을 클래스) : 형태
      >>> class Human :
      ...     def __init__(self, name):
      ...             self.name = name
      ...     def getName(self):
      ...             return self.name
      ...
      >>> class Female(Human) :
      ...     def getGender(self):
      ...             return "Female"
      ...
      >>> girl = Female('Jame')
      >>> girl.getName()
      'Jame'
      >>> girl.getGender()
      'Female'

    • 오버라이팅(Overriding)

      • 상속에서 확장된 개념으로, 상속 받은 클래스의 메소드를 재사용하는 것을 뜻한다
      >>> class Human :
      ...     def __init__(self, name) :
      ...             self.name = name
      ...     def getName(self):
      ...             return self.name
      ...
      >>> class Female(Human) :
      ...     def getName(self) :
      ...             return "Miss "+self.name
      ...
      >>> girl = Female('Jane')
      >>> girl.getName()
      'Miss Jane'
      >>> human1 = Human('Unknown')
      >>> human1.getName()
      'Unknown'

2. Django 웹 애플리케이션 개발 환경 구축

01. 개요

-1. Django 소개

  • Django는 Python 웹 개발을 위한 대표적인 오픈소스 프레임워크
  • MTV(Model-Template-View) 모델 기반의 웹 사이트 구축을 지향, 속도와 확장성 그리고 벙용성이 뛰어나다

-2. 웹 애플리케이션 구축 절차

  • [환경 구축 -> 프로그램 개발 및 테스트 -> 프로그램 배포] 순서로 진행
  • AWS에서는 Elastic Beanstalk를 통해서 웹 어플리케이션 배포 진행

02. Django 설치 및 실행

-1. Python 가상환경 VirtualEnv

  • 1) Python 가상환경의 이해

    • 독립된 환경에서 테스트와 개발을 진행할 수 있도록 해주는 가상 환경
    • VirtualEnv를 통해서 생성된 환경에서 독립적으로 Python 패키지를 설치하고 관리
  • 2) VirtualEnv 설치

    $ pip3 install --user virtualenv

    • '--user' 옵션, 현재 사용자에게 대한 설치 권한을 부여하기 위해서 사용
      • 반대로 VirtualEnv 가상환경 상에서는 가상환경 내에서만 pip 패키지가 사용되므로 '--user' 옵션을 별도로 사용하지 않아도 된다
    • virtualenv --version 버전 확인이 안되면 .profile 파일의 경로 수정
    $ cat .profile
    $ source ~/.profile
    $ virtualenv --version

    • 새 가상환경 생성
    $ virtualenv venv

    • 가상환경 폴더 트리 확인
    $ tree venv

    • 가상환경 실행 및 종료
    # 가상환경 실행
    $ source venv/bin/activate
    
    # 가상환경 종료
    $ deactivate

-2. Django 설치

  • Django 설치
    $ source venv/bin/activate
    (venv) pip install django
    • pytz는 시간대 정의를 위한 패키지로, Olson Timezone Database로부터 나온 세계 표준 시간대에 대한 시간으 모두 정의한 규격
  • Django 설치 확인
    (venv) pip freeze
  • Django 프로젝트 생성(startproject)
    (venv) django-admin startproject test_proj

-3. Django 예제 프로그램 실행

  • 가상환경을 활용하여 Django 웹 서버 가동
    • 웹 서버 가동 명령어는 Python의 manage.py 파일을 사용
    • manage.py 파일은 Django 프로젝트 구동 및 관리를 위한 모든 기능을 수행하는 파일
    (venv) cd test_proj
    (venv) python manage.py runserver
    • 빨간 텍스튼ㄴ 처음 실행했을 때 나타난 메시지로, 'python manage.py migrate' 명령을 실행을 먼저 하는 것을 권장하는 메시지 이다
      • Django 웹 어플리케이션을 생성한 후 별도의 환경 설정을 변경하지 않았을 경우에는 Django에 내장된 admin, auth, contenttypes, sessions 앱도 같이 실행
      • 이들 앱은 각각의 DB 모델을 가지고 있으며, DB 모델을 반영하지 않고 웹 서버를 가동할 경우에 위와 같은 경고 메시지를 표현
      • migrate는 Django 프로젝트가 DB와 연동할 때 연돌을 위한 DB 모델을 반영하기 위한 명령어이다
      (venv) python manage.py migrate
      (venv) pthon manage.py runserver

      • 현재 접속되어 있는 환경은개발을 현재 진행하려는 PC의 로컬환경이 아닌, EC2 인스턴스에 접속중인 클라우드 환경이다
      • 그렇기 때문에 웹 서버 실행화면 역시 클라우드 환경에서 조회할 수 있도록 설정해주어야 한다

03. GUI 원격 접속 설정

  • 웹 서버 실행화면은 웹 브라우저를 통해서 확인할 수 있지만, 웹 브라우저는 GUI 기반의 프로그램이라는 점에서 터미널 화면에서 자체적으로 실행화면을 조회하는 것은 불가능
  • EC2 인스턴스의 GUI 원격 접속을 위해서는 크게 VNC, RDP를 이용한 X-Windows 데스크톱 환경 원격 접속과 Putty, MobaXtream 등의 터미널 프로그램에서 지원하는 플러그인을 통한 웹 브라우저를 실행하는 방법이 있다

-1. VNC, RDP 원격 테스크톱 접속

  • VNC(Virtual Network Computing)은 리눅스 서버의 ㅌ데스크톱 환경을 원격 접속하기 위해서 사용되는 서버로 사용
  • RDP(Renite Desktop Protocol)는 윈도우 서버의 원격 데스크톱을 위한 접속 프로토콜
  • 1) EC2 인스턴스와 원격 데스크톱
    • EC2 인스턴스의 Ununtu Linux 운영체제에서는 VNC, RDP를 통한 원격 접속을 모두 지원하고 있지만 기본으로 설치되어 있지 않다, 그러므로 데스크톱 환경 구축을 위한 X-Windows 및 VNC Server, RDP Server 등의 패키지를 설치해야 한다
    • But, VNC, RDP를 통한 원격 데스크탑 접속을 권장하지 않는다
      • 만약 VNC, RDP 원격 데스크톱 접속 방식이 리눅스 서버를 개인 또는 기업에서 집접 보유하여 관리하는 형태라면, VMC, RDP를 사용한 원격 데스크톱 환경에서 웹 브라우저를 싱행하여 개발 화면을 조회하는 것이 용이할 수 있다
      • 그러나 AWS EC2 인스턴스를 사용할 경우에는 AWS의 가상 서버를 임대해서 사용하므로, 웹 브라우저 실행을 위해서 X-Windows 데스크톱 환경을 구축하고 원격 접속을 하는 것은 효율이 높지 않다
  • 2) VNC Server 설정
    • VNCServer, VNC4Server, TigerVNC, UltraVNC, TightVNC 등이 있고 어떤것을 사용하더라도 큰 차이는 없다
    • VNC4Server를 사용할 예정
      • 데스크톱 환경 구축을 위해서 Ununtu Desktop, VNC4Server 외에도 관련된 여러 패키지를 설치해야 하며, 이에 따른 전체 설치 패키지 목록은 다음과 같다
      • ubuntu-desktop : Ubuntu 데스크톱 환경 구축 프로그램
      • VNC4Server : NVC Server 실행 프로그램
      • gnome-panel : Ununtu 데스크톱 환경 내 상/하단 작업 표시줄
      • gnome-settings-daemon : 데스크톱 환경의 다양한 세팅 환경 제공
      • xfce4 : 경량화 데스크톱 환경, Ubuntu Desktop과 같이 호환되어 사용됨
      • metacity : GNOME 환경에서 사용되는 기본 차 환경
      • nautilus : Ubuntu의 기본 File Manager
      $ sudo apt-get install ubuntu-desktop VNC4Server gnome-panel gnome-settings-daemon xfce4 metacity nautilus

좋은 웹페이지 즐겨찾기