https://itcreator.tistory.com/125 를 보고 이 글을 진행하는게 이해가 쉬움 

 

시작하기전에 협업할때 편한 가상화 작업

 

1. ctrl + shift + ~ 터미널 창 열어주고 가상환경설정하기

 

python -m venv <env name> # 가상환경
# Venv 안뜨면 ctrl/command + shift + p 로 인터프리터 열어서 <env이름> 직접 선택

# 수동
(Mac) source venv/bin/activate
(Win) source vent/Scripts/activate
pip install django==3.2.16 django_extensions

pip list  # 상태확인

touch README.md .gitignore # READ, gitignore 사전작업

pip freeze > requirements.txt  # 협업 세팅환경용


# 3.2.16버전이 롱텀이라 안전성높음

 

 

1. 회원가입에 필요한 기초설계

1. account 앱 폴더 생성 및 등록

# root 기준  터미널 명령어

python manage.py startapp <app 이름>

mkdir -p account/templates/account  # 템플릿 생성

cd  account/templates/account  # 최하단 까지 이동

touch login.html signup.html     # html 생성

 

2. urls.py 생성 (..../<app이름> 으로 들어오는 통로 열어주기)

# 다시 최상단 으로 돌아와서( 보통 cd .. 3번 하면됨)

Touch <app이름>/urls.py    # url 이동 잡아주기

 

2.  accounts  > urls.py 세팅해주기    (앱이름을 accounts로 할 경우)

from django.urls import path
from . import views

app_name = 'accounts'

urlpatterns = [
    # accounts/signup/
    path('signup/', views.signup, name='signup'),   # url에 accounts/signup/으로 접근이 온다면 => views 에 있는 signup 함수 실행 / 그리고 이 과정을 signup 이 라고 칭하겠다. 
    # accounts/login/
    path('login/', views.login, name='login'),
    # accounts/logout/
    path('logout/', views.logout, name='logout'),

]

 

3. Control 단 (accounts > Views.py)

1. 쉬운 버전용 필요한 클래스 import 하기

# 화면구성, 화면이동, 객체를 받거나 없으면 404에러를 터트려줌 (이거 없으면 서버 문제가 아닌데도 500 서버단 에러를 터트림)
from django.shortcuts import render, redirect, get_object_or_404 

# DB 생성없이도 account에 필요한 컬럼을 만들어줌, 인증에 필요한 옵션
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

# 세션을 부여하거나 수거함 (출입증)
from django.contrib.auth import login as auth_login, logout as auth_logout

# get, post에 따른 
from django.views.decorators.http import require_http_methods

 

2. 가장 먼저 signup 함수채우기 

@require_http_methods(['GET', 'POST'])   #GET, POST 요청만 받겠다
def signup(request):   #request 요청 받은 정보 전부 인수로 전달한뒤 함수 실행
    if request.method == 'POST':  # 회원가입 신청서 제출시 작동
        form = UserCreationForm(request.POST)  # user 의 경우 Model괴 Form도 자동으로 해줌 /import만 잘하면됨
        if form.is_valid():   # 내장 검증함수실행 / False 시 13번부터 실행
            user = form.save()   # 유저가 입력한 정보 DB에 저장
            auth_login(request, user) # 회원가입하고 바로 세션부여 채워줌 
            return redirect('board:article_index')   # 바로 게시글 볼 수 있게 리다이렉트해줌
    
    else:   # get으로 온 경우 
        form = UserCreationForm()   # 회원가입 폼
        
    context = {'form': form }  # 폼을 context에 담아서 
    return render(request, 'accounts/signup.html', context)   #받은 정보들을 바탕으로 signup.HTML 화면 구성

3. login 함수 채우기

@require_http_methods(['GET', 'POST'])  # get과 포스트만 받겠다
def login(request):
    if request.method == 'POST':  # POST인 상황 즉 아이디 / 비번 넣고 로그인 버튼 눌렀을때 실행
        form = AuthenticationForm(request, request.POST) # 인증폼은 다른 폼과 인자 구성이 다름 / 지금은 request 인수를 던지는 이유에 대해선 넘어가기로.. 
        if form.is_valid():
            user = form.get_user()  # 이 유저가 누군지 알려줌
            auth_login(request, user ) # 받은 유저정보를 주면 입장 팔찌를 채워줌 파이썬에서 제공해주는 함수 (임포트해야함) 
           #  None/ URL string 들어가있음
            next = request.GET.get('next') # 다른곳에서 튕겨서 온 사람들 /? 이후 URL을 request.GET으로 받음 .get은 값이 없더라도 none으로 받음  
            return redirect(next or 'board:article_index') # next 가 false 면 index로 보내고/ next가 true 면 next 값으로 이동  
    else:  #  GET인 상황 로그인 페이지를 들어오는 상태라면
        form = AuthenticationForm()   # 내장함수를 form으로 받고
    context = {'form': form}   # 내장함수에 받은 내용을 context에 담아 보냄
    return render(request, 'accounts/login.html', context)

4. logout 함수채우기

def logout(request):
    auth_logout(request) # 세션을 지움
    return redirect('board:article_index')  # 게시글 있는곳으로 다시 리다이렉트

 

 

 

 

< 총 정리하자면 >

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.views.decorators.http import require_http_methods

@require_http_methods(['GET', 'POST'])
def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)  
        if form.is_valid():
            user = form.save()
            auth_login(request, user) 
            return redirect('board:article_index')
    else:
        form = UserCreationForm()

    context = {'form': form }
    return render(request, 'accounts/signup.html', context)


@require_http_methods(['GET', 'POST'])
def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST) 
        if form.is_valid():
            user = form.get_user()  
            auth_login(request, user ) 
           
            next = request.GET.get('next')
            return redirect(next or 'board:article_index') 
    else:
        form = AuthenticationForm()
    context = {'form': form}
    return render(request, 'accounts/login.html', context)

def logout(request):
    auth_logout(request)
    return redirect('board:article_index')

 

 

https://itcreator.tistory.com/130

2탄 게시판 및 댓글 쉬운버젼 (DB가 추가됨)

 

[Django] Board/comment 게시판/댓글 쉬운버젼

https://itcreator.tistory.com/129 이어서 하기 이전버전은 USER는 DB를 만들지 않아도 따로 생성되었음 (물론 커스터마이징 가능하지만 그건 나중에) 이번은 이전설정과 거의 비슷하게 한번 더 앱을 만들

itcreator.tistory.com

 

1.  Project 폴더 / 앱 설정

 

1. 프로젝트 폴더 생성 과 동시에 manage.py 파일을 만듬.

django-admin startproject  <project 이름> . (뒤에 . 찍어야 현재 폴더 위치에서 생성됨)

2. 그 프로젝트 안에 구성할 앱들 만들기

python manage.py startapp <app 이름>

 

 

2.  가상환경 설정 

메인폴더에서 

python -m venv <env name> # 가상환경



(Mac) source venv/bin/activate

(Win) source vent/Scripts/activate

 

Command + Shift + p > 인터프리터 선택 > 가상환경 선택

venv 가 안떠있으면 터미널 껏다 켜기

READ.md , .gitignore, requirements 생성

pip install django==3.2.16 django_extensions

pip list  # 상태확인

touch README.md .gitignore # READ, gitignore 사전작업

pip freeze > requirements.txt  # 협업 세팅환경용


# 3.2.16버전이 롱텀이라 안전성높음

 

 

3. 뼈대잡기 

사용할 html의 뼈대를 잡음

 

1. 공통적으로 활용할 html 생성

Project > templates > base.html or navbar.html 등등 (include용 메인 html)

install -Dv /dev/null template/base.html

#   (mkdir templates >  touch templates/base.html을 한번에)

 

2. 앱에서 사용할 html 생성

Mkdir -p <app이름>/templates/<app이름>  # -p 는 templates 라는 상위폴더가 없어도 상위폴더까지 같이 생성해줌

cd <app이름>/templates/<app이름>  # cd로 최하단까지이동

touch **.html **2.html **3.html (사용할 html 쭉 나열하면 여러개 생성)

 

 

 

3. 기타 .py 파일 생성

# 다시 최상단 으로 돌아와서( 보통 cd .. 3번 하면됨)

Touch <app이름>/urls.py, forms.py 생성

4. 초기세팅

1. Project>settings에서 해야할 일

 Project > settings > app등록  

*

'django_extensions', # 추가해두면 나중에 python manage.py shell_plus 사용가능

 

 

 

 

 

 

Templates / dirs 등록 >  BASE_DIR / ‘templates’

 

 

(Project) > (App) > views.py > 함수생성

 

base.html > block > tab

 

2. Master urls.py 내용추가

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('<app이름>/', include('<app이름>.urls')),
]

 

3. app이름 >  urls.py

from django.urls import path
from . import views

app_name = '<앱이름>'

urlpatterns = [
    # <앱이름>/create/
    path('create/', views.create, name='create'),
    # <앱이름>/
    path('', views.index, name='index'),
    # <앱이름>/1/
    path('<int:student_pk>/', views.detail, name='detail'),
    # <앱이름>/1/update/
    path('<int:student_pk>/update/', views.update, name='update'),
    # <앱이름>/1/delete/
    path('<int:student_pk>/delete/', views.delete, name='delete'),
]

 

4. app이름 > views.py 세팅

함수정의 하기 

 

from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_http_methods, require_safe, require_POST
from .models import Student
from .forms import StudentForm

@require_http_methods(['GET', 'POST'])
def create(request):
    pass
    
# CRUD에 맞는 필요함수 적기

 

 

4. 서버실행

Manage.py 있는 루트위치에서

python manage.py runserver 

# 나가기 Ctrl + C

 

5. DB 세팅

1. Model.py 작성

app > models.py  / 자바로 치면 DAO

from django.db import models

class Student(models.Model):
    name = forms.CharField(min_length=2, max_length=10)
    title = forms.CharField(min_length=2, max_length=20)

 

2. Forms.py 작성

app > forms.py

# 1. 유효성 체크 (validation check)
# 2. HTML 안에 인풋태그 만들기 귀찮
# 3. 저장할 때 request.POST에서 일일이 꺼내기 귀찮아서 forms.py 만들어서 관리
from django import forms
from .models import Student

class StudentForm(forms.ModelForm):
    name = forms.CharField(min_length=2, max_length=10)
    title = forms.CharField(min_length=2, max_length=20)
    
    class Meta:  # 이 클래스의 메타 데이터 저장용 
        model = Student
        # fields = ('name', 'title')
        fields = '__all__'

 

3. 서버시작

서버실행 (혹시 값이 바뀔면 다시 실행)

python manage.py makemigrations <app이름>

python manage.py migrate <app이름>

# 잘안되면
rm db.sqlite3 <앱이름>/migrations/0*
rm db.sqlite3 accounts/migrations/0* board/migrations/0*  
# 다 지우고다시

 

 

6. 꾸미기

pip install django-bootstrap-v5

# 장고 부트스트랩 추가
pip install django-bootstrap-v5

설명서

https://django-bootstrap-v5.readthedocs.io/en/latest/installation.html

 

What is Telemetry

Remote Measure

Third Party Monitoring

Not a new concept

 

But Doing it new way

Docker, KVM, AWS, Azure

 

 

Service Visibility is the key in cloud

  • Visibility is often accomplished via post facto application of agent-based monitoring tools
  • Agent-based monitoring tool don’t understand business value (not dynamic)
  • Determining an application’s health often requires complex logic
  • Traceability of an application is difficult( or impossible) to accomplish with OTS solutions

 

 

< 구조 >

 

텔레메트리 분류

ingest(데이터 받기) > Store(저장) > Analysis(분석) > Present(보여줌)

 

 

1. ingest 

: Prometheus for Metric

 

: fluentd for logging (또는 Apache Flume)

 

 

 

2. Store

  :  TSDB for Metric

Prometheus

  • simple
  • has its own SQL (PROMQL) : easy for use
  • no clustering or high availability

 

 

 

OpenTSDB • powerful

  • clustering and high availability
  • complicated ( based on hbase, Hadoop)

 

: key/value for logging

Elastic Search (많이 씀)

  • simple, support scale-out
  • support GUI (kibana)
  • fast, realtime support
  • DSL based search

 

3. Analysis : it’s not quite simple

 

 

Message queue: kafka

- 관리 부분을 발신/수신자에게 부담해버림

- 카프카 내부에선 큐만 관리 -> 빠를 수 밖에 없음

 

 

 

 

 

<여러 회사들의 예시>

Metric integration: kakao’s kemi stats

 

logging integration case: kemi log

 

 

Kakao’s case

여태 배운 네트워크개념 + synology nas로 뽕 뽑기

2만원짜리 알리발 카메라 20만원 짜리 CCTV 환경 만들기!

 

필요준비물 : NAS, ONVIF 카메라, 공유기

 

ONVIF 카메라는 대부분 2 - 4만원

https://s.click.aliexpress.com/e/_DknmiZz

https://s.click.aliexpress.com/e/_Dkpioll

 

* 참고로 플러그는 EU 형으로 사야 우리가 쓰는 220-230v 로 받음

또는 아답터 줌

 

 

배송 기다리기 싫다면

 

TP-link c210도 추천!
https://link.coupang.com/a/ITDsd

 

 

 

 

 

1.  시놀로지에서 패키지에서 Surveilance Station 다운로드 

2. 구글 스토어에서 smart life 어플설치 /or Tapo (TP-link의 경우)

 

3. 카메라 전원 연결하고 smart life/ Tapo 연결

(장치추가 - 카메라 및 잠금 - 스마트카메라 - 2.4GHz 입력 및 암호 - QR 코드 cctv에 비추기)

5GHz는 연결안됨 2.4로 해야함!

 

4. 공유기 게이트로 이동 172.30.1.254 또는 192.168.0.1 (iptime)

혹시 아이디 비번을 설정한 적이없다면

kt유저-> ktuser / homehub    

skt유저 -> admin / 공유기 밑에 MAC주소 뒤 6자리_admin

lg유저 -> 공유기 뒤에 적혀있음

iptime -> admin/admin

 

5. CCTV 맥주소로 내부 ip주소 찾기  

 

6. 고정 ip 할당 고정 (장치설정 - 네트워크 관리 - LAN 연결설정 ) - 장비가 재부팅 될 경우 ip가 변하는걸 방지

7. Synology - Surveilance Station 으로 들어가서 카메라 - 인터넷 - 시놀로지 연결하기

최대 2대 까지 연결 지원함! 엄청나다!

 

7- 1 TP-Link 같은경우 : 사용자 이름 / 패스워드를 설정해야함

tapo 어플 홈 화면 >> 연결된 CCTV >> 오른쪽 상단 바퀴>> 고급 설정 >> 카메라 계정 입력 후 저장 >> 시놀로지 사용자 이름/ 패스워드

 

 

 

8. Surveilance Station 녹화설정 또는 알림 설정하기

녹화설정
이벤트 감지 위치

9. 구글스토어에서 dscam 깔기 

휴대폰으로 감시 및 모션 알림 바로 받을 수 있음 / 개별 cctv 어플 모션알림은 끄는게 좋음

개발 공부를 시작하게 된 이유
1. 물리학을 공부할 때 제일 재미있던 개념은 '시간'이었다.
그놈의 t가 가지는 무서움. 어떻게 하면 시간 정복할 수 있을까? 어떤 수를 써도 시간을 제어할 수 없었고 그저 시간을 붙잡기 위해 하루를 기록하고, 시간을 아끼기 위해 단순 반복적인 일은 자동화하고 싶었다.


2. 이런 성향은 나를  어떻게든 시간을 붙잡게 만들었고, 그 결과 학창 시절부터 카메라에 빠지게 만들었다.
카메라로 찍은 사진과 영상을 보면 그때의 그 감정이 고스란히 담겨 있어 시간 여행을 하는 느낌이었고,  한번 카메라 세팅만 해주면 추운 밤 알아서 별촬영을 해주고 타임랩스로 알아서 결과물을 뽑아내주는 자동함이 주는 그 자유함은 이로 말할 수 없었다. 
작은 카메라 하나였지만 나에게 자극이 되길 충분했다.

3. 지금 생각해보니 영상 콘텐츠를 제작을 업으로 삼게 된 거는 자연스러운 일이기도 하다.
하루에 몇 번씩 카메라를 들고나가 여기저기 찍고 다니다 수 없이 저장공간을 백업하고, 보관하는 일들이 또 다른 나의 숙제로 다가왔다.
4k 422로 몇 분 남짓 찍기만 했는데 이미 몇백 기가바이트라니..
몇 장 안 되는 사진을 옮기는 게 그리 귀찮을 수 없었다. "하 백업을 자동으로 할 수 있는 방법은 없을까?"

이러한 작은 생각들이 나를 IT세상으로 가게 하였다.
인터넷만 있다면 사진을 찍자마자 내가 원하는 디렉토리로 사진, 영상을 옮기는 FTP 통신, SDcard를 꽂기만 하면 바로 백업이 되는 usb-copy, 내부망 안에서 바로 미디어 편집을 가능케 한 SMB.. NAS를 사고 나서 삶이 질이 달라졌다.
마치 한 사람을 고용한 느낌이랄까?

4. 내 나이 20 후반 이제는 경제력을 필요로 하고 조금 더 전문성을 가져야 할 필요성을 느낀다.
친형이 방송국에서 정보통신 쪽으로 일하고 있는데, 내가 보기에 방송국도 좋아 보여서 방송국 견학부터 시작해서 3개월간 방송국을 가서 업무를 익히는데.. 방송국과 나는 성향이 맞지 않다는 걸 금세 깨달았다. 그 보수적이다라는 교육직 공무원보다 더 보수적이었고, 혁신을 찾아보기 어려웠다. 보면 볼수록 점점 방송국의 미래는 어두워지는 것 같았다.

이러한 경험이 내 인생의 방향을 정하는데 큰 지표가 된 것 같다.


개발 공부를 해야 하는 이유
1. 우선 나의 경제관념에 관해 먼저 말하고 싶다. 어릴 적에 봤던 가난한 아빠와 부자 아빠 책을 보면서 자본에 대한 생각이 많이 바뀌었다.
나는 저축보다는 투자를, 특히 유동성에 투자하려는 편이다. 자본은 결국 가치이다. 누군가에게 가치로 1원을 받는다면 그건 굉장히 쉬운 일일 테다. 좀 더 나아가 60억 인구에게 1원씩 받는다면? 60억을 손에 쥐게 된다. 더 나아가 한번 일해서 한 번의 가치를 얻는 게 아니라 가치 생산의 자동화 즉 시스템화를 통한 패시브 인컴을 만들어야 한다. 개발은 이런 패시브 인컴을 만드는데 최적화되어 있다!


2. 자 이제 나는 어떻게 가치를 줄 것인가?
사진 찍기를 좋아했던 나는 만약 누군가 20년 전 나의 과거 사진을 100원에 판다고 하면 기꺼이 구매할 것이다.
다시는 시간에 나로 갈 순 없지만 그때의 나를 회상하면 충분히 100원 이상의 가치를 할 것이기 때문이다.
당근마켓, 카카오톡을 보면 참으로 간단한 서비스이지만 엄청난 편의성을 누릴 수 있다. 한번 쓰기 시작하면 그 관성은 쉽게 바뀌지 않는다. 이게 바로 기술을 먼저 알아야 하는 것 과 같다. 어떤 가치를 주는 것 : 시간을 아끼게 해 준다거나,
노동력을 줄여주는 서비스! 개발은 이러한 가치를 주기에 정말 적합하다고 생각한다.


3. 개발자는 레드오션이며 블루오션이다. 그러나 세상이 너무나 빠르게 변화하고 있다. 2011년에 처음으로 스마트폰을 써본 것 같은데, 10년이 지나니 스마트폰이 모든 것을 대신하고 있다. 그 시대에 이런 세상을 생각이나 했을까? 다시 말해 기회는 온다.
네트워크 개발이 되더니 빅데이터가 가능해졌고,  딥 러닝에 이어 머신러닝에 인공지능이라니... 게다가 하나 같이 삶에 굉장히 임팩트를 남기는 분야를 만들어 낸다. OpenAI의 혁신으로 ChatGPT, Dalle2를 보면서 새로운 형태의 콘텐츠가 등장하기 시작하였고, 콘텐츠 개발 방향 또한 이전과는 전혀 달라진 방향이 되었다.  개발은 콘텐츠의 방향 다양하게 만든다.

4. 개발 분야는 다양하지만 같은 마인드를 배운다.
개발에는 셀 수 없을 정도로 다양한 개발자가 있다. 웹 개발, 앱 개발, 네트워크 개발자, os마다 sw개발자가 다 있을 거고 세부로 들어가면 더 다양한 분야가 있다.
개발을 위해 다 전부를 알 필요는 없지만, 대부분 지식을 공유하고 있는 데다가 하나의 언어만 제대로 안다면 다른 언어로 넘어가는 크게 문제 되지 않는다. 다시 말해 드론 코딩이나, IOT 코딩, 프론트단 코딩이나 분야 자체는 완전히 다르지만, 원리 자체는 크게 다르지 않다는 것이다.(원시안적 관점에서 보자면)
인터렉티브 미디어아트를 공부하려고 C++, JS를 공부했을 때나, 백엔드 웹 개발을 위해 자바, 파이썬을 배울 때나 그 언어의 특징도 다 다르고, 라이브러리 or 프레임워크가 지향하는 바가 다 다르지만 개발자적 마인드는 거의 같았다.
이러한 개발자 마인드는 이전 것에 대한 의문과 새로운 것에 대한 니즈를 만들어 새로운 것을 기획하고, 논의하고, 부딪히며 "왜?"라는 질문을 끊임없이 하게 만든다.

개발은 작은 일상에 의문을 던지게 만들고 정말 그 이름 그대로 Develop 하게 한다.

5. 아무튼 나는 스스로 내가 왜 개발을 하고 있는지, 어디로 가야 하는지 묻고 또 묻고 물어서 내가 만들고 싶은 것들을 하나하나 만들어서 가치 있는 일에 쓰고 싶다. 혹시나 내가 밟은 순서가 궁금할까 봐 몇 글자 더 적자면
개발 입문에는 웹 개발이 제일 좋은 것 같다. 데이터의 움직임을 쉽게 이해할 수 있고, 나중에 백단을 배우면 쿼리문이나 네트워크(devOps 쪽이긴 하지만), 등 개발 기본을 배우기엔 좋은 것 같다. 우선 openCV를 배우고 이를 접목한 인터렉티브 미디어아트도 생각 중인데, 하고 싶은 게 너무 많아서 큰일이다.. 드론 코딩도 재밌어 보이더라.. 나중엔 코딩하고 싶어 하는 학생들 모아서 자기가 만들고 싶은 거 같이 만들 수 있는 그런 특수학교를 만들고 싶다. 배워서 남 주자.







'글적글적 > 방향성' 카테고리의 다른 글

[창업하기전에 알아야할 PM 지식]  (1) 2023.12.06
취업 방향  (0) 2023.02.20

 

brew로 

https://gist.github.com/jungbin-kim/d0c8a41d3c72ebdace3c4d5acaa017e4

 

 

도커 설치법

도커허브에서 이미지 검색하는방법

Docker search — 

Ex) docker search centos

 

 

도커허브에서 이미지를 다운로드하는 방법

Docker pull —

Ex) docker pull centos (:lastest)

 

도커 이미지 목록 모기

Docker images 

 

도커에 태그 달기 (하드링크랑 같음)

Docker tag [이미지A: 이전 tag] [이미지A: 바꿀tag]

Docker tag centos:latest centos:ver7

 

도커 이미지 삭제

Docker rmi 이미지이름:태그

 

 

이미지 업로드 할려면

이미지 이르은 “아아디/리포지토리:태그” 형식으로 사용해야함

e) docker pull

 

@도커 실행하기 (run은 이미지 안만

Docker run —name

docker run --name hello hello-world

 

@현재 도커 상태보기 

Docker ps 

(-a) 종료된 리스트도 보여줌

 

@도커 오브젝트(이미지/컨테이너/네트워크/ 볼륨) 를 더 자세하게봄

Docker inspect 이름

 

 

<— 잘몰라도됨—> 차피 docker run으로 끝남

@docker create (-it 입출력 가능하게 하는 옵션) --name 이미지 이름

Docker create 이름 : 이름 지정해줘라/ 안하면 랜덤으로 생겨버림

@create start/stop

Docker start -ia 컨테이너이름  (create -it로 만들었으면 -ia 붙이기)

 

Ctrl + p + q 컨테이너 안에서 빠져나오기

 

 

@컨테이너 만들고 시작하기 / 이미지가 없으면 해당이미지를 다운까지 받음

Docker run (=pull + create + start)

Docker run (-it 입출력이 필요하면)— name [컨테이너이름] [이미지이름]

 

(-d) 백그라운드 

Ex) docker run -itd —name c1 centos 

 

@컨테이너 삭제

Docker rm

(-f) 강제삭제 : 실행중이어도 삭제가능

 

@컨테이너 접근 (백그라운드에 있는 경우에 효력이 발생)

Docker attach [컨테이너이름]

 

@컨테이너에서 어플리케이션 실행 - 실행하고 바로 빠져나와버림

Docker exec [컨테이너이름] [명령어]

Ex) ddocker exec c1 ip addr

 

@컨테이너내의 실행중인 프로세스 확인

Docker top [컨테이너이름]

 

@컨테이너 새이름

Docker rename 이름 새이름 

 

@컨테이너 일시정지/ 다시시작

Docker pause/unpause [컨테이너이름]

 

@컨테이너 복사 

Docker cp [option][컨테이너이름]:

 

@컨테이너 변경사항 추적

Docker diff c1

 

@컨테이너  이미지 커밋저장

Docker commit [컨테이너이름] [적당한이름]

 

@컨테이너 이미지 아카이브 파일로 저장

Docker save [옵션] [

 

@컨테이너 복원/로드

Docker load

'Network > [Cloud]' 카테고리의 다른 글

[Cloud] Telemetry  (1) 2022.12.10
[Cloud] 도커란?  (0) 2022.12.05
[Cloud] 2. 클라우드 서버 가상화 (Server virtualizations)  (1) 2022.11.26
[Cloud] 1. 클라우드 컴퓨팅이란?  (0) 2022.11.25

출처 얄팍한 코딩사전

작업공간을 나누기 위해 일반적인 가상화를 진행하게 되면

자원 낭비가 심하다.

운영체가 필요해서 작업공간 분리를 위해 집안에 집을 만드는 꼴이 됨

 

 

 

 

 

 

https://www.youtube.com/watch?v=hWPv9LMlme8

도커의 같은 경우 

1. 운영체제를 따로 만들필요가 없다 - 자원을 아낄 수 있다.

 

2. 이식성이 좋다 - 각 컨테이너끼리 독립된 동작 환경을 구성한다

 

3. 상호운용성 - On-Premise 환경뿐 아니라 구글, 아마존, IBM등 다양한 벤더의 시세틈 및 클라우드 환경을 지원한다. ->

다양한 DevOps 오픈소스 SW와 연계가 가능하다.

 

 

도커의 주요 기능

1. 이미지 생성 및 관리

- 이미지는 컨테이너를 구동하기 위한 데이터

- 도커 명령어로 이미지 관리 가능

 

2. 이미지 공유

- 이미지 저장소 (레지스트리)에서 검색, 다운로드, 업로드 가능

- git으로 이미지 버전관리 가능

 

3. 컨테이너 동작

- 컨테이너 단위의 서버를 구동

- 운영체제 없이 구동

- 속도와 효율이 좋음

 

도커 동작을 위하여 사용되는 기술

1. 네임 스페이스

- 컨테이너라는 독립된 환경을 만들고

네임스페이스 설명
PID -PID와 프로세스를 분리
- 네임스페이스가 서로 다른 프로세스는 서로 접근 불가
Network - Namespace 별로 네트워크 장치, IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 사용
UID - Namespace에 따라 독립적인 UID, GID 사용
Mount - Namespace에 따라 독립적인 마운트 포인트 사용

UTS - Namespace에 따라 독립적인 호스트네임 사용
IPC - Namespace에 따라 독립적인 IPC 오브젝트 사용

 

2. 그룹제어

- 도커의 각 컨테이너는 호스트의 리소스를 공유하여 사용된다. 이에 따라 자원이 불균형하게 할당되거나, 필요한 자원을 할당받지 못할 경우

Cgroup은 프로세스 또는 쓰레드를 그룹화하여 관리함.

이를 통해서 서로 다른 컨테이너에 영향을 막아주는 역할도 가능

 

3. 가상 브릿지와 가상 NIC (랜카드)

- 도커에서 생성한 컨테이너는 각각 가상의 NIC(Network Interface Card) 가 할당.

컨테이너의 네트워크를 Brigde로 기본설정을 할 경우 NIC는 docker0라는 가상 브릿지에 연결되어 컨테이너 끼리, 또는 호스트를 통해 외부 네트워크로 연결.

위의 호스트의 eth0는 물리적은 NIC를 말하며, docker0는 eth0와 연결된 가상의 브릿지 네트워크.

veth* (Virtual Ethernet은 컨테이너 별로 생성된 호스트의 가상의 NIC이며, 이는 컨테이너 eth0와 연결굄

 

4. 계층 파일 시스템

- 도커에서 기존 이미지에 추가작업을 하는 경우 변경된 부분만 복제 (COW방식 : Copy on Write)

- 도커의 이미지에는 운영체제와 미들웨어를 포함하고 있어서 생성할때 마다 기존 방식이라면 복사할때마다 자원 낭비가 발생하기 때문에  

그래서 변경된 것만 복제

 

- 도커 이미지 관리에 사용되는 파일 시스템 또는 라이브러리

Btrfs(B-Tree File System)

AUFS(Advanced multi-layered Unification File System)

Device Mappaer

OverlaysFS

 

리눅스 시스템의 부팅 과정

 

바이오스 단계

  • PC의 전원 스위치를 켜서 부팅하면 제일 먼저 바이오스(BIOS, basic input/output system)가 동작
  • 바이오스는 PC에 장착된 기본적인 하드웨어(키보드, 디스크 등)의 상태를 확인한 후 부팅 장치를 선택하여 부팅 디스크의 첫 섹터에서 512바이트를 로딩
  • 이 512바이트가 마스터 부트 레코드(master boot record, MBR): 2차 부팅 프로그램(부트 로더)의 위치 저장

 

 

< systemd 서비스 >

init 프로세스와 런레벨 (중요)

 

  • init 프로세스에서 사용하던 런레벨(Run Level)의 개념에 대한 이해 필요
  • init는 시스템의 단계를 일곱 개로 정의하여 구분하고 각 단계에 따라 셸 스크립트를 실행하는데, 이 단계들을 런레벨이라고 함

 

systemd 유닛 (데몬 = 서비스)

  •  systemd는 전체 시스템을 시작하고 관리하는 데 유닛(units)이라 부르는 구성 요소를 사용
  •  systemd는 관리 대상의 이름을 ‘서비스 이름.유닛 종류’의 형태로 관리 
  •  각 유닛은 같은 이름과 종류로 구성된 설정 파일과 동일한 이름을 사용

 

systemd의 기본 개념

systemd는 Centos7부터 본격적으로 기존의init 스크립트를 대체하기 시작

거의 대부분의 서비스가systemd기반 변경

systemd는 init 방식에 비해 가진 장점

  • •소켓 기반으로 동작하여inetd 와 호환성을 유지한다.
  • •셸과 독립적으로 부팅이 가능하다.
  • •마운트 제어가 가능하다.
  • •fsck 제어가 가능하다.
  • •시스템 상태에 대한 스냅숏을 유지한다.
  • •SELinux와 통합이 가능하다.
  • •서비스에 시그널을 전달할 수 있다.
  • •셧다운 전에 사용자 세션의 안전한 종료가 가능하다.

맥북의 경우

https://devlog.jwgo.kr/2019/07/03/how-do-i-check-if-a-service-is-running-in-mac/

 

 

 

'P-Language > [Linux]' 카테고리의 다른 글

[Linux] 프로세스의 개념  (0) 2022.12.01
[Linux] 특수 접근 권한  (0) 2022.12.01

프로세스: 현재 시스템에서 실행 중인 프로그램

프로세스의 부모-자식 관계

  • 프로세스는 부모-자식 관계를 가지고 있음
  • 필요에 따라 부모 프로세스(parent process)는 자식 프로세스(child process)를 생성하고, 자식 프로세스는 또 다른 자식 프로세스 생성 가능
  • 부팅할 때 스케줄러가 실행한 프로세스인systemd와 kthreadd프로세스를 제외하면 모든 프로세스는 부모 프로세스를 가지고 있음
  • 자식 프로세스는 할 일이 끝나면 부모 프로세스에 결과를 돌려주고 종료

 

프로세스의 번호 : 각 프로세스는 고유한 번호(PID)

 

프로세스의 종류

  • 데몬 프로세스(HTTP, SSH)
    • 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행
  • 고아 프로세스(systemd - 보통 1번 프로세스)
    • 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료된 자식 프로세스는 고아(orphan)프로세스
    • 1번 프로세스가 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스의 작업 종료 지원
  • 좀비 프로세스
    • 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우
    • 좀비 프로세스는 프로세스 목록에defunct프로세스라고 나오기도함
    • 좀비 프로세스가 증가하면 프로세스 테이블의 용량이 부족해서 일반 프로세스가 실행되지 않을 수도 있음

 

SID 

UUID : 장치의 고유번호

 

 

프로세스 목록 보기

현재 실행 중인 프로세스의 목록을 보는 명령: ps

  • 유닉스 (SVR4)옵션 : 묶어서 사용할 수 있고, 붙임표로 시작한다(예 : -ef).
  • BSD 옵션 : 묶어서 사용할 수 있고, 붙임표로 시작하지 않는다(예 : aux).
  • GNU 옵션 : 붙임표 두 개로 시작한다(예 : --pid).

 

포그라운드 작업

  • 포그라운드 프로세스: 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 포그라운드 방식으로 처리되는 프로세스
  • 이를 작업 제어에서는 포그라운드 작업이라고 함
  •  
sleep 100 -> 포그라운드 작업 / sleep 명령이 끝날 때까지 기다려야 한다.

백그라운드 작업

  • 백그라운드 프로세스: 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속할 수 있음
  • 작업 제어에서는 백그라운드 작업이라고 함
sleep 100 & -> 백그라운드 작업 
바로프롬프트 나옴			/ 프롬프트가 바로 나와 다른 명령을 실행할 수 있다.

다른 작업하는 동안 그 작업을 연산중 (병렬처리와 비슷)
이전 백그라운드 작업 결과가 언제나올지 모르니 리다이렉트 해주는게 좋음

 

<포그라운드, 백그라운드 프로세스와 작업 제어>

작업 제어

  • 작업 제어는 작업 전환과 작업 일시 중지, 작업 종료를 의미
  • 작업 전환: 포그라운드 작업-> 백그라운드 작업  // 백그라운드 작업->포그라운드 작업으로 전환
  • 작업 일시 중지: 작업을 잠시 중단
  • 작업 종료: 프로세스를 종료하는 것처럼 작업을 종료

 

@ jobs

- 기능 : 백그라운드 작업을 모두 보여줌, 특정 작업 번호를 지정하면 해당 작업의 정보만 보여줌

- 형식 : jobs %작업번호

 

ctrl + c 강제종료 인터럽트

ctrl + d 정상종료

ctrl + z 또는 stop %작업 번호 포그라운드 작업을 일시 중지함

bg %작업 번호 : 백그라운드로 작업시작

fg %작업 번호 : 포그라운드로 작업시작

 

 

작업 예약 

특정한 시간에 작업을 수행하도록 예약할 수 있는 두 가지 방법

  • 정해진 시간에 한 번만 수행 at
  • 정해진 시간에 반복 수행 crontab

at [옵션][시간]

  • - l 실행대기 중 명령의 전체 목록을 출력 (atq 명령과 동일)
  • -r 작업번호
  • -m 메일로알려줌
  • -f 실행할 명령을 파일로 지정

crontab [-u USERID][옵션][파일명]

  •  -e 로그인한 사용자로 예약.
  • -l crontab 파일의 목록을 출력한다.
  • -r crontab 파일을 삭제한다.

'P-Language > [Linux]' 카테고리의 다른 글

[Linux] 리눅스 시스템의 부팅  (0) 2022.12.01
[Linux] 특수 접근 권한  (0) 2022.12.01

 

특수 접근 권한

  • 접근 권한은 원래 4자리
  • 생략된 맨 앞자리는 특수 접근 권한 의미
  • 맨 앞자리 숫자가 0이면 일반적인 접근 권한이지만 이 숫자가 1, 2, 4이면 특수 접근 권한이 설정

 

  • SetUID : 맨 앞자리가 4
  • SetGID : 맨 앞자리가 2
  • 스티키 비트(sticky bit) : 맨 앞자리가 1

SetUID : 해당 프로그램을 실행하는 사용자가 프로그램을 실행하는 동안 임시로 파일의 소유자의 권한으로 프로그램을 수행

 

SetGID : 해당 프로그램을 실행하는 사용자가 프로그램을 실행하는 동안 임시로 파일의 소속 그룹의 권한으로 프로그램을 수행

 

777 ->  rwx/rwx/rwx

-> setuid : rws/rwx/rwx (소유자쪽에 s라 표시)

-> setgid : rwx/rws/rwx  (그룹쪽에 s라 표시)

 

특수 접근 권한 왜 필요해?

 

root 계정이 아니라 / 다른 계정일 경우 rwx/- /- 는 실행할 수 없다.

하지만 Setuid rws/-/-  인 경우 임시로 실행가능

 

설정하는 방법

<기호방식> (심볼릭방식)

setuid  : chmod u+s 파일이름

setgid : chmod g+s 파일이름

 

<숫자모드> (8진수방식)

setuid  : chmod 4755 파일이름

setgid : chmod 2755 파일이름

 

setuid/setgid는 보안에 취약하다 파일관리가 필요하다 / 메인관리자가 아닌 일반 

 

 

 

sticky bit(파일에 설정 못함, 디렉토리에만 설정가능) : 해당 특수 권한이 설정된 디렉토리 내에 생성된 파일들은 소유자와 root외 다른 사용자는 삭제하지 못한다.

디렉토리에 쓰기 권한이 있는 경우 디렉토리에서 파일을 만들고 삭제하고 수정할 수 있다.

: 게시판이라 생각하면 쉬움 / A가 쓴글을 B가 못지움

 

setuid 파일 찾기 : find / -perm -4000 

setgid 파일 찾기 : find / -perm -2000

sticky bit 파일 찾기 : find / -perm -1000

setuid and setguid 파일 찾기 : find / \( -perm -4000 -o -perm -2000 \) -ls

 

 

'P-Language > [Linux]' 카테고리의 다른 글

[Linux] 리눅스 시스템의 부팅  (0) 2022.12.01
[Linux] 프로세스의 개념  (0) 2022.12.01

< 네트워크란 ? > 

연결하는것

 

LAN (Local Area Network)

 - 근거리 (사무실, 강의실 내)

 - 초기 비용이 높지만, 유지보수 비용 낮음

 - 네트워크 관리자가 관리를 담당

 - 스위치, 허브 등의 장비

 

 

WAN (Wide Area Network)

 - 원거리 (미국 - 한국)

 - 원거리에서 LAN-LAN

 - 초기비용은 낮으나, 지속적 유지비 발생

 - Internet Service Provider 가 관리를 담당 (kt)

 - Router

 

인터넷

 - 전세계 LAN과 WAN이 함께 연결된 거대한 네트워크

 

- 통신방식 

 유니케스트 

  : 서버와 클라이언트간 1:1 통신

 

브로드 캐스트

 :  1 서버 다수의 클라이언트

 

멀티 캐스트

 : 데이터를 전송하려는 특정 그룹에게 데이터를 전송하는 통신 방식

 

 

< IP 주소 (논리적 주소) 변경가능  4바이트>

IPv4 주소 : 주로 이걸 씀

IPv6 차세대 ip 주소

 

물리적 주소 vs 논리적 주소

 

서브넷마스크 - 2진법

네트워크주소 호스트주소 

 

사설 IP 대역대 :

- Class A 규모 : 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8)

- Class B 규모 : 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12)

- Class C 규모 : 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16)

 

공인 ip 대역대 : 인터넷 공인망에서는 ip 대역

사설 ip 대역대 : 사설망 내부에서 쓰는 ip 대역

 

공인 ip와 사설ip를 전환하여 인터넷을 가능케 하는 기술   -> NAT

 

 

게이트웨이 :

- 네트워크의 출입문

- 다른 네트워크라면 게이트웨이 주소로 보내야함

 

< MAC주소 (물리적 주소) : 장치 고유의 주소 > 

 

 ex) 00-05-C5-F0-53-FE (6바이트)

 - 근거리 통신할때는 무조건 MAC주소로 통신 함

 - 기계는 mac 주소를 알아야 통신가능

 - 사람은 ip 주소를 알아야 통신가능

 

ip 주소를 이용해서 mac 을 알아오는 프로토콜 : arp <-> rarp

 

- 근거리 통신을 하기 위해선 mac 주소를 알아야함

- 원거리 통신을 하기 위해선 ip 주소를 알아야함 

 

 

 

 

< DNS : Domain Name Service >

naver.com  = 223.130.195.200

인터넷 주소창에 223.130.195.200 넣으면 네이버로 감

< terminal / cmd >

nslookup  로 dns 확인가능

nslookup naver.com

netstat -a : 사용중인 포트 정보

nslookup : dns 서버 정보

arp -a : arp 캐시 보는 명령어 / arp 테이블

Ctrl + c: 강제종료 (작업하던거 날라감)

C + d : 정상종료

C + z : 일시정지 (가끔 일부명령어로 사용)

Hostname : 네트워크상에서 내컴터 이름

tracert / netstat -r (중요) 라우팅 정보를 알려줌 / 네트워크 경로를 확인 경유지들의 ip를 확인 가능

 

<DHCP service>

우리 컴퓨터의 네트워크를 자동으로 설정해주는 서비스 

 

포트 통신 프로토콜 : TCP / UDP

TCP : 신뢰성있는 통신이 필요 / 상대방과 세션을 연결 

UDP : 간단한 통신이나 빠른 대용량 통신 (동영상 재생) DNS, DHCP / 세션은 맺질 않음

 

 

 

 

 

라우팅테이블 : 통신하기위해선 목적지로 갈수 있는 경로가 적혀있어야 한다.

-> 네트워크 엔지니어, 인프라 엔지니어의 역할

 

매트릭 : 우선순위  윈도우 매트릭 높을수록 우선높은우선 

 

 

 

[학습 목표]

가상화 기술 개념

가상화 기술의 종류와 개념

컨테이너 기술에 대한 개념

 

 

<Server virtualizations>

 

Container Technology

- 18년도부터 컨테이너 개념이 들어오기 시작 

앱을 돌릴때 필요한 라이브러리, 어플리케이션 자체를 이미지와해서 만들것을 name space와 cgroup을 통해서 시작하는것을 컨테이너라고 생각하면됨

 

 

도커가 나오면서 컨테이너가 널리 사용됨

특히 구글에서 컨테이너 관리로 썻던 쿠버네티스가 그런 계기가있음

실행에 필요한것들을 이미지에 다 담고 (이미지는 어디든 갈 수 있음) 도커에 넣고 실행하면 컨테이너가 생성

컨테이너 안에 들어가면 로컬에서 쓰던 기분 (어? 쉘인가?)

도커 이미지 : 실행에 필요한것을 다 담음

컨테이너 : 그 이미지를 분리시킨다음 runC 상태로 돌아가서 그 안에 있던 (이미지) 에플리케이션이 독립된 단위로 실행됨

 

 

VM : 은 하이퍼바이져가 들어가 있음  (하이퍼바이저 : 가상화를 해주는 장치 또는 칩)

Container : VM에 필요하던 오버헤드가 없음 

 

 

 

이것만 알아둬라

Container 는 Nacespace/Cgroup의 집합 그럼 나는 어떻게 네트워크를 그 안에서 조절할 것이냐 ? 또는 안에서 조절할 부분 or 밖에서 조절할 부분을 구분할 것인가?

 

 

 

가상화 기술이란

서버, 스토리지, 네트워크 등의 IT 리소스의 물리적인 성질이나 경계를 가리고, 논리적인 리소스

이용 단위로 변환해서 제공하는 기술

 

목적

  • 인프라를 단순화 시킬 수 있다. (사용자 측면)
  • 유휴장비의활용률을높일수있다.(불필요한장비증설방지)
  • 서비스 장애에 대한 신속한 대응이 가능하다.
  • TCO(Total Cost of Ownership)를 절감할 수 있다.
  • 신속한 확장이 가능하다. (Scale Out)

종류

  • 서버가상화
  • 스토리지 가상화
  • 네트워크 가상화

 

 

 

• 가상화의 목적


Isolation from other tenant(세입자 - 여러개의 자원을 하나에서 쓰는 형태)
because basically it’s shared resource.
try to be safe from other noisy neighborhood

 

Application of virtualization technology

분류
설명
애플리케이션 가상화
특징
사용자의 PC에 개별적으로 설치되어 있는 애플리케이션을 가상화를 통해 제공
사용자는 필요한 애플리케이션을 자신의 PC에서 매번 설치하지 않고도 즉시 사용 가능
역할
클라우드의 SaaS(Software as a Service) 구현의 기반 기술 제공
데스크톱 가상화
특징
서버 측 데스크톱 가상화는 사용자의 데스크톱에서 Windows Vista, Windows 7 등의 이기종의 또 다 른 데스크톱을 가상으로 소유가 가능하게 함
클라이언트 측 데스크톱 가상화는 PC 안의 이기종의 가상 데스크톱을 운영 가능 하도록 함 데스크톱 가상화를 통한 개인 작업 공간과 회사 작업 공간의 분리가 가능해 짐
역할
클라우드의 DaaS(Desktop as a Service) 구현의 기반 기술 제공
서버 가상화
특징
데이터센터 내의 수십 대의 물리적인 서버 워크로드들을 몇 대의 가상 서버로 통합 집적 (Consolidation)하여 물리적인 상면 비용, 관리적인 측면의 비용, Green IT 측면의 전력량을 포함한 서버 자원 활용도를 증대시킬 수 있음
역할
클라우드의 IaaS(Infrastructure as a Service) 구현의 기반 기술 제공
스토리지 가상화
특징
필요로 하는 스토리지 공간 대신 Thin-Provisioning이라는 기술을 통해 최소 공간만을 가상으로 할당 하여 서비스 구현이 가능하도록 함
이기종의 스토리지 시스템 통합에 사용할 수 있는 환경을 제공
역할
클라우드의 IaaS(Infrastructure as a Service) 구현의 기반 기술 제공
네트워크 가상화
특징
하드웨어 어플라이언스 형태로 존재해 왔던 L2, L3, L7 스위치, 네트워크 방화벽, 보안 장비들을 가상 머신으로 구현하고, 네트위킹 자원들이 하나의 공유된 물리적인 환경에서도 내부적으로는 가상화를 통해 분리되어 동작하게 함
역할
멀티 테넌시(Multi-Tenancy)를 갖춘 IaaS 구현의 기반 기술 제공

 

 

서버가상화

시스템 자원을 공유(pool & share)함으로써 전체적인 시스템의 활용도를 증대시킬 수 있고, 자동화 기술과 함께 적용함으로써 시스템 사용자의 서비스 수준을 보다 향상시켜 줄 수 있다.

하이퍼바이저 : 가상화를 해주는 장치 또는 칩

 


<서버 가상화 기술>

 

하이퍼바이저(Hypervisor)

  • 프로세서나 메모리와 같은 다양한 컴퓨터 자원에 서로 다른 각종 운영 체제(OS)의 접근 방법을 통제하는 얇은 계층의 소프트웨어
  • 다수의 OS를 하나의 컴퓨터 시스템에서 가동할 수 있게 하는 소프트웨어로 중앙 처리 장치(CPU)OS 사이에 일종의 미들웨어로사용 됨
  • 하나의 컴퓨터에서 서로 다른OS를 사용하는 가상 컴퓨터를 만들 수 있는 효과적인 가상화엔진
Bare-Metal(native) Hypervisor
Hosted Hypervisor
  • Host OS가 필요없다.
  • Host OS가 없어 오버헤드가 적다.
  • 각 VM별 관리가 유연하다.
  • 자체적인 관리 기능이 없어 별도의 관리 솔루션이 필요하다.
  • Host OS가 필요하다.(리눅스, 윈도우 등)
  • Host OS 상에 가상 머신을 배치하므로 오버헤드
  • 가 발생한다.
  • VM 생성이 간단하다.
  • 다양한 관리 솔루션이 있다.

 

 

 

호스트 OS 가상화 vs 하이퍼바이저 가상화

 

 

 

가상화유형

 전 가상화 (full-virtualization)

시스템 전체를 완전히 가상화 하여 시스템의 Bios부터 CPU, Memory, I/O 등을 완전히 에뮬레이션 하여 가상화 하는 방법

장점
단점
하드웨어를 완전히 가상화 하기 때문에 Guest OS에 아무런 수정없이 Windows, Linux까지 다양 한 OS를 이용할 수 있다.
가상머신의 유지보수가 쉽다.
전 가상화를 실현하기 위해 CPU의 VT(Virtualization Technology)를 이용하므로 성 능의 저하가 발생한다는 단점이 있다.

 

 

– 반 가상화 (para-virtualization)

하드웨어 전체를 가상화 하는 대신에 가상화가 적용된 리눅스 커널을 시스템 부팅 시 적용하는 것으로 모든 장치를 가상화 하는 것은 아님

 

장점
단점
가상머신이 직접 하드웨어를 제어하는 것이 아니 라 하이퍼바이저에게 의뢰, 하이퍼바이저가 제어 를 하기에 높은 성능을 유지할 수 있다.
반 가상화를 실현하기 위해서는 가상머신 OS의 커널 일부분을 수정해야 한다.
가상머신 유지보수가 어렵다. (가상머신 비밀번 호 분실 시 복구 불가능)

 

요즘에는 반가상화 전가상화 사이에 차이가 크게 사라짐 

 

KVM

  • –  Kernel-based Virtual Machine의 약자
  • –  http://www.linux-kvm.org
  • –  오픈 소스 소프트웨어
  • –  x86 서버 기반의 전 가상화 솔루션 (Using Intel VT or AMD-V)
  • –  게스트 운영체제의 수정이 필요 없음
  • –  Using QEMU
    • QEMU 는 가상화 에뮬레이터
    • 게스트 OSI/OQEMU를 통해 제공한다.
  • –  VM이 새로운 프로세스와 QEMU 프로세스를 이용하여 실행된다는 단점이 있음 (오버헤드 발생)
  • –  ESX Server, Xen Server 등과 같이 전용 하이퍼바이저가 아닌 Linux 자체를 호스트 OS로 이용
  • –  RHEV (RedHat Enterprise Virtualization) 솔루션의 기반

KVM 아키텍처

 

 

Xen

서버 가상화 기술

  • –  캠브리지 대학교의 연구 프로젝트로 개발
  • –  http://www.xen.org
  • –  오픈 소스 소프트웨어
  • –  x86 서버 기반의 반 가상화 솔루션 (Paravirtualizing VMM-Virtual Machine Monitor)
  • –  게스트 운영체제의 수정이 필요함
  • –  전 가상화에 비해 처리에 대한 오버헤드가 적다.

하드웨어 기술(Intel VT or AMD-V)이 발전함에 따라 성능 차이가 줄어들고 있음

  • –  x86 서버 기반의 전 가상화 솔루션(Intel VT or AMD-V)에서는 HVM(Hardware Virtual Machine)을 구현할 수 있다.
    • 반가상화/전가상화모두구현가능
  • –  Citrix Xen Server 솔루션의 기반

Xen 아키텍처

'Network > [Cloud]' 카테고리의 다른 글

[Cloud] Telemetry  (1) 2022.12.10
[Cloud] 도커 기본 명령어  (0) 2022.12.05
[Cloud] 도커란?  (0) 2022.12.05
[Cloud] 1. 클라우드 컴퓨팅이란?  (0) 2022.11.25

[학습 목표]

Cloud Computing 개념

서비스와 마이크로 서비스의 개념과 차이점

IaaS, PaaS, Saas 특징

 

 

 

 

초록색이 많을 수 록 돈이 많이 듬 -> 그래서 최대한 돈을 아낄려고 하이브리드 형태로 사용

 

# On-Premises / (레거시) 물리적 - 가상화 안됨

- 규모가 있는 기업에서 사용하는 방식

- 자체적으로 데이터센터와 서버실 구축하여 운영

 

# 퍼블릭 클라우드 (AWS) / 클라우드 (가상화)

- 초기투자 필요없음

- 인터넷을 통해 불특정 다수에게 돈주고 빌려줌

 

# 프라이빗 클라우드 

-특정 대상을 지정해서 서비스를 제공하는 클라우드 서비스

- 단일 기업, 계열사 등에만 지원

 

 

AWS와 같은 Cloud Service Provider 업체에서는 다음과 같은 서비스 유형을 제공함

 

# IaaS

- Infrastructure as a Service

- Server, OS, Network, Storage 등을 제공

- 필요로 하는 자원의 규모와 성능 등에 의해 비용 발생

 

# PaaS

- Platform as a Service

- 소프트웨어 개발 및 운영 환경을 제공

- 인프라에 대한 관리 부담을 질여 개발에 집중하도록 함

 

# SaaS

- Software as a Service

- 클라우드 벤더가 제공하는 시스템 및 스프트웨어를 직접 사용 (한컴 독스)

- 인프라, 소프트웨어 구축 시간이 없거나 매우 짧음

 

클라우드 서비스가 좋은 이유

# 초기 투자 없음 

  장비를 빌려쓰기 때문에 장비 구매, 설치 불 필요

 

# 트래픽 변동이 가능

  요구량에 조절이 가능해서 트래픽 예측이 힘들때 좋음 

 

# 복구가 빠름

  무 중단 또는 재해 복구가 빠름

  이중화, 백업 구성이 가능

 

# 빅데이터 처리에 유용

   많은 데이터를 직접 가지고 있을 필요없음

 

# 웹/모바일앱 등 백엔드로 이용가능

  백엔드를 클라우드를 이용하여 구축가능

  

 

 

 

 

서비스란 결국 웹, 어플리케이션, 디비 서버를 연결해서 사용자가 사용할 수 있게 해주는걸 의미함

 

 

[Micro Service?]

쉽게 말해 점점 작게 세분화

 

 

-

 

클라우드 컴퓨팅이 뭐냐?

: 어떤 서비스를 해준다? -> 클라우드다

 

 

IT service 보다는 Product 라는 말이 맞음

-> 하나의 제품으로 보는게 맞다 : 제품은 어떤 목적성을 띔, 필요한 니즈를 채움

 

Engineering?

일정 생산 목적에 따라 유기적인 체계로 구성하는 활동  -> 클라우드 제품을 설명하기 위해 필요한 개념

 

Technology?

way of saving cost or creating product -> 기술과 이윤!

 

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

 

 

 

 

 

[클라우드 컴퓨팅]

유틸리티 컴퓨팅 아키텍처의 새로운 패러다임

소수의 컴퓨팅 자원을 다수의 컴퓨팅 자원처럼 사용

사용자 중심의 아키텍처

클라우드 컴퓨팅 아키텍처는 그리드 컴퓨팅 기반(유틸리티 컴퓨팅과의 차이점)

 

[그리드 컴퓨팅]

분산 컴퓨팅 아키텍처의 하나

다수의 컴퓨팅 자원을 하나의 컴퓨팅 자원처럼 사용

컴퓨팅 중심의 아키텍처

분산 파일 시스템/ 스토리지는 오히려 그리드 컴퓨팅 아키텍처

그리드 컴퓨팅 아키텔처는 서비스 아키텍처가 아님

표준화에 실패 -> 클라우드 컴퓨팅에 뺏김

 

 

 

- 사용하고 있는 서비스는 열어보면 이렇게 다양한 분산 시스템을 필요로 함 (내부에 있음) 

 

 

 

 

아키텍처 개념 클라우드 컴퓨팅과의 비교
Grid Computing 많은 IT 자원을 필요로 하는 작업을 위해 인터넷 상의 분산된 다양한 자원을 공유해 가상의 슈퍼컴퓨터처럼 활용하는 방식 그리드 컴퓨팅이 인터넷 상의 모든 컴퓨팅 자원을 통합해 사용하는데 반해,

클라우드 컴퓨팅은 서비스 제공 사업자의 사유 서버 네트워크를 빌려서 활용

Utility Computing
서버, 스토리지 등 컴퓨팅 자원을 보유하지 않은 채 가스나 전기처럼 사용량에 따라 과금되는 방식 클라우드 컴퓨팅의 과금 방식과 동일
SBC :
Server Based Computing
서버에 응용 소프트웨어와 데이터를 저장해 두고 필요할 때마다 접속해서 쓰는 방식으로 모든 작업을 서버가 처리 클라우드 컴퓨팅은 서비스 제공자의 가상화된 서버를 이용하고, SBC는 특정 기업내 서버를 활용한다는 차원에서 구분되나, 서버 기반의 컴퓨팅이 발전하면서 그 구반이 모호해 짐
Network Computing 서버 기반의 컴퓨팅처럼 응용 소프트 웨어를 서버에 두지만, 작동은 이용자 컴퓨터의 자원을 이용해 수행하는 방식 클라우드 컴퓨팅은 이용자 컴퓨터가 아니라 클라우드 상의 IT 자원을 이용하는 방식

 

 

 

AWS가 처음 나올때 아마존에서 장비 사용율을 보니 5%로도 안됨 그래서 서버를 빌려주기 시작하면서 나옴

 

 

 

[클라우드 컴퓨팅이란?]

- Cloud Computing as Utility Computing 

@유틸리티 컴퓨팅에서 유래

@ 기본 운영방식

   - 가상화로 구성되어 있다. <서버 가상화, 스토리지 가상화>

  -  전기 사용요금과 같이 사용한 만큼 요금을 내라 

 

@ HP, IBM, SUN 등 하드웨어 제조 회사가 유틸리티 컴퓨팅 주도 / 반면 클라우드 컴퓨팅은 AMS,Google, MS 클라우드 밴더라고 부름

@ IaaS 중심의 클라우드 컴퓨팅

  - 미래에는 경쟁력이 없다 (가격으로 승부하기 때문)

  - 한국적인 클라우드 컴퓨팅은 없다

  - 보안 문제와 응답 시간만 같다면 누구나 값 싼 서비스를 선택하게 된다.

@ 항상 Global Computation을 생각하자

 

 

--Only Cloud Computing

@ 기업에서 사용하는 컴퓨팅 자원을 표준화 해 그 자원을 가상 환경으로 제공하는 방식

@ Iaas,Paas, SaaS가 기본임

@ 원가가 저렴해야 한다

 - 밴더에 독립적이어야 한다

 - 표준화가 되어 있어야 한다

@ 자동화가 되어 있어야 함

 

---Cloud Computing is.

@ IT as a Service 

 -Infrastructure as a Service 

 - Platform as a Service

 - Software as a Service

 

@ Cloud Computing is not virtualization.

@ Dynamic set of Connected Computers

 - Computers are PC, Server, Mainframe, Sensor, Phone...

 - Connect is a internet environment

 - Dynamic is on-demand or at runtime or near real-time

 - Set is cluster. is not grid

 

@ have to be automated and stardized (자동화 및 표준화!!)

 

 

 

대표적 회사 / MS는 다 가지고 있음

 

 

 

 

'Network > [Cloud]' 카테고리의 다른 글

[Cloud] Telemetry  (1) 2022.12.10
[Cloud] 도커 기본 명령어  (0) 2022.12.05
[Cloud] 도커란?  (0) 2022.12.05
[Cloud] 2. 클라우드 서버 가상화 (Server virtualizations)  (1) 2022.11.26

미안합니다 SI 개발자 형님들.. 형님들은 죄가 없겠지요
PM님들... SI개발자님들 고객사가 이렇게 요구한다면 제발 사전에 말좀해주세요.. 이거 UX 구린거알잖아요!

 

1. 주소 검색을 위해 시 구 입력해야할때

--시 --구/동 하나씩 다 입력해야 할 때.

SI 웹 개발자 가는 주소를 카카오 주소 api로 할 수 있게 통일해 주시지요... 

https://postcode.map.daum.net/guide

 

 

2. 번호 입력창 구분되어 있을 때

010 1234 5678 입력했는데

010 1234 // ---- 입력이 안되어있어서 마우스 한번 더 눌러야하는 그 기분... 음 나만 예민한가?

 

 

3. 인증번호 입력 중 페이지 리프레쉬....

부모님 가끔씩 인증번호 놓치는 경우 있는데

문자메시지함 들어갔다가 번호 외우고 웹페이지 다시 들어왔는데 페이지 리프레쉬되는 경우 허다함

 

3-1. 인터넷등기소 같은경우 

열심히 작성칸 다 채우고 결제창 눌렀는데 

결제를 위한 보안프로그램 설치하라고 갑자기 리다이렉트 됨 물론 작성내용 다 사라짐 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 

 

4. 유효성/자격 검사는 미리 좀 하고, 결과를 알려주면 안됩니꺼?

 기껏 신청서 입력 다 했는데 

 유효성/자격이 안된다고 그제야 알려주다니..

예시 농협 콕뱅크 (농협, 수협 , 정부 어플 - 노답)
본인인증 다 끝내고 - 관련 정보 다적고 신청서 보내니 - 유심관리앱 깔아라?
애초에 유심관리앱을 깔게 유도하면 되잖아? 이게 어려워?


5. 동의서 팩스로 보내야 할 때

심지어 hwp파일만 올려둔 경우

클라우드 서비스로 해주면 정말 감사하겠습니다. 과학창의재단을 이렇게 하던데 감동 받음!

 

6. 색에 무관하게 알 수 있게 좀..

https://www.youtube.com/watch?v=VkKda38UDJ0

 



5. 은근히 선택옵션 광고 끼워넣기
필수, 선택 약관에 
필수만 선택 옵션을 좀 넣어주세요

'글적글적 > 바꿔야할부분' 카테고리의 다른 글

저출산대책  (0) 2024.06.07
팩스를 도대체 왜 아직까지 쓰는건가?  (0) 2023.02.13

Network Attached Storage

말 그대로 네트워크에 연결된 저장장치이다

다시 말해 집에 있는 저장장치가 인터넷만 연결되어있으면 어디서나 언제나 내 PC와 연결된 것 같은효과!

 

그래서 뭐?

 

우선 나의 NAS  용도를 적어본다

 

- 미디어 저장 (usb or SD 카드만 꽂으면 알아서 백업) - 이 기능 있는 외장하드 찾을려고 진짜 개고생했는데 (Mypassport sdcard) -  1TB짜리가 무려 40만원!! 나스는 공짜.... 

- 미디어 원격저장(FTP 통신으로 카메라 사진/영상을 인터넷만 있으면 바로 나스 폴더에(지정한 디렉토리)에 바로 꽂아줌)

- 미디어 다운로드 (인터넷만 연결되어있으면 어디서든 다운로드 가능) + 영상컷편집기(루마퓨전)에서 나스에 있는 영상 바로 찾아줌!!

- 미디어 재상 (nPlayer등 어플로 나스에 연결하면 끝 - iCloud 및 패드 용량아끼기) 

- Mediaserver - 집 TV or 빔프 에서 외장하드 연결없이 바로 재생 (칼세이건 코스모스 몰아보기 최고)

- DB 연결 - Docker container (Oracle) 또는 Maria DB 생성 가능 - 

- webstation - 웹연결 - 웹개발하시는분들 포폴용으로 추천

- Mac Timemachine - Mac 백업용

- MailStation - 메일 막힌곳에서 메일보내기 가능 (+ 파일 바로첨부 가능 / 학교에서 일 할때 진짜 애용하던 기능)

- Surveillance Station - 알리발 2만원짜리 cctv를 20만원짜리로 만들어줌 (시놀로지는 ONVIF 2개나 공짜로 붙일 수 있음)

- HomeAssistant - IOT 끝판왕!!  그냥 막 입문 ->  zigbee 허브(ST) -> HA서버로 한번에 관리

(자동 루틴 한번 맛보면 절대 못 빠져나감) 문열고 나가면 알아서 엘레베이터 잡아줌... 요즘 프리미엄아파트 이거 장사하던데

 

 

 

영상찍는걸 좋아하다보니 4k 60p 으로 찍으면 하루에 100GB씩 막 나오니 기존 물리적 외장하드로는 관리가 너무 힘들었다

처음엔 그냥 네이버/애플/ 구글드라이브 정액제 끊을까 하다가 2년정도 따져봤을때 나스사는게 이득인 것 같아서

시놀로지 나스로 입문했는데 진짜 신세계를 경험했다. 처음 세팅할때 아무것도 몰라서 유튜브 구글 뒤져가면서 포트포워딩이 뭔지 smb, webDav, https 등 하나씩 알아가는 재미도 함께 느낄 수 있다... 알고보니 다 상식인 내용들인데 덕분에 알게됐지

 

개인적으로 네이버/ 구글드라이브/ 애플 icloud에 매달 돈 주느니 (필자도 g-suit, icloud 유료고객이였음)

개인용 서버 구축이 돈도 아끼고 훨씬 커스터마이징 하기 좋다!

 

기회가 된다면 NAS 편으로 내가 아는 미천한 지식으로 나의 세팅과정을 천천히 올려봐야겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://limkydev.tistory.com/168

'Network > [IOT]' 카테고리의 다른 글

맥북에서 IP주소 확인 및 게이트웨이  (2) 2023.12.05
[IOT] "Siri" 대신 "ChatGPT" 호출하기  (0) 2023.03.05
[Network] 네트워크 개념  (0) 2022.11.28

# 데이터 정제, 분석, 시각화
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc     # 한글깨짐 방지 처리 위한 모듈 임포트

# matplotlib 한글깨짐 방지
font_path = r"C:\Users\tjoeun\AppData\Local\Microsoft\Windows\Fonts\D2Coding-Ver1.3.2-20180524-all.ttc"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)


data = pd.read_csv('도로교통공단_시도시군구별교통사고통계.csv')
# print(data.head(10))

# 서울에서 사고건수가 많은 데이터순
data_acc = data[ data['시도'] == '서울'].sort_values(by='사고건수', ascending=False)
# print(data_acc[['시도', '시군구', '사고건수']])
# print(data_acc.shape)

# 서울시 시군구별 교통사고 발생 top 10
# print(data_acc[['시도', '시군구', '사고건수']][:10])
# plt.figure(figsize=(10, 6))     # 사이즈 지정
# plt.title('서울시 시군구별 교통사고 발생 top 10')       # 제목 붙히기
# plt.bar(range(10), data_acc['사고건수'][:10])       #막대 그래프 (x, y)
# plt.xticks(range(10), data_acc['시군구'][:10])     # x축 단위 라벨 (x, 라벨값)
# plt.show()

# 전국 시도별 사고건수/사망자수 top 10
# 시도로 그룹
# print(data.groupby(by='시도'))
# print(data.groupby(by='시도').count()) # 시도별 구의 개수
# print(data.groupby(by='시도').sum())  # 그룹별 합계 (시도별 합계)
data_grby_city = data.groupby(by='시도', as_index=False).sum() # 그룹핑 기준인 시도를 인덱스로 사용 안하겠다 지정
print(data_grby_city.shape)
print(data_grby_city.sort_values(by='사고건수', ascending=False))
print(data_grby_city.sort_values(by='사망자수', ascending=False))
data_grby_city_sorted_acc = data_grby_city.sort_values(by='사고건수', ascending=False)
data_grby_city_sorted_death = data_grby_city.sort_values(by='사망자수', ascending=False)

print(data_grby_city_sorted_acc['시도'])
print(data_grby_city_sorted_acc['사고건수'])

#  그래프 그리기 : 사고건수 top10
# plt.figure(figsize=(10, 6))     # 사이즈 지정
# plt.title('전국 시도별 교통 사고 발생 top 10')       # 제목 붙히기
# plt.bar(range(10), data_grby_city_sorted_acc['사고건수'][:10])       #막대 그래프 (x, y)
# plt.xticks(range(10), data_grby_city_sorted_acc['시도'][:10])     # x축 단위 라벨 (x, 라벨값)
# plt.savefig('전국시도별교통사고발생top10.png')
# plt.show()
#  막대그래프 그리기 : 사망자수 top10
# plt.figure(figsize=(10, 6))     # 사이즈 지정
# plt.title('전국 시도별 교통 사고 사망자수 top 10')       # 제목 붙히기
# plt.bar(range(10), data_grby_city_sorted_death['사망자수'][:10])       #막대 그래프 (x, y)
# plt.xticks(range(10), data_grby_city_sorted_death['시도'][:10])     # x축 단위 라벨 (x, 라벨값)
# plt.savefig('전국시도별교통사고사망자수top10.png')
# plt.show()
#  파이그래프 그리기 : 사망자수 top10
# colors = ['red', 'yellow', 'purple', 'burlywood', 'lightcoral']
# plt.title('전국 시도별 교통 사고 사망자수 top 10')
# plt.pie( data_grby_city_sorted_death['사망자수'][:10],
#         labels=data_grby_city_sorted_death['시도'][:10],
#         startangle=90,
#         counterclock=False,
#          autopct='%.1f%%',
#          colors=colors)
# plt.savefig('전국시도별교통사고사망자수top10.png')
# plt.show()

# 지도에 그리기
'''
- 라이브러리 : folium 
- 지도 데이터 파일 : .geojson 
    공간정보시스템연구소 : http://www.gisdeveloper.co.kr/?p=2332
    
    지도 원천데이터는 SHP(Shape file) 이 필요 
    SHP파일은 직접핸들링하기 힘드러 GeoJSON이라는 지리정보표시를 위한 표준 JSON 포맷으로 변환 
    https://mapshaper.org/ : 해당 사이트에서 다운받은 지도 파일 4개 넣고 단순화시켜 변환가능 
    1. 맵쉐이퍼사이트에서 select 버튼을 누르고, 다운받아 압축해제한 4개 파일 선택 
    2. 팝업에 nap-verticles 체크, input란에 'encoding=euc-kr' 입력하고, import 누르기 
    3. 지도위 오른쪽 상단에 simplyfy 버튼 누르고, 팝업옵션에 apply 누르고
    4. 상단 가운데에 settings 프로그래스바 움직여서 단순화 시키고 
    5. 오른쪽 상단에 export 누르고, GeoJson 선택하고 export하면 다운받아짐. 
    
    * folium * 
    시각화 패키지 중 하나로 지도를 그려주는 모듈. 경량. 
    
'''
import json
import folium

# 전국 시도별 교통사고 지도 그래프
print(data[['시도', '사고건수']].groupby(by='시도').sum())
data_grby_city2 = data[['시도', '사고건수']].groupby(by='시도').sum()

json = json.load(open("TL_SCCO_CTPRVN_min.json", encoding="utf-8"))
# print(json['features'][0]['id'])
print(data_grby_city2['사고건수'].index[0])
for i in range(17):
    # 'id' : 사고건수값
    json['features'][i]['id'] = data_grby_city2['사고건수'].index[i]

# map 객체 생성 : 대한민국 중심좌표를 센터로, 줌 레벨 7로 시작하는 맵 생성
map = folium.Map(location=[36.2002, 127.054], zoom_start=7)
# Choropleth : 지도위에 띄워줄 그래프 레이어, 설정하여 맵에 추가
folium.Choropleth(
    geo_data=json,
    name='choropleth',
    data=data_grby_city2['사고건수'],
    key_on='feature.id',
    fill_color='YlGnBu',
    fill_opacity=0.8,
    line_opacity=0.2).add_to(map)

# 레이어 컨트롤러러에 지도 추가
folium.LayerControl().add_to(map)
map.save('trafficMapResult.html') # 저장

# 대한민국 중심좌표 : 36.2002, 127.054
# 서울 중심좌표 : 37.541, 126.986




















1.  실행되는 순서가 다르다. / 관리되는 컨테이너가 다르다 ( Filter -> web container / Interceptor -> Spring container)

  why?

  filter는 자바에서 제공하는 

 interceptor는 스프링에서 제공 -> DispatcherServlet에 의해 호출됨 -> HttpServletRequest, HttpServletResponse 객체를 변경할 수 없다! ( filter는 가능)

 

 

 

2. 어댑터 또는 데코레이터 패턴 적용여부

Filter O

   -> filter의 경우 디스펫치서블렛 불리기 이전이므로 /

서블릿 리퀘스트를 요청받아 -> HTTP서블릿 리퀘스트 -> filter -> chain.doFilter

doFilter 에서 요청(Request)/ 응답(Response) 변경할 수 있음

 

-> Filter에서 선택적으로 요청, 응답 객체를 사용자 정의 구현체로 래핍하여 어댑터(래퍼), 또는 데코레이터 패턴으로 적용가능

 

Interceptor X

 

래퍼 없을땐 1번만 적용됨
래퍼 재정의 해서 반복가능

3. 이러한 이유로

Filter 

< 스프링과 무관하게 전역적으로 처리해야하는 작업, 웹 어플리케이션에 전반적으로 사용되는 기능>

@ 공통된 보안 및 인증

   - 전역적으로 해야하는 보안 검사 (XSS,CSRF 방어 등)

@ 모든 요청에 대한 로깅 또는 감사 (위험 관리)

@ 이미지/ 데이터 압축 및 문자열 인코딩

@ Spring과 분리하려는 모든 기능

 

대표적으로 SpringSecurity가 Filter 기반의 인증 및 인가를 검사 할 수 있다. 따라서 Spring MVC에 종속적이지 않다

 

Interceptor

<클라이언트 요청과 관련되어 전역적으로 처리해야하는 작업>

@ 세부적인 보안 및 인증

  - 클라이언트 요청과 관련된 인증, 인가 작업.

 특정 그룹의 사용자에 대한 기능 제한 등

@API 호출에 대한 로깅 또는 감사

@Controller로 전달되는 정보의 가공

 

 

https://www.youtube.com/watch?v=nQizVrBYCO0&t=559s

'WEB Creator > [Spring]' 카테고리의 다른 글

[Spring] @Controller와 @RestController  (0) 2022.08.31
[Spring] File Download  (0) 2022.08.25
[Spring] File Upload  (0) 2022.08.25

2. 파일 다운로드


1) 우선순위 지정
2) DownloadView.java 기능 사용을 위해 bean으로 등록
3) jsp 페이지에 다운로드용 버튼 하나 만들고 요청경로 지정
4) Controller에서 해당 요청 처리 매핑메서드 만들어 DownloadView의 기능 호출

 

2-1 우선순위 지정

AppServlet > Servlet-context 에 들어가서 해당 코드 입력하기

 

	<!--  InternalResourceViewResolver 보다 우선순위를 높게해서 먼저 다운로드에 관하는
    				beannameViewResolve 실행되게끔 -->
	<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<beans:property name="order" value="0"></beans:property>
	</beans:bean>

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
		<beans:property name="order" value="1"></beans:property>
	</beans:bean>

 

 

2-2 Downloadview 기능을 위한 bean등록

 

 

AppServlet > root-context 에 들어가서 해당 코드 입력

<bean id="fileDown" class="com.upload.util.DownloadView" />

 

src/main/java > com.upload.util 패키지 생성후

해당 java 클래스 만들기

 

package com.upload.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;

public class DownloadView extends AbstractView {
	
	public DownloadView() {
		setContentType("application/download; charset=utf-8"); 
	}
	@Override							
	protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {		

		File file = (File)model.get("downloadFile");		
		response.setContentType(getContentType()); 			
		response.setContentLength((int)file.length());		
		
		String fileName = java.net.URLEncoder.encode(file.getName(), "UTF-8"); 
		response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\";");  
		response.setHeader("Content-Transfer-Encoding", "binary");
		
		OutputStream out = response.getOutputStream();		
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);		
			FileCopyUtils.copy(fis, out);			
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(fis != null) { try {fis.close();}catch(Exception e2) { e2.printStackTrace(); } }
			out.flush();
		}
	}
}

 

 

2-3 jps 페이지에 다운로드용 버튼 만들고 요청경로 지정

 

helloDown.jsp

window.location='/upload/download  요청경로지정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
</head>
<body>
	<h2> hello down page</h2>
	<h3> 다운을 받고 싶으면 아래 버튼을 누르세요 !!!</h3>
	<button onclick="window.location='/upload/download'"> 다운로드  </button>
</body>
</html>

 

 

 

 

2-4  Controller에서 해당 요청 처리 매핑메서드 만들어 DownloadView의 기능 호출

 

	// 다운로드 버튼 띄운 화면	
	@GetMapping("helloDown")
	public void helloDown() {
		
	}

	// 다운 요청 처리
	@GetMapping("download")
	public ModelAndView down() {
		// 다운 시킬 파일 준비
		File f = new File("C:\\img\\ham.jpg");
		// 생성자 매개변수
		// String viewName 		:	view 이름 -> xml 지정한 downloadView 빈의 id값
		// String modelName		:	파라미터명 지정 (이름) 
		// Object modelObject	:	데이터 (다운 시킬 파일)
		ModelAndView mv = new ModelAndView("fileDown", "downloadFile", f);  //root에 bean으로 fileDown 만듦 그 다음 dowloadFile 키와 f라는 value를 줌 
		return mv;
	}
}

'WEB Creator > [Spring]' 카테고리의 다른 글

[Spring] Filter와 Interceptor의 차이점  (0) 2022.09.08
[Spring] @Controller와 @RestController  (0) 2022.08.31
[Spring] File Upload  (0) 2022.08.25

+ Recent posts