이제는 views.py를 작성해 볼 것이다.

views 와 url을 연결하는 것은 지난 포스팅에서 다루었다.
이제 그 views.py를 작성 할 것이다.

개발환경이 바뀌었다.!!!!
우분투 너무 느렸는데, CentOS로 옮겼다. 아주 쾌적하고 좋았다. :)

우리는 4개의 view를 만들어야했다.
1. index : 설문지 리스트를 보여주는 view
2. detail : 특정 설문지에 들어가서 선택지들을 보여주는 view
3. vote : 선택지를 선택한 것에 대한 처리를 담당하는 view

4. results : 설문 결과를 보여주는 view


(views.py)


위와 같이 간단히 작성할 것이다.
지금 단계로는 우리가 계획한 view를 바로 설계할 수 없다.
위에 작성한 코드들은 해당 페이지와 연결을 하는 것을 해보기 위해서이다.
보면 view에 인자들을 살펴봐야한다.

첫번째 인자는 request 로 요청에 대한 객체이다.

두번째 인자는 넘겨 받는 인자인데, 우리가 urls.py를 작성할 때 url 주소에서 파싱한 내용들이다.


(polls/urls.py)


polls/urls.py 에 주소 패턴에 넘겨주는 인자가 있다.

이대로 실행해보자.
polls/3  의 주소를 요청하게 되면

뒤에 3이 question_id 라는 변수에 들어가서 넘겨가는 것이다.



(실행 화면)


3이라는 숫자가 question_id로 넘어가서 화면에 저렇게 표시 되는 것을 확인 할 수 있다.


이제 실제로 view에서 무언가를 처리하는 것을 넣을 것이다.
위에서는 단순하게 인자를 넘겨받는 것 까지만이었다.

최근 설문지 5개를 가져와서 출력하는 것을 해보자!



(views.index)


latest_question_list에 최신의 설문지 5개를 가져온다. 반복자형식이다.
그리고 해당 설문지의 설문내용을 하나씩 붙여서 output에 넣고
그 output을 화면에 출력해주는 코드이다.

확인!


(확인)


확인해보니 설문내용이 출력되는 것을 확인 할 수 있었다.

장고는 모델과 뷰, 템플릿이 따로 관리되는 MTV 구조를 가지고 있다.
그에 따라 우리도 템플릿을 만들어서 여기서 보여주는 것을 해볼 것이다.

템플릿은 settings.py 파일에서 INSTALLED_APP 디렉토리에서 하위 templates 디렉토리를 탐색한다.
고로 우리는 polls/templates 를 만들어야한다.

여기서 다시 polls 디렉토리를 만든다.
정리하면,
polls/templates/polls
이렇다.

이유는 장고가 템플릿을 찾을 때 이름이 일치하는 첫번째 템플릿을 가져온다.
그렇다면 동일한 템플릿 이름이 다른 APP에도 있다면? 어떻게 구분할 수 있을까?
그렇기 때문에 templates디렉토리 아래에 해당 어플 이름으로 디렉토리를 하나 더 만들어 주어서
템플릿에 이름을 구분시켜주는 것이다.

polls/templates/polls/index.html 을 만들자!



(polls/templates/polls/index.html)


위 템플릿은 latest_question_list 를 넘겨받는다.

코드 설명
latest_question_list에서 하나씩 가져와서 question에 넣으면서 반복한다.
question의 id 값을 이용해 링크 걸린 문구를 출력한다.

만약 가져올 설문이 하나도 없다면
설문이 없다고 출력한다.

이렇게 템플릿을 만들었으니

우리는 view에서 이 템플릿과 연결해야한다.



(polls/views.index)


template에 템플릿을 가져오고
context 에 latest_question_list 변수를 지정한 사전형 자료를 담아둔다.

그리고 template.render를 해주면 된다.



(결과)


이렇게 실행하게 되면
웹 페이지에서 링크로 출력되는 것을 확인 할 수 있다.

여기서 의문이 든다.
템플릿 로드하고, 변수 저장하고 템플릿 렌더해서 HttpResponse로 넘겨준다.
너무 루틴하지 않은가?
우리의 파이썬이 이걸 가만 놔둘리 없다.

단축기로 render라고 만들어두었다.
이 모든 과정을 한방에 해준다.

단축기를 사용해보자.



(단축기 사용)


render를 사용하면 위의 과정을 한번에 해준다.
단순히 템플릿을 지정해주고, 넘겨줄 변수를 사전형으로 만들어서 넘겨주면된다.

views에서 처리해야할 일이 또 뭐가 있을까?
바로,
에러처리다.

웹 페이지에서 대표적인 에러는 바로 404 에러이다.
해당 웹 페이지가 없는데 요청하는 것이다.
예를 들어 /polls/24  -> 만약 id가 24가 없다면 해당 페이지는 준비 되지 않은것이다.

404 에러 처리를 해보자!



(404 에러처리)


파이썬의 try except 구문을 사용한다.
해당 쿼리를 날려서 설문지를 가져오는데 만약 그게 없다면
404 에러를 반환한다.

실행하기 위해 detail.html을 만들어야하는데 형식상 만드는 것이므로 지금은 아주 간단히 작성한다.



(polls/templates/polls/detail.html)


없는 인덱스로 실행해보자.


(404 에러)


우리가 적은 Question does not exist 보이는가?
우리가 404 에러 처리를 하였다.

그렇다면 여기서도 또 의문이 든다.
try except 구문
왠지 많이 자주 쓰일 것이다.

그렇다!
이것 또한 단축기로 만들었다.!!!!
get_object_or_404 를 이용하면 해당 객체를 가져오는데 만약 없다면 404 에러를 내는 

우리가 위에서 했던 것을 한방에 해주는 함수다.



(단축기 사용)


실행해본다.



(실행 결과)


똑같이 404 에러가 떴다.
다만 에러 문구는 다르다!

이제 detail.html 템플릿에서

선택지를 보여주는 작업을 해볼 것이다.



(polls/templates/polls/detail.html)


해당 템플릿에서
question 객체를 받았다.
설문지에서 선택지를 전부 가져와서 하나씩 choice에 넣고
choice의 선택지를 출력해주는 것을 반복하는 코드이다.

실행해보면

(실행)


선택지들이 나열되어 나온다.


index 템플릿에서 detail 템플릿을 호출하였다.



(index 템플릿)


index 템플릿에서
/polls/ 
이렇게 url주소가 하드 코딩되어있다.

그렇다면 만약 detail 템플릿의 url이 바뀌면
이렇게 하드코딩된 주소를 찾아서 일일히 다 바꿔야할까?
그렇기 때문에 url 주소를 간편히 쓸수 있는 것이 있다.


(하드코딩 제거)


위처럼 {% url '이름' %} 이렇게 쓰면 된다.

그렇다면 저 url은 뭘까?


(urls.py)


우리가 urls.py에서 마지막 인자로 name 인자를 둔 것이 기억날 것이다.
이것이 우리가 url패턴을 각각 이름으로 정한것이다.

그렇기에 detail url을 쓰고 싶다면
{% url ' detail' %} 이렇게 쓰기만 하면 되는 것이다.

그렇다면 이 이름이 겹치는 것을 생각해봐야한다.
우리는 APP을 여러개 만들 건데 그 url마다 이름을 다 다르게 해야하는 건 너무 힘든 일이다.
다른 APP에 detail이라는 url 이름이 있을 수 있기 때문이다.

이걸 방지하기 위해 app_name을 지정해 줄 수 있다.



(APP 이름 지정)


위 처럼 app_name을 지정해주면 polls에서 사용하는 detail 이라고 알 수 있다.

그렇다면 당연히 아까 적은 url 표기도 바꾸어 주어야한다.


(url 표기 변경)


polls:detail
이렇게 바꾸면 된다.

(* 참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial03/)



이번에는 관리자를 생성한 후 관리자 페이지를 확인해 볼 것이다.

먼저!

관리자 계정을 생성한다!


(관리자 계정 생성)


명령어는 위와같고, 각자 계정과 비밀번호를 설정해주면 된다.

관리자 페이지란 장고에서 제공하는 기본적인 관리페이지이다.
우리는 이 페이지에서 우리가 만든 프로젝트를 관리할 수 있고 db도 쉽게 관리할 수 있다.

페이지는 /admin 으로 접속하면 된다.



(관리자 페이지)


아까 생성한 관리자 계정으로 접속한다.



(관리자 로그인)


로그인을 하면 위와 같은 화면이 나온다.

그런데?
우리가 아까 만든 model 정보는 없다..!
그렇다.
연결해야한다.

polls/admin.py로 가주자.



(polls/admin.py)


해당 파일을 위와 같이 작성한다.
register 함수로 Question 모델을 등록하는 것이다.

다시 접속해보면?


(관리자 페이지)


관리자 페이지에서 POLLS가 생성되고 아래 Question 항목이 생긴것을 볼 수 있다.

클릭해보면 아래와 같다.


(DB 수정)


해당 DB의 내용들을 볼 수 있고, 수정할 수 있고 추가할 수도 있다.
DB를 관리자 페이지에 연동시켜주면 나중에 DB관리도 장고에서 제공해주는 서비스를 이용하여 아주 편리하게 관리할 수 있다.

(* 참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial02/)


장고는 DB를 모델이라는 개념으로 관리를 한다.

우리는 데이터의 테이블을 하나의 model로 만들어주기만 하면
장고가 테이블도 생성해주고 기타 일을 해준다.

기본적으로 장고는 sqlite db를 사용한다. 나중에 다른 db와 연동하는 것도 공부하여 포스팅할 것이다.

지금은 장고의 모델 개념을 익히는데 집중을 할 것이다.

mange.py의 migrate 명령은 현재 db에서 수정된 부분을 적용시켜주는 역할을 한다. 모델을 확인하고 모델이 수정된 부분이 있으면 그거에 맞춰서 db를 적용시켜준다.

(초기 migrate)


처음 migrate를 하면 위와 같이 나온다.
우리는 아무 모델도 만들지 않고 그랬는데 뭘 적용하는거지?
장고는 기본적인 db 파일들이 있다. 관리자 정보, 인증 정보 세션정보 등등이 있다. 기본적인 db 정보들을 db에 필요하면 테이블도 만들고 알아서 적용시켜준다.

그렇다면 우리가 모델을 한번 직접 만들고 확인해보자.
지난 포스팅에서 우리는 polls 이라는 투표 APP 을 생성했다. 그렇다면 여기에 필요한 DB 테이블이 무엇일까?
기본적으로 질문들을 저장하는 테이블이 필요할 테고, 해당 질문에 대한 선택지들에 대한 테이블이 필요할 것이다.

그렇다면 Question과 Choice 모델을 2개 만들어보자.


(Question, Choice)


두 클래스 모두 model을 상속받아 생성한다.
기본적으로 model의 속성 필드가 있다.
CharField는 문자열이 저장되는 필드
DateTimeField는 날짜 정보가 저장될 수 있는 필드
IntegerField는 정수가 저장되는 필드
등등 있다. 이는 JSP나 다른 웹프로그래밍에서 DB를 생성해보았다면 이해하기 쉬울 것이다. 뒤 인자들도 쉽게 이해할 수 있을 것이다.
다만 다른점중 하나는 첫번째 인자를 선택하에 사람이 읽기 좋은 필등명으로 설정해줄 수 있다.
여기서는 pub_date를 보자. 여기서 필드를 생성할 때 첫번째 인자가 date published 라는 문자열로 설정되어있다. 우리는 해당 필드를 date published 라고 설정한 것이다.

그렇다면 이렇게 모델을 생성해주고 무엇을 해야하나?
여기서 이제 migrate 명령이 필요하다. 하지만 현재 우리 APP이 프로젝트로 포함되어있지 않다.!

포함시켜보자!


(포함시키기)


프로젝트명/프로젝트명/settings.py 에 들어가보면
INSTALLED_APPS 가 있는데 여기에 추가해야한다.
PollsConfig 클래스는 polls/apps.py 파일에 존재한다. 그러므로 경로는
'polls.apps.PollsConfig' 가 된다. 이 경로를 추가해주면 된다.

이제 migrate를 할 것이다.
우리는 직접 migrate하기전에 makemigrations를 이용해 과정을 살펴볼 것이다.

makemigrations 를 하게되면 변경된 부분을 migrate하기 전에 db를 위한 명령들이 있는 파일들로 만든다.


(makemigration)


polls에 대해 makemigrations을 해주니 하나의 파일이 생겼다.
이 파일 속에는 sql 쿼리들이 담겨있다.

확인해보면


(sql 쿼리)


위처럼 쿼리들이 저장되어있고, migrate를 하게 되면 위의 쿼리들이 날라가게 되는 것이다.

migrate!


(migrate)


migrate를 하게 되면 아까 생성된 파일들이 db에 적용이 된다.

이제 생성된 DB에 내용을 추가하는 것을 shell을 이용해 추가해볼 것이다.


(쉘 실행)


그 후 모델을 생성해준다.



(모델 생성)


모델에 내용을 채워서 생성해준다.

q에 Question 객체를 생성했다. 확인해보자.


(Question 객체 확인)


객체를 확인해보면 해당 내용들이 보인다.
save() 명령을 통해 DB에 저장할 수 있다.

객체를 확인해보자.


(객체 확인)


Question object (1) ..
우리가 알아볼 수 없다. 객체를 우리가 알아볼 수 있는 문자열로 보이게 하기 위해 조치를 취할 것이다.

이건 단순히 우리가 쉘에서 보기 편하게 하기 위해서가 아닌 나중에 관리자 페이지에서 해당 DB를 관리할 때 보기 편하게 하기 위해서이다.


(추가 내용)


위에서 만들었던 모델에 __str__ 을 오버라이드한다.

Question 모델에 메서드를 하나 추가해보자.



(메서드 추가)


최근에 발행된 질문인지 확인할 수 있는 메서드이다.

그리고 다시 쉘을 실행한다.


(확인)


아까보다 훨씬 보기 좋게 나온다. (질문내용을 나오게 출력했다.)

그리고 추가한 메서드도 확인해본다.



(추가 메서드 확인)



우리가 추가한 메서드도 잘 동작하는 것을 확인했다.

그렇다면 해당 질문에 선택지를 추가하고 마무리 하겠다.!



(선택지 추가)


선택지를 추가하였다.


( *참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial02/)


장고의 튜토리얼이다.

투표 APP을 만들 것이다. Project 안에는 여러가지의 APP이 있을 수 있다. 각각의 역할을 하는 APP이다. 여기서는 APP을 만드는 것을 해볼 것이다.



(APP 생성)


APP 생성은 manage.py 를 통해서 한다.

앱을 생성하면 다음과 같은 디렉토리 구조가 생긴다.



(생성된 디렉토리)


polls 디렉토리가 생겼다.

간단하게 웹페이지에서 해당 APP을 확인해 볼 것이다.
보여주는 것에 대한 처리를 담당하는 것이 views.py이다.

그러므로 우리는 views.py를 수정하여 해당 페이지에 들어가면 간단한 문구가 찍혀 나오게 할 것이다.



(views.py 작성)


HttpResponse 를 import하고 사용했다.
우리가 지금 만든 views.py에서 index는 아주아주 간단한 일을 하고 있다.
단순히 요청이 들어오면 위에 간단한 문구를 Http 응답으로 보내는 일이다.
HttpResponse는 Http 응답 페이지를 만들어서 보내주는 함수이다.

그렇다면 우리는 우리가 만든 views.py가 실행되야 해당 페이지에 문구를 띄울 수 있다.
우리는 url을 통해서 해당 페이지에 접근한다.
그러므로 url과 우리가 만든 views.py의 index를 연결해야한다.

urls.py를 만들어야한다.


(urls.py 생성)


해당 urls.py는 polls 디렉토리 안에서 생성하였다. 그리고 아래와 같이 작성한다.



(polls/urls.py)


해당 파일에서는 views 를 import 했다. 우리가 방금 작성한 index를 연결하기 위해서이다.
경로를 보면 '' 으로 아무것도 없다.
url에 아무것도 없으면 views.index랑 연결하라는 뜻이다.
옆에 name 인자는 해당 경로를 index 라는 이름으로 지정하는 것이다.
나중에 해당 url을 우리는 이 이름으로 불러와서 쓸것이다.

우리의 목적은 (우리사이트주소)/polls 에 접속하면 해당 index 페이지가 뜨는 것이다.(간단한 문구를 가진 페이지)
그러나 우리는 현재 빈문자열, 즉 아무것도 없는 경우에 index를 연결하였다.

순서가 조금 바뀌었지만,
이제 우리가 작성한 urls.py를 원본 urls.py에 연결해야한다.

(프로젝트 urls.py)



프로젝트이름/프로젝트이름/urls.py는 url 설정하는 파일이다.

여기에 우리는
path('polls/', include('polls.urls')), 줄을 추가하였다.
이 말은 polls 경로로 요청이 들어오면 include 하라는 뜻이다.

과정을 설명하자면
(우리사이트주소)/polls 로 요청이 들어오게 되면 이 파일에서 검사를 한다.

polls/ 라는 첫번째 패턴에서 걸리게 된다.

그러면 polls/ 까지 잘라버린다. 그렇게 되면 남은 url은 '' 빈 문자열이 된다.
해당 url을 
include하는 polls/urls.py로 전달한다.

그렇게 되면 아까 우리가 설정한 urls.py의 빈문자열에 대한 index 연결이 이해가 될것이다.

그렇다면 테스트 해보자!



(서버 실행)


실행 후, 주소/polls 

를 요청해보자.



(결과)


우리가 원하는 목적을 이루었다.!



(* 참조 - https://docs.djangoproject.com/ko/2.0/intro/tutorial01/)


Django는 Python을 이용한 프레임워크이다.

웹호스팅 프로젝트에서 사용할 웹페이지를 Django를 이용하여 만들어 볼 것이다.!

먼저 간단히, 설치하고 서버를 실행해보는 것부터 시작했다!



(django 설치)


pip 을 이용하여 django를 설치한다!




(설치 확인)


python에 들어가서 import django를 해보아서
django가 잘 설치되었는지 확인한다.

간단한 프로젝트를 만들어서 웹 페이지에 접속해 볼것이다.



(프로젝트 생성)


프로젝트 생성은 위와 같다.

이렇게 하게 되면 디렉토리가 만들어지는데 아래와 같다.



(생성된 디렉토리)


앞으로 manage.py를 이용하여 APP도 만들고 관리를 할 것이다.

그러면 실행해서 한번 웹페이지에 접속해보자!



(서버 실행)


서버 실행은 runserver이다.




(결과)


시도한 결과 연결이 거부되었다.

방화벽탓인지 한번 방화벽을 내려보았다.



(방화벽 오픈)



방화벽을 오픈하여도 같은 현상이 있어서 찾아보니

default로는 로컬호스트에서만 접속할 수 있고, 모든 호스트에서 접속이 가능하게 하려면

0.0.0.0:(port) 로 지정하여 서버를 실행해줘야한다고 한다.



(오픈서버 실행)


서버를 실행하고

다시 접속해본다!



(Disallowd)


허용되지 않은 호스트???..

또 검색을 해본다.

검색을 해본 결과 해당 프로젝트 디렉토리의 settings.py 파일을 수정해주어야한다고 한다.



(settings.py)


ALLOWED_HOSTS 를 *로 모든 사용자가 접속하게 한다.



(접속)


접속해보니 이제 제대로 웹페이지에 접속이 되는 것을 확인할 수 있었다.

이번 글에서는 웹 호스팅의 가장 기본인 Apache 서버를 설치하고 테슽트 해볼 것이다.

Apache 서버 httpd 설치



(httpd 설치)


설치 후 httpd 데몬을 실행시켜준다.



(httpd 실행)


실행하고 포트를 확인해본다.



(포트확인)


80포트가 열려있는 것으로 봐서 httpd가 동작하고 있음을 확인 할 수 있다.

이제 시스템 서비스로 등록하여 부팅될 때마다 실행되도록 설정한다.



(설정)


테스트해본다.

웹페이지에 IP주소를 입력하면 내 서버의 테스트 서버가 나올 것이다.


(테스트 페이지)


이 기본페이지 말고 간단하게 홈페이지를 만들어볼 것이다.(아주 간단히)

Apache의 설정 정보는 아래의 위치에 있다.



(설정 정보)


이 파일을 열어서 확인해 본다.




(웹 페이지 디렉토리)


/var/www/html에 있는 파일들이 보이는 것이다.
여기에 내가 만든 페이지들을 업로드 시켜두면 여기 있는 페이지들이 인터넷에 보여지는 것이다.





(index 파일)


기본 설정으로 index.html 파일이 보여지게 되어있다.
나는 home.html으로 바꾸었다. 이제 /var/www/html/home.html 이 화면에 보여질 것이다.




(/var/www/html)


위의 경로로 들어가서 home.html을 만들어보았다.



(간단한 페이지)


위처럼 페이지를 아주 간단히 만들고




(서비스 재실행)


httpd 를 재실행해준다.

그리고 인터넷에서 내 IP를 입력해주면 방금 내가 만든 HTML 화면을 볼 수 있다.



(home.html)


그런데 조금 밋밋하다.
사진도 같이 올리고 싶다.

나의 서버와 파일을 주고 받을 수 있어야한다. 나의 서버에 파일을 업로드 할 경우도 있고,
나의 서버에서 파일을 다운로드 받을 경우도 있기 때문이다.

이를 위해 FTP를 이용할 것인데, FileZilla를 사용할 것이다.

내 컴퓨터에는 Clinet를 설치한다.



(Client 다운, 설치)


FileZilla가 설치가 다 되면 실행해준다.



(편집-설정)


편집-설정 을 클릭해준다.



(키 파일 추가)


왼쪽 항목 SFTP를 클릭한 후 키 파일을 추가한다.

이전 포스팅 글에서 SSH 키를 만들어 접속할 때 쓰는 그 키 파일이다. 여기에는 private_key 파일을 등록한다.



(파일-사이트 관리자)


그 후 사이트 관리자를 들어간다.



(정보 입력)


여기서 새 사이트를 만들어 준 후 
접속할 호스트 IP를 입력한다.
프로토콜은 SFTP로 설정하고 로그온 유형은 인터랙티브 그리고 사용자 id를 입력한다.

그리고 연결을 하면, 우리가 SSH를 이용해 비밀번호 없이 로그인하던 것과 같이 로그인이 된다.



(로그인 된 화면)


이제 이를 이용해 사진을 내 홈페이지에 올려보겠다.

먼저 내 서버에 사진을 옮긴다.



(사진 이동)


옮긴 사진을 아까 home.html 의 위치에 복사한다.



(사진 추가)


그리고 home.html을 조금 수정해준다.

<img> 태그를 이용하여 사진을 올려준다.



(확인)


홈페이지에 귀여운 보노보노가 올라갔다.


내 서버의 시간을 설정하는 것이다.

NTP(Network Time Protocol)을 이용하여 동기화를 할 것이다.
첫번째 작업은 내 지역의 timezone으로 설정하는 것이고.
그 후 NTP 서비스를 돌리는 것이다.

NTP서버에서 주기적으로 올바른 시간을 맞추어 시간을 정확하게 동기화 시킬것이다.

먼저 우리가 설정할 수 있는 timezone을 확인해본다.



(timezone 확인)



우리는 Asia/Seoul을 선택할 것이다.



(아시아/서울)



아시아/서울 로 timezone을 설정한다.



(timezone 설정)



timedatectl 명령어로 확인해본다.



(설정 확인)



이제 NTP를 이용할 것인데,

기본 CentOS에 설치가 안되어있으므로 설치한다!



(NTP 설치)



이제 ntpd 를 실행시키면 끝!



(실행)



이것으로 서버 시간 설정이 끝난다. :)


내가 선택한 운영체제는 CentOS7 버전이다.

7 이전의 CentOS에서는 iptables-service 를 이용해 방화벽을 설정했었는데
7이후에는 firewalld 를 통해 방화벽 설정을 한다.

iptables는 존재한다. 다만, iptables를 수정하는데 7이후에서는 firewalld를 이용하는 것 뿐이다.

이 프로젝트를 진행하면서 필요한 설정을 하겠지만
처음 기본으로 방화벽을 설정할 것이다.

firewall-cmd --state명령으로 현재 상태를 확인한다.



(현재 상태 확인)


확인해보니 not found??...

firewalld를 설치해준다.! (없나보다!)



(firewalld 설치)



설치 후 firewalld를 시작해주고, enable을 통해 boot될 때 실행되도록 설정해준다.
(서버라서 종료할 일은 없지만.!)

그리고 마지막 명령은 상태를 확인할 수 있는 명령이다.



(firewalld 시작)


위에서 확인했지만,

처음 사용한 명령으로 다시 확인해보겠다.




(실행중)


현재 상태를 보니 실행되는 중이다.

가장 중요한 우리는 앞으로 SSH를 이용해 접근할 것이므로 SSH서비스를 등록해둔다.
포트 이름을 지정해도 되지만 서비스 이름으로도 설정 할 수 있다.

ssh 포트를 수정하지 않았기 때문에 사용 가능!



(SSH 등록)


그 후 우리는 웹 호스팅을 할 것이기 때문에 http도 추가!


(http 추가)




SSL/TLS를 사용할 것이므로 https도 추가!


(https 추가)





이제 추가한 것들을 확인해보자


(확인)


지금까지 입력한 서비스들이 services에 등록되어 있는 것을 볼 수 있다.

지금까지 설정한 것들은 default 존인데, conf 파일에 보면 default 존이 public 존으로 설정되어있는 것을 볼 수 있다.

이제 설정한 것들을 올린다.



(설정 등록)



그 후 enable을 다시 주어서 boot 될 때 실행이 되도록 설정한다.



(enable)


VPS 웹 호스팅 프로젝트를 시작해본다.

웹 호스팅 서비스를 받지 않고, 직접 서버를 대여하여 가꾸는 것이다!
사실 웹 호스팅뿐 아니라 다양한 테스팅을 위해 서버를 대여하고 싶었다.

찾아본 곳 중 DigitalOcean 이라는 사이트가 있었다.
가장 저렴한 옵션으로 한달에 5딸라!

그리고 내가 적은 링크로 가입을 하게되면 10딸라를 준다.
고로 아래의 링크로 가입을 할 경우, 무료 2달을 체험할 수 있다.!

(본인만의 서버를 만져보고 싶고, 가꿔보고 싶은데 아직 잘 몰라서 서버 대여에 돈을 지불하기가 고민되는 분들은 일단 2달만 써볼 수 있는 좋은 기회이다!)


https://m.do.co/c/88300c36e548


요 링크로 들어가서 가입을 하고 Droplets를 생성할 수 있다.

Droplets 생성 방법은 직관적이어서 생략한다.
사용하고 싶은 운영체제를 선택하고 옵션을 선택하여 만드는 방식이다.

다 만들게 되면 아래와 같이 서버가 할당된다.



(서버 생성)


나는 리눅스 수업을 CentOS로 배웠어서 CentOS를 택했다.
우분투가 많이 사용하지만 우분투는 운영체제때만 잠깐 써봤던지라 CentOS가 더 친숙했다.

가입할 때 적은 메일로 편지 2통이 날라와 있다.

하나는 내가 CentOS를 선택했기 때문에 온건데
처음 설정하는 방법에 대해 알려준다. (매우매우 친절하다.!)

DigitalOcean의 장점 중 하나는 이것인거 같다.

서버에 대한 지식이 부족할 지라도 DigitalOcean에서의 튜토리얼도 있고 처음 시작할 때 뭐를 설정해야하는지 등등 매우 친절하고, 이런것을 직접 하므로써 공부도 많이 된다.




(설정 방법)



스텝별로 나와있다.

또 하나의 메일은 방금 생성한 서버에 대한 정보이다.



(서버 정보)



이 메일 안에는
IP주소, 처음 root의 비밀번호 등 서버에 관한 정보가 담겨있다.

나는 Xshell 을 이용하므로 Xshell로 나의 서버에 접속하였다.



(첫 접속)


두근두근
나의 첫 서버라니!(가상 사설서버이지만.!)

처음 들어가게 되면 비밀번호 치라고 나오는데, 아까 메일에서 적혀있는 비밀번호를 입력하면 된다.
그렇게 되면 이제 새로운 비밀번호를 치라고 나오는데 이것이 바로 root 계정의 비밀번호이다.

root 비밀번호도 새로 정했다면,
이제 내가 접속할 계정을 추가해야한다.
root 계정은 막강하고 중요하니까! 일반 계정을 하나 만들어주고, sudo 명령을 사용할 수 있도록 권한까지 부여할 것이다. 어찌보면 나의 부root계정인 셈이다.

아이디 생성


(계정 생성)



그 후 sudo 권한 즉 super user 권한을 줄것이다.
/etc/sudoers 라는 파일을 수정해야한다.

기본적으로 쓰기 권한이 없다. 그러므로 쓰기 권한을 추가하고 이 파일에 들어가서 수정해주어야한다.



(쓰기 권한 추가)


그 후 맨 아래에 다음 설정을 추가해준다.



(설정 추가)


위 설정은 normaltic이라는 나의 계정에 대해 supersuer권한을 주고
sudo 명령을 사용할 때 비밀번호를 묻지 않게 설정한 것이다.

설정이 끝나면 쓰기 권한을 제거해준다.



(쓰기 권한 제거)



그렇다면 normaltic 계정으로 들어가서 sudo 명령이 되는지 확인!



(확인)



잘된다!

자 이제 SSH키를 이용해 접속할 것이다.
이 부분은 DigitalOcean에서도 권장하는 방법으로 비밀번호로 로그인하는 것보다 더 안전하기 때문이다.
SSH 공개키를 이용하는 방법이다. 로컬 컴퓨터인 내가 쓰는 컴퓨터에서 키를 가지고 있고 그에 해당하는 공개키를 나의 서버에 저장해두는 것이다.
그렇게 하여 계정 비밀번호로 접속하는 것이 아니라 SSH 공개키 인증을 통해 접속하는 방법이다.
(SSH 원리가 궁금하다면 구글링!)

SSH 키 생성하는 방법은 여러가지가 있지만
Xshell에서 하는 방법을 이용했다.

도구 - 사용자 키 관리자

로 들어간다.



(사용자 키 관리자)



들어가게 되면 아래와 같은 창이 뜬다.



(사용자 키)


여기서 생성 버튼을 누른다.


(키 선택)



키의 유형과 키 길이를 선택할 수 있다.

그렇게 선택을 마치면 키를 생성한다.



(키 생성)



키 생성이 된 후

이 키를 사용할 때마다 사용할 암호를 정한다.



(사용자 키 암호)



??
비밀번호를 안쓴다고 했는데 왠 비밀번호?

SSH 키를 우리가 생성했고, 이 키를 이용해 접속한다고 했다. 즉, 계정의 비밀번호로 접속하는 것이 아니라 SSH 인증을 통해 접속한다.
그렇기에 이 키파일은 굉장히 중요하다. 만약 다른사람이 내 컴퓨터에 덜컥 앉아서 접속을 할 수도 있는것 아니겠는가? 그렇기에 이 키 파일에 접근하기 위한 비밀번호이다.

이제 등록된 공개키를 서버에 저장해야 한다.

SSH의 키 파일이 어디로 설정되어있는지 확인해보자.



(설정파일)



이 파일에서 확인해보면



(키파일 위치)



인증키파일 위치는 위와 같이 되어있다.
본인이 수정하고 싶으면 수정 할 수 있다. 해당 계정의 홈 디렉토리에서 위의 경로이다.

그렇다면 적어준다!


(인증키 설정)


위의 경로에서 아까 생성한 키파일 등록정보를 가보면 공개키를 볼 수 있다.
그 공개키를 위 파일에 저장한다.

그 결과 안되었다... CentOS는 조금 다른가보다.!
검색을 이리저리 뒤적거리다 보니 다른분이 이미 이것으로 많은 시간을 썼던 경험을 공유해주셨다.
그 분 덕분에 나는 조금 덜 헤멜 수 있었다.

아까 그 설정파일에서 주석처리 된 부분을 제거해주어야했다.



(주석 제거)



공개키인증을 사용하는 것에 있어 기본 설정으로 #이 붙어있으니 주석을 제거해준다.

그 후 권한 설정인데...
사실 이유는 잘 모르겠다. ~/.ssh/authorized_keys 권한 설정이 해당 권한보다 높으면 안된다니..

정확하게 .ssh 디렉토리 권한은 0700
정확하게 authorized_keys 파일의 권한은 0600
이보다 높아서도 안된다. 권한이 더 많으면 될 줄 알았는데 많으면 오히려 안된다고 한다..

권한 설정!



(디렉토리 권한)



(키파일 권한)



그 후 SSH로 접속해본다.


(접속 성공)



SSH 설정까지 꽤 오랜 시간이 걸렸다.


오늘은 스케쥴관리 페이지에서 할일을 추가하는 기능을 만들었다.

쉽게 말하면
todolist table에 데이터를 집어 넣는 기능이다.

페이지를 옮겨다니는 것도 좋지만
팝업창 기능을 이용해서 기능을 구현하고 싶었다.



(스케쥴관리 메인 페이지)



여기서 할 일 추가하기를 누르면 팝업창이 뜨고 입력하게 할 것이다.

팝업창을 뜨게 하는 자바스크립트를 검색했다.
그리고 그냥 추가하고 크기만 조금 수정했다.



(팝업 스크립트)



그 후 [할 일 추가하기] 버튼을 클릭했을 경우 스크립트가 동작하도록 호출한다.



(팝업 호출)



호출된 페이지는 schedule_append.jsp 페이지로 이동하므로
이제 이 페이지를 작성해야한다.
기본적으로 DB에 아이디를 추가할 것이다.
id는 세션값으로 받아왔다.
그리고 그 아이디를 통해 이름을 가져왔다. (지금 생각해보니 왜 가져왔는지 의문)
(삭제해줘야할 불필요한 코드다..!)
(아이디를 통해 todolist를 필터링 할것이다.)
(해당 아이디의 데이터만 화면에 보이게 할것이다.)



(기본정보 받아오는 코드)



그리고 form 태그를 만들어준다.
여기서 입력한 정보를 schedule_append_OK.jsp 페이지로 넘어가서 데이터를 입력시켜줄 것이기 때문이다.



(form 태그 만들기)



이제 여기서 입력한 정보를 schedule_append_OK.jsp 페이지로 넘겨주어
데이터를 입력할 것이다. (MySQL에)



(데이터 입력)



입력 후 이 창은 팝업창이므로 저절로 닫히도록 자바 스크립트를 추가했다.



(스스로 창닫기 코드)



지금 까지 만든 페이지를 확인해보자! :)



(할일 추가하기 클릭)



팝업창이 뜬다!



(팝업창)



여기에 할 일을 적어준다.




(할 일 입력)



그리고 추가하기를 눌러준다.!

메인페이지에 다시 들어가보면!
할 일이 추가된 것을 볼 수 있다.


(할일 추가 된 모습)



+ Recent posts