높게만 보였던 코딩의 문턱이 점점 낮아지고 있다. 코드를 최소화하는 ‘Low-Code(로우코드)’와 아예 코드 없이 앱을 만드는 ‘No Code(노코드)'가 급부상하고 있기 때문이다. 로우코드와 노코드 애플리케이션 개발 플랫폼이 안착하면 코딩 없이 누구나 빠르게 애플리케이션을 제작할 수 있게 된다. 심지어 전문 개발자들도 코딩을 할 때 이런 플랫폼을 선호하고 있다고 한다. 과연 코딩에서 해방될 수 있을까? 로우코드와 노코드 플랫폼에 대해 자세히 알아본다.

 


 

로우코드와 노코드란 무엇인가

미국의 비즈니스 잡지인 포브스(Forbes)지는 2021년 이후 세상을 뒤흔들 12가지 기술 중 3위로 로우코드와 노코드를 선정했고, 시장조사기관 가트너(Gartner)도 2022년 12가지 핵심 기술 트렌드 중 하나로 동 기술을 채택했다. 특히 가트너는 2025년까지 기업 내에서 새롭게 개발되는 앱의 70% 정도가 로우코드 및 노코드 플랫폼에서 탄생할 것이라고 예측했다. 2020년까지만 해도 로우코드와 노코드로 개발되는 앱은 전체의 25%도 되지 않았다. 로우코드와 노코드의 폭발적인 성장이 예상된다는 것이다.​

 

그렇다면 로우코드와 노코드는 정확히 무엇일까? '로우코드'란 최소한의 코드를 사용해 앱을 개발하는 방법으로, 반복적이고 단순한 부분은 정형화된 템플릿을 기반으로 빠르게 안정적으로 만들고, 전문 인력이 필요한 부분만 프로그래밍 지식을 갖춘 실무담당자가 개발하는 방식이다. 따라서, 로우코드는 실무 담당자보다는 개발자의 생산성을 높이고 검증된 코드를 적용하는 데 초점을 맞추고 있다.

 


 

이에 비해 '노코드'란 코드를 전혀 사용하지 않고 앱을 개발하는 방법으로, 프로그래밍 언어 습득이 필요없고 원하는 화면 유형과 기능을 선택하고 설정하는 것만으로 앱을 만들 수 있다. 따라서 노코드는 실무 담당자가 업무 지식을 바탕으로 앱을 손쉽게 개발하도록 돕는데 초점을 맞추고 있다. 

 

이처럼 사전적인 의미만 놓고 본다면 로우코드와 노코드는 디지털 혁신을 이끌 새로운 기회임이 분명하다. 

 

로우코드와 노코드, 어떤 플랫폼이 있나?

로우코드 및 노코드 플랫폼으로는 스웨이AI(Sway AI)와 듀플로클라우드(DuploCloud)가 주목받고 있다. 스웨이AI는 인공지능과 머신러닝 애플리케이션 구축을 위한 노코드 인공지능 플랫폼이고 듀플로클라우드는 인프라 자동화 분야의 로우코드와 노코드를 제공하는 플랫폼이다. 복잡한 데이터셋을 수익성 있는 앱으로 전환시켜주는 노코드 앱으로 트루소스(TrueSource)라는 플랫폼도 있고 그밖에 사이클러(Cyclr), 멘딕스(Mendix), 하이랜드(Hyland) 등도 떠오르고 있는 로우코드 및 노코드 플랫폼들이다. 마이크로소프트나 세일즈포스, 아웃시스템즈 같은 글로벌 소프트웨어 기업들도 로우코드 및 노코드 솔루션들을 내놓고 있다.

 


 

기존에는 전문 소프트웨어 개발자가 프로그래밍 언어인 C, C#, Java 등을 활용해 스크립트를 작성하여 응용 프로그램을 전적으로 개발해 왔지만, 코딩을 최소화하는 프로그래밍 방식으로 발전하면서 이제 비개발자 직원도 프로그램 개발에 적극 참여할 수 있게 됐다. 하나의 프로그램을 새로 만들기 위해서는 일반적으로 대상 플랫폼에 특화된 높은 수준의 개발 지식이 필요하고 시간도 많이 소비된다. 반면, 로우코드와 노코드 플랫폼을 이용하면 여전히 일부 학습은 필요하지만 개발 속도를 높여주고 기술 장벽을 낮춰줄 것으로 기대된다.

 

로우코드와 노코드의 현실

로우코드와 노코드의 장단점을 알아보자. 우선 장점으로는 프로그램 개발에 걸리는 시간을 비용을 절감할 수 있다는 점이다. 모든 소스코드를 작성하지 않고, 앱을 조합하여 시스템을 구축하므로 개발 기간을 대폭 단축할 수 있다. 이에 따라 개발비를 절감할 수 있는 것도 장점이다. 개발 기간이 짧으면 프로그래머의 인력이 감소하게 된다. 즉, 개발에 드는 인건비를 절감할 수 있는 것이다. 또, 기존 전문 개발자의 경우 필요에 따라 자동화와 불필요한 요소 생략 등을 통해 작업 효율성을 대폭 향상할 수 있다. 이런 효율성 향상은 결국 비용감소로 이어진다. 

 

또다른 장점은 프로그램의 오류를 줄일 수 있다. 프로그래밍을 직접 수행하는 부분이 적어, 그만큼 실수가 줄어든다. 코드를 작성하는 일도 결국 사람이 하는 일이기 때문에 반드시 실수가 발생하기 마련이다. 사람이 작성하는 코드의 양이 적어지면서 실수가 나올 확률도 줄어든다. 결과적으로 버그 수정에 걸리는 시간 단축과 비용 경감에도 도움이 된다. 

 

인력 확보하기도 쉬워진다. 프로그램 개발에 있어 실력이 좋은 엔지니어가 필요하지만, 적절한 인력을 확보하기 어려운 게 현실이다. 로우코드나 노코드를 사용하면, 엔지니어가 전문적인 실력을 갖추지 않았더라도 개발 작업을 할 수 있다. 새로운 엔지니어를 적극적으로 활용할 수 있어 인력 부족 문제에 대응할 수 있다. 

 

로우코드나 노코드의 단점도 있다. 로우코드나 노코드는 개발하는 데 한계가 있어 대규모 개발에는 사용하기 어렵다는 점이다. 복잡한 구조를 필요로 하는 프로그래밍은 결국 프로그래밍을 할 수밖에 없다. 어디까지나 프로그램이 단순한 구조를 가질 때만 로우코드나 노코드를 이용할 수 있다. 문제가 발생하면, 빠르게 교체할 수 있는 격리된 단일 비즈니스 프로세스에만 적합하며 개발 툴에 따라서 할 수 있는 것들이 다 다르기 때문에 각 툴에만 의존하게 되는 단점도 있다.

 

로우코드나 노코드에 의존하면, 처음부터 시스템을 새로 구축하는 프로그래머는 점점 줄어들 수밖에 없다. 동시에 창의성을 발휘해 개발하는 경우가 적어질 수밖에 없다. 어떤 플랫폼을 활용해야 본인이 원하는 서비스를 최대한 잘 구현할 수 있을지 결국 플랫폼을 학습해야 하는 과정이 필요하다. 보안에 취약해진다는 점도 단점으로 꼽힌다. 일부 직원만 쓰는 간단한 기능을 만들 때는 기본적인 보안 관리를 소홀히 할 수밖에 없다. 빠른 속도와 낮은 비용에만 너무 초점을 맞추다 보면 관리 부족과 보안 취약의 문제가 드러난다.

 

로우코드, 노코드 도입 시 고려할 점

로우코드나 노코드 플랫폼을 도입할 때 가장 먼저 고려할 점은 투자대비 수익률(ROI)이다. 로우코드, 노코드는 코딩 방식에서 빌딩 블록 방식을 사용하기 때문에 업무를 빠르게 완료할 수 있기 때문에 얼마나 빠르게 가치 대비 속도를 낼 수 있는지 따져봐야 한다. 그리고 로우코드, 노코드 플랫폼 상당수가 구독형 모델이기 때문에 비용 최적화가 필요하다. 

 

또한 로우코드, 노코드 플랫폼은 독립적인 툴이 아닌 기업 및 조직의 기본 인프라스트럭처에 패치되는 기술이기에 새로운 업무 프로세스를 위해서만 사용하는 것이 아니라 기존 자산부터 인공지능, 초자동화 같은 최신기술을 쉽게 연결할 수 있는 솔루션인지 검토해봐야 한다.

 

마지막으로 보안에 대한 부분이다. 로우코드, 노코드 솔루션은 내부 용도로 사용할 경우 위협적이지 않을 수 있지만 외부에 노출되어 범용 애플리케이션으로 확대할 경우 권한 부여 및 인증 매커니즘과 데이터 암호화 등 신뢰 받는 프레임워크 안에서 플랫폼을 운영할 수 있어야 한다. 

 

출처: https://www.ahnlab.com/ko/contents/content-center/31669

'Coding' 카테고리의 다른 글

6. Django + Mariadb 연동 & APP DB 어드민 등록  (0) 2019.01.06
5. Django 글쓰는 폼 만들기  (0) 2018.12.30
4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16


지난 글에서 models.py를 이용하여 db를 생성한 적이 있다.

http://leopit.tistory.com/174?category=684110

 

DJANGO는 디폴트로 sqlite db를 사용하게 되어 있는데 django 자습을 하다 문득 궁금해졌다. MODEL에 정의한 필드들은 실제 DB에 어떻게 저장되는지..

 

그래서 sqlite보다는 더 익숙한 MYSQL을 연동해 보았다.

 

1. mysql 설치

- mysql 은 유료다. 무료인 mariadb를 설치하였다.

[root@leopit.com ~]# yum install mariadb-server
[root@leopit.com ~]# systemctl start mariad


이제 실제 사용할 mysql 유저 계정과 DB를 만들겠다.

자세한 메뉴얼은 MYSQL 관련 사이트에서 확인하기 바란다.

# 계정 생성

create user 'cert'@'%' identified by 'password';
create user 'cert'@'localhost' identified by 'password';

 

# DB 생성

create database pat;

 

# 권한주기

grant all privileges on *.* to 'cert'@'localhost';
grant all privileges on *.* to 'cert'@'%';

 

cert라는 계정과 pat이란 db를 만들었다.

장고랑 연결해주자

 

2. settings.py 설정

- 상단에 pymysql을 추가해주고 sqlite 부분을 주석처리 해주고 mysql 정보를 입력하였다.

import pymysql
pymysql.install_as_MySQLdb()

 

.

.

.

 

#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
#}

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'pat',
        'USER': 'cert',
        'PASSWORD': 'xxxx',
        'HOST': 'x.x.x.x',
        'PORT': '3306',
        'OPTIONS': {
            'read_default_file': './db.cnf',
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}


 

3. DB 생성 및 확인

지난글에서 만들었던 models.py 내용이다. (클래스명만 변경)

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.

 

class testmodel(models.Model):
    name = models.CharField(max_length=50)
    title = models.CharField(max_length=50)
    content = models.TextField()
    cdate = models.DateTimeField(auto_now_add=True)

 

makemigration과 migrate 커맨드를 통해 DB 등록 진행

[root@leopit.com ~]# python manage.py makemigrations

[root@leopit.com ~]# python manage.py migrate

 

이제 실제 DB에 어떻게 테이블이 생성되었는지 보자

[root@leopit.com ~]# mysql -u cert -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 5.5.60-MariaDB MariaDB Server

 

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]> use pat


Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

 

Database changed
MariaDB [pat]> show tables;
+----------------------------+
| Tables_in_pat              |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| pat_testmodel              |
+----------------------------+
11 rows in set (0.00 sec)

MariaDB [pat]> Ctrl-C -- exit!
Aborted
[root@cert-pat pat]#


 

 

장고에 필요한 기본적인 테이블과 models.py에 등록한 testmodel이란 테이블이 앱이름_testmodel 이란 테이블명으로 생성되어 있다. 테이블 안에 필드들도 살펴보자

MariaDB [pat]> desc pat_testmodel;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(50) | NO   |     | NULL    |                |
| title   | varchar(50) | NO   |     | NULL    |                |
| content | longtext    | NO   |     | NULL    |                |
| cdate   | datetime    | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [pat]> Ctrl-C -- exit!
Aborted

 

models.py에서 필드를 4개 선언했는데 5개가 생성되었다.

django에서는 Primary Key값이 자동으로 생성된다. id라는 필드명으로 PK가 생성되어져 있었다.

 

4. ADMIN 페이지에 DB 등록

앱 디렉토리 하단에 admin.py 를 아래와 같이 수정한다.

앱이름.models를 import 하고 models.py 에 입력한 testmodel 클래스명을 등록해준다.

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

 

from django.contrib import admin

 

# Register your models here.
from pat.models import *

 

admin.site.register(testmodel)

 

이렇게 하면 웹페이지에서 DB 확인이 가능하다.

http://자신의 URL/admin 으로 이동하면 로그인 계정정보를 입력하고 아래와 같이 테이블을 확인할 수 있다. 로그인 계정을 만들지 않았다면 python manage.py createsuperuser 커맨드를 통해 생성할 수 있다.

 

 

'Coding' 카테고리의 다른 글

로우코드와 노코드, 코딩 해방 가능한가?  (0) 2024.07.06
5. Django 글쓰는 폼 만들기  (0) 2018.12.30
4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16

간단히 글쓰는 폼을 만들어보겠다.


1. 글쓰는 폼 만들기

간단히 글쓰기 위한 폼을 만들어본다.

편리한 작업을 위해 bootstrap에서 제공하는 css를 활용하겠다.

bootstrap css는 아래 URL 참조 바란다.

https://getbootstrap.com/docs/3.3/css/


상기 URL에서 제공하는 기본 폼 태그를 Copy하여 html 파일을 하나 만들어준다.

앱 디렉토리의 template디렉토리 안에 생성해준다.

이 폼은 공지사항 등록용으로 사용할것이기에 Notice 라는 디렉토리를 추가로 만들어서 그 안에 생성하였다.


[root@leopit.com notice]# pwd

/home/root/pat/templates/pat/notice


html 페이지 상단에 staticfiles 로드를 해주고 css, js 경로를 수정해준다. 우선 웹페이지만 잘 열리는지 확인할것이므로 이상태로 두고 이 템플릿을 연결할 view페이지를 설정한다.

[root@leopit.com notice]# vim form.html
{% load staticfiles %}

<!DOCTYPE html>
<html>
  <head>
    <title>Notice - register</title>
    <link href='{% static "pat/vendor/bootstrap/css/bootstrap.min.css" %}' rel="stylesheet">
    <!-- Custom fonts for this template-->
    <link href='{% static "pat/vendor/fontawesome-free/css/all.min.css" %}' rel="stylesheet" type="text/css">
  </head>
  <body>
    <form>
      <div class="form-group">
        <label for="exampleInputEmail1">Email address</label>
        <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
      </div>
      <div class="form-group">
        <label for="exampleInputPassword1">Password</label>
        <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
      </div>
      <div class="form-group">
        <label for="exampleInputFile">File input</label>
        <input type="file" id="exampleInputFile">
        <p class="help-block">Example block-level help text here.</p>
      </div>
      <div class="checkbox">
        <label>
          <input type="checkbox"> Check me out
        </label>
      </div>
      <button type="submit" class="btn btn-default">Submit</button>
    </form>
  </body>
</html>


앱디텍토리 하위에 있는 뷰파일을 수정하여 방금 생성한 form.html과 연결해준다.

뷰에 대한 상세한 내용은 아래 URL을 참고하기 바란다.


https://docs.djangoproject.com/ko/2.1/intro/tutorial03/


뷰페이지에서는 인자를 받을수도 있고 줄수도 있다.

우선 메뉴얼 예제에 있는 내용을 그대로 사용하겠다.


# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render from django.http import HttpResponse from django.template import loader # Create your views here. def DisplayMyPage(request): return render(request, 'pat/main.html', { 'welcome_text': 'Hello World!' }) def main(request): template = loader.get_template('pat/main.html') context = { 'latest_question_list': "test", } return HttpResponse(template.render(context, request)) def ntform(request): template = loader.get_template('pat/notice/form.html') context = { 'latest_question_list': "test", } return HttpResponse(template.render(context, request))

이 코드는 pat/notice/form.html 템플릿을 불러온후 context를 전달한다. context는 템플릿에서 사용하는 변수명과 python 객체를 연결하는 역할을 한다. 우선 외부에서 페이지가 정상적으로 열리는지만 테스트 할것이므로 더이상 수정하지 않고 이제 URL을 설정하자



외부에서 접근 가능한 URL이 있어야 할것이다.

템플릿, URL, 뷰, 모델 작업 순서에 대해 이해가 잘 안간다면 이전글(http://leopit.tistory.com/164?category=684110)을 참조하기 바란다.

프로젝트 디렉토리 하단에 있는 URL 파일을 연다.


아래와 같이 아까 생성한 뷰페이지를 MyAppView 클래스로 생성한후 notice/form.html 에 연결해준다. 외부에서 notice/form.html URL로 들어올 경우 MyAppView의 ntform 클래스를 실행해주겠다는 이야기이다.

from django.conf.urls import url from django.contrib import admin from pat import views as MyAppView urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^main/', MyAppView.main), url(r'^main.html/', MyAppView.main), url(r'^$', MyAppView.main), url(r'^notice/form.html$', MyAppView.ntform), ]


여기까지 한 후 웹 데몬을 실행해주고 외부에서 정상접근 되는지 확인해보자

[root@leopit.com leopit]# python manage.py runserver 0.0.0.0:8000 Performing system checks... System check identified no issues (0 silenced). December 30, 2018 - 17:22:52 Django version 1.11.17, using settings 'cert.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.


외부에서 정상적으로 URL을 불러들인 모습이다.

다음장에서는 실제 Django DB에 데이터를 입력하기 위한 폼을 만들어 보겠다.





'Coding' 카테고리의 다른 글

로우코드와 노코드, 코딩 해방 가능한가?  (0) 2024.07.06
6. Django + Mariadb 연동 & APP DB 어드민 등록  (0) 2019.01.06
4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16


이전장에서 bootstrap 과 django를 다루어보았다.

이번장에서는 DB를 생성하는 방법을 다루어본다.


처음 django를 접하는 사람은 DB는 언제 어떻게 생성하지? 하는 궁금증을 가지게 된다.

Django에서는 models.py에 클래스를 정의하여 DB를 컨트롤 한다. 

기존에 웹프로그래밍을 했던 사람이라면 혼란스럽기도 하고 신세계이기도 할것이다.


이전장에서 pat이란 앱을 만들었다.

앱 디렉토리에 models.py가 존재한다.

[root@leopit.com pat]# ls
admin.py   apps.py   __init__.py   migrations  models.pyc  templates  views.py
admin.pyc  apps.pyc  __init__.pyc  models.py   static      tests.py   views.pyc
[root@leopit.com pat]#


DB를 생성하기 위해 models.py에 아래와 같이 필드를 추가하였다.

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.

class Notice(models.Model)
    name = models.CharField(max_length=50)
    title = models.CharField(max_length=50)
    content = models.TexeField()
    cdate = models.DateTimeField(auto_now_add=True)


간단히 이름/제목/내용/날짜 필드를 만들었다.

models 모듈에 속한 필드 클래스로 멤버를 선언하면 마이그레이션 후 자동으로 DB와 연결된다.

Field Type에 대한 상세한 내용은 Django 문서를 참조하기 바란다.

https://docs.djangoproject.com/en/1.8/topics/db/models/#fields


이제 makemigrations 명령어를 통해 마이그레이션 스크립트를 생성한다. 

수정/삭제/생성할 필드들을 스크립트로 생성하여 migrations 디렉토리에 저장하게 된다.

[root@leopit.com leopit]# python manage.py makemigrations Migrations for 'pat': pat/migrations/0001_initial.py - Create model Notice [root@leopit.com leopit]#


마지막으로 migrate를 하여 DB를 생성한다.

[root@leopit.com leopit]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, pat, sessions
Running migrations:
  Applying pat.0001_initial... OK
[root@leopit.com leopit]#


'Coding' 카테고리의 다른 글

6. Django + Mariadb 연동 & APP DB 어드민 등록  (0) 2019.01.06
5. Django 글쓰는 폼 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
3. Django + Bootstrap  (1) 2018.12.16
2. Django 설치편  (0) 2018.12.14

실전 프로젝트 개발 과정


 이전 시간에는 Django(이하 장고) 프레임워크를 활용한 개발 패턴에 대해서 정리했었다. 이번에는 김석훈 저자의 '장고를 활용한 쉽고 빠른 웹 개발 파이썬 웹 프로그래밍'이라는 서적에서 다루고 있는 기본적인 웹 애플리케이션 제작을 직접 해보고, 내용에 대해서 나름대로 정리해본다. 책에서는 본격적인 애플리케이션 개발에 앞서서 디자인을 먼저 수행하는데, 화면(UI) - 테이블(데이터베이스) - 로직 - URL 순서에 따라서 설계를 진행한다. 그리고 이전 포스팅에서 정리했던 것과 마찬가지로 개발 순서를 가이드하고 있다.


프로젝트 생성 - 모델 작성 - URL 작성 - 템플릿 작성 - 뷰 작성


프로젝트 생성 - 프로젝트 및 앱 개발에 필요한 디렉터리와 파일을 생성

모델 작성 - 테이블 관련 사항을 개발, modelsspy, admin.py

URL 작성 - URL 및 뷰 매핑 관계를 정의 urls.py

템플릿 작성 - templates 디렉터리 하위의 html 파일 작성

뷰 작성 - 제어 흐름 및 로직 개발 views.py


 실제적인 개발을 진행해보면 위 다섯가지 단계보다 조금 더 세세한 개발 패턴을 정의할 수 있다. 내 나름대로의 정리한 장고를 활용한 웹 개발은 아래의 사이클을 갖고있는 것 같다.


가상환경 설정(virtualenv) - 프로젝트 생성(startproject) - 프로젝트 설정(settings.py) - 기본 테이블 생성(migrate) - 수퍼유저 생성(createsuperuser) - App 생성(startapp)과 등록(settings.py) - 모델 작성(model.py) - Admin 사이트 반영(admin.py) - 테이블(DB) 반영(makemigrations, migrate) 및 확인 - URL 작성(urls.py) - 로직 작성(view.py) - 화면(UI) 작성(templates) 


 프로세스에 대한 전반적인 얘기를 해보자면, 맨 처음 장고를 활용한 웹 개발을 진행할 때는 위의 모든 과정을 수행해야한다. 그러나 장고 프로젝트는 내부에 다수의 앱을 보유할 수 있기 때문에 각 앱을 작성할 때에는 파란색 과정만 수행하면 된다. 추가적으로 맨 처음 가상환경 설정의 경우 효율적인 파이썬 개발환경을 구축하기 위한 과정인데 필수적인 부분은 아니다. 그러나 파이썬 개발 서적에서 가상 환경에 대해서는 적극 권장하고 있기 때문에 이에 대한 내용을 따로 정리했다. virtualenv에 대해서는 다음 포스팅을 참조하기 바란다. [virtualenv를 활용한 독립개발 환경 구축



 이어서 가상환경 설정 단계를 제외한 각 단계에 대해서 세세하게 정리해본다.

 프로젝트 생성(startproject) - 앞으로 진행할 프로젝트의 뼈대를 구성하는 것이다. 아래의 명령어 한 줄로써 프로젝트에 뼈대가 생성되는데, 동일한 디렉터리가 두 개가 상하 관계로 생성된다. 동일한 이름으로 인해 상위 디렉터리의 이름은 변경을 권장한다.

# django-admin.py startproject `projectname`


 프로젝트 설정(settings.py) - 이전 포스팅에서 알아봤던 settings.py 파일에 개발에 필요한 프로젝트 초기 설정을 해야한다. 크게는 DATABASES, TEMPLATES, STATIC, TIME_ZONE, MEDIA, LANGUAGE_CODE 정도가 되겠다. 이들 중 타임존이나 언어 설정의 경우에는 필수는 아니다. 장고에서 정적 파일은 아래와 같이 두 종류로 구분이 된다.

STATIC: 개발 리소스 정적 파일, MEDIA: 유저로 업로드한 모든 파일


 기본 테이블 설정(migrate) - 아직 테이블 작성을 하지 않았지만, 장고는 디폴트로 사용자와 사용자의 권한 그룹 테이블을 갖는다. 따라서 기존에 어떤 테이블을 작성하지 않았어도, 아래의 명령어를 통해 사용자 및 권한 그룹에 대한 테이블을 생성해야 한다.

# python3 manage.py migrate


 수퍼유저 생성(createsuperuser) - 관리자 권한을 갖는 슈퍼 유저를 생성한다.

# python3 manage.py createsuperuser


 App 생성(startapp)과 등록(settings.py) - 하나의 장고 프로젝트는 다수의 앱으로 구성되는데, 아래의 명령어를 통해 앱을 생성할 수 있다. 그리고 만들어진 앱 정보를 settings.py에 입력함으로써 프로젝트에 앱이 등록된다.

# python3 manage.py startapp `app name`


 김석훈 저자의 '장고를 활용한 쉽고 빠른 웹 개발 파이썬 웹 프로그래밍'이라는 서적에서 가장 기본적으로 제작해보는 Bookmark 앱에 대한 코드는 [Github 저장소]에 업로드했다. 또한 코드에 대한 상세한 내용은 주석을 통해 설명한다.



출처: http://taekho-nology.tistory.com/64 [태코놀로지]

'Coding' 카테고리의 다른 글

5. Django 글쓰는 폼 만들기  (0) 2018.12.30
4. Django DB 만들기  (0) 2018.12.30
3. Django + Bootstrap  (1) 2018.12.16
2. Django 설치편  (0) 2018.12.14
1. Django 개념알기  (0) 2018.12.06

이번장에서는 Django에 bootstrap frame을 사용해보겠다.


이전장에서 프로젝트 이름을 cert, 앱 이름을 pat으로 만들었다.

django template을 사용하기 위해 pat 디렉토리 하위에 static을 만들고 static 하위에 pat이란 이름의 디렉토리를 생성한다.

[root@leopit.com ~]# mkdir -p pat/static/pat

[root@leopit.com ~]# cd pat/static/pat


본인이 사용할 bootstrap template을 가져온다.

[root@leopit.com pat]# wget https://github.com/BlackrockDigital/startbootstrap-shop-homepage/archive/gh-pages.zip

[root@leopit.com pat]unzip gh-pages.zip

[root@leopit.com pat]# ls

404.html              gulpfile.js        register.html

bak                   js                 scss

blank.html            LICENSE            startbootstrap-sb-admin-gh-pages

charts.html          index.html     login.html         tables.html

css                   package.json       vendor

forgot-password.html  package-lock.json

gh-pages.zip          README.md


이 다음 앱 디렉토리 하위에 templates/pat 디렉토리를 생성한 후 index.html 파일 옮긴다.

본인의 경우 index.html 파일명을 main.html로 변경하였다.

[root@leopit.com ~]# mkdir -p ~/pat/templates/pat

[root@leopit.com ~]# cd /pat/templates/pat

[root@leopit.com pat]# mv ~/pat/static/pat/index.html ./main.html

[root@leopit.com pat]# ls

main.html


이제 html 파일의 css 경로를 바꿔주자

문서 최상단에 {% load staticfiles %} 을 추가해주고 각종 css 경로를 수정한다.

경로는 static 디렉토리 하위에 존재하는 bootstrap 템플릿 경로를 써주면 된다.


[root@leopit.com ~]# vi main.html

<!DOCTYPE html>

{% load staticfiles %}


   <title>SB Admin - Dashboard</title>

    <!-- Bootstrap core CSS-->
    <link href='{% static "pat/vendor/bootstrap/css/bootstrap.min.css" %}' rel="stylesheet">

    <!-- Custom fonts for this template-->
    <link href='{% static "pat/vendor/fontawesome-free/css/all.min.css" %}' rel="stylesheet" type="text/css">

    <!-- Page level plugin CSS-->
    <link href='{% static "pat/vendor/datatables/dataTables.bootstrap4.css" %}' rel="stylesheet">

    <!-- Custom styles for this template-->
    <link href='{% static "pat/css/sb-admin.css" %}' rel="stylesheet">

    <!-- Bootstrap core JavaScript -->
    <script src='{% static "pat/vendor/jquery/jquery.min.js" %}'></script>
    <script src='{% static "pat/vendor/popper/popper.min.js" %}'></script>
    <script src='{% static "pat/vendor/bootstrap/js/bootstrap.min.js" %}'></script>


이제 view.html을 수정하여 template을 연결해준다.


[root@leopit.com pat]# vim ~/pat/views.py

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from django.shortcuts import render

from django.http import HttpResponse

from django.template import loader


# Create your views here.

def index(request):

    template = loader.get_template('pat/main.html')

    context = {

        'latest_question_list': "test",

    }

    return HttpResponse(template.render(context, request))


외부에서 접근할 url을 설정하고 해당 url에 대한 html 파일을 연결해준다.

settings.py에 맨 하단에 STATIC_URL과 ROOT설정을 해준다.


STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')


마지막으로 collectstatic을 해주면 static/pat에 파일이 복사된다.

[root@leopit.com ~]# python manage.py collectstatic

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/base.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/changelists.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/dashboard.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/fonts.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/forms.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/login.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/rtl.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/css/widgets.css'

Copying '/usr/lib64/python2.7/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt'

...



[root@leopit.com ~]# cd ~/static/pat

[root@leopit.com pat]# ls

404.html     css                   js            package-lock.json  tables.html

bak          forgot-password.html  LICENSE       README.md          vendor

blank.html   gh-pages.zip          login.html    register.html

charts.html  gulpfile.js           package.json  scss


마지막으로 데몬실행후 사이트 접근

[root@leopit.com ~]# python manage.py runserver 0.0.0.0:8000





'Coding' 카테고리의 다른 글

4. Django DB 만들기  (0) 2018.12.30
Django 개발 흐름  (0) 2018.12.16
2. Django 설치편  (0) 2018.12.14
1. Django 개념알기  (0) 2018.12.06
[PHP] 다운로드 구현시 파일이름에 [1] 등이 자동으로 붙어버리는 문제  (0) 2017.01.07

1. python, pip 설치/업그레이드

[root@leopit.com ~]# yum install python python-pip

[root@leopit.com ]# pip install --upgrade pip



2. Django 설치

[root@leopit.com ~]# pip install django

Collecting django

  Downloading https://files.pythonhosted.org/packages/09/2b/6c2d363e3d46307251a9d6bf74ec28543805bbcadf56ca729f4a04846914/Django-1.11.17-py2.py3-none-any.whl (7.0MB)

    100% |████████████████████████████████| 7.0MB 3.2MB/s

Collecting pytz (from django)

  Downloading https://files.pythonhosted.org/packages/f8/0e/2365ddc010afb3d79147f1dd544e5ee24bf4ece58ab99b16fbb465ce6dc0/pytz-2018.7-py2.py3-none-any.whl (506kB)

    100% |████████████████████████████████| 512kB 15.1MB/s

Installing collected packages: pytz, django

Successfully installed django-1.11.17 pytz-2018.7



3. 버전 확인

[root@leopit.com ~]# python -m django --version

1.11.17



4. 프로젝트 생성

[root@leopit.com ~]# django-admin startproject cert

[root@leopit.com ~]# cd cert

[root@leopit.com cert]# ls -al

합계 16

drwxr-xr-x  3 root root 4096 12월  6 19:29 .

drwxr-xr-x. 5 root root 4096 12월  6 19:29 ..

drwxr-xr-x  2 root root 4096 12월  6 19:29 cert

-rwxr-xr-x  1 root root  804 12월  6 19:29 manage.py



5. 관리의 편의성을 위해 투뎁스로 되어 있는 프로젝트를 원뎁스로 변경한다.

[root@leopit.com ~]# mv cert cert_tmp

[root@leopit.com ~]# mv cert_tmp/* ./

[root@leopit.com ~]# rmdir cert_tmp



6. 앱 생성

- 자 여기서.. 프로젝트와 앱의 개념을 이해 못하겠다면..
이전글을 다시 보자 -> http://leopit.tistory.com/160 

[root@leopit.com ~]# django-admin startapp pat

[root@leopit.com ~]# cd pat

[root@leopit.com pat]# ls

__init__.py  admin.py  apps.py  migrations  models.py  tests.py  views.py



7. 생성된 앱(tests) 추가

[root@leopit.com pat] vi ../leopit/settings.py

INSTALLED_APPS = [

    'pat',

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

]



8. 전역 설정

- 언어, 타임존변경

- 외부에서 접근 가능하도록 Allow_Hosts 변경

[root@leopit.com cert]# vim settings.py

LANGUAGE_CODE = 'ko-kr'

TIME_ZONE = 'Asia/Seoul'

ALLOWED_HOSTS = '*'



9. migrate 작업

migrate 명령은 INSTALLED_APPS 의 설정을 탐색하여, mysite/settings.py 의 데이터베이스 설정과 app 과 함께 제공되는 데이터베이스 migrations(나중에 설명하겠습니다) 에 따라, 필요한 데이터베이스 테이블을 생성합니다. 이 명령을 수행하면 각 migration 이 적용되는 메세지가 화면에 출력되는 것을 확인할 수 있습니다. 어떤 내용이 생성되었는지 궁금하다면, 데이터베이스 클라이언트로 접속한 후, \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite), SELECT TABLE_NAME FROM USER_TABLES; (Oracle) 을 통해 Django 가 생성한 테이블을 확인해 볼 수 있습니다.

[root@leopit.com ~]# python manage.py migrate

Operations to perform:

  Apply all migrations: admin, auth, contenttypes, sessions

Running migrations:

  Applying contenttypes.0001_initial... OK

  Applying auth.0001_initial... OK

  Applying admin.0001_initial... OK

  Applying admin.0002_logentry_remove_auto_add... OK

  Applying contenttypes.0002_remove_content_type_name... OK

  Applying auth.0002_alter_permission_name_max_length... OK

  Applying auth.0003_alter_user_email_max_length... OK

  Applying auth.0004_alter_user_username_opts... OK

  Applying auth.0005_alter_user_last_login_null... OK

  Applying auth.0006_require_contenttypes_0002... OK

  Applying auth.0007_alter_validators_add_error_messages... OK

  Applying auth.0008_alter_user_username_max_length... OK

  Applying sessions.0001_initial... OK



10. SuperUser 계정 생성

[root@leopit.com ~]# python manage.py createsuperuser

Username: leopit

Email address: leopit.kr@gmail.com

Password:

Password (again):

Superuser created successfully.



11. django 실행

[root@leopit.com ~]# ./manage.py runserver 0.0.0.0:8000

Performing system checks...


System check identified no issues (0 silenced).

December 06, 2018 - 19:33:09

Django version 1.11.17, using settings 'leopit.settings'

Starting development server at http://0.0.0.0:8000/

Quit the server with CONTROL-C.


12. 설치 완료


 

 

#참조

https://docs.djangoproject.com/ko/2.1/intro/tutorial02/


 

김석훈, 『Django로 배우는 쉽고 빠른 웹 개발 파이썬 웹프로그래밍, 한빛미디어 를 참고했다!


1)개념

Django(이하 장고)는 웹 프로그램 개발시 일반적으로 쓰이는 MVC 패턴을 따른다. MVC는 데이터, 사용자가 보는 인터페이스, 데이터 처리 로직을 모듈화 해서 설계하는 방식이다. UI디자이너와 개발자가 다루는 부분을 구분해서 작업의 효율을 높일 수 있는 방식이다. 장고도 이런 방식을 따르지만 용어가 조금 다르다.

장고에서는 MTV 패턴을 사용하며 이는 데이터를 의미하는 Model, 사용자 인터페이스를 의미하는 Template, 실제로 동작할 프로그램 로직인 View 세 가지 요소를 합친 것이다.


장고에서 웹클라이언트의 요청이 처리되는 과정은 다음과 같다.


1. 클라이언트로 부터 요청이 들어왔다!

2. URLconf 모듈을 이용해서 URL을 분석한다!

3. 분석한 결과로 해당 URL을 어떤 뷰가 처리할지 결정한다!

4. 지명당한 뷰는 자신의 로직을 실행하는데, 

5. 이 때 필요하다면 모델을 통해 데이터베이스 접근도 한다.

6. 뷰가 로직처리를 마치면 템플릿을 통해 클라이언트에게 보낼 HTML을 생성한다.

7. 최종적으로 뷰가 HTML파일을 클라이언트에게 보내 응답한다! 


2)Model(데이터베이스)

D장고에서는 ORM기법을 이용해서 쉽게 데이터베이스를 정의할 수 있다! ORM기법을 이용하면 Table을 만들때 데이터베이스 엔진의 종류에 상관 없이 테이블은 class로 테이블의 컬럼은 class의 속성으로 표현할 수 있다!


3)Template(UI)

템플릿 파일은 .html확장자를 가진다. settings.py파일에 정의된 TEMPLATE_DIR 및 INSTALLED_APPS에 등록된 경로 내에서만 검색하므로 저장 위치를 주의해야한다.


4)View(로직)

장고에서의 뷰는 함수나 클래스의 메소드로 작성한다. 웹 요청을 받고 HTML데이터나 리다이렉션 명령, 에러 메시지 등의 응답을 반환한다. 뷰 함수는 첫 번째 인자로 HttpRequest객체를 받고, 모든 처리 후에 최종적으로 HttpResponse 객체를 반환한다. HttpResponse클래스의 하위 클래스에는 HttpResponseNotFound 객체가 있어 에러를 반환할 수도 있다.



출처: http://doongkibangki.tistory.com/22 [둥기방기의 블로그]

게시판같은곳에 파일을 첨부할때 파일이름에 .(쩜)이 두개 이상 붙으면 
다운받을때 브라우저에서 파일이름에 [1]같은것을 붙혀버립니다. 
(예를들면 xxx.tar.z같은 파일을 다운받을때 xxx[1].tar.z 로 바뀌어버림)
이러한 문제를 해결하고 싶으시면 아래 간단한 팁을 이용하시면 됩니다.

if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")){
$파일이름 = preg_replace('/\./', '%2e', $서버에저장된파일이름, substr_count($서버에저장된파일이름, '.') - 1);
}

아래는 파일 다운로드 페이지 구현시 실제 사용예제입니다. 

/********************************** 예제 *******************************************/
// 파일열기모드 옵션값
$dn = 1; // 1 : 다운 0 : 실행
$dn_yn = ($dn) ? "attachment" : "inline";

// 디렉토리 정보
$dir = "/파일이저장된경로/";

// 서버에 저장된 파일명
$filen=" "

// 서버 저장되기 전 실제 파일명
$filen2=" ";

// 서버에 저장된 경로명+파일명 
$file = $dir.$filen;

if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")){
$dnfile = preg_replace('/\./', '%2e', $filen2, substr_count($filen2, '.') - 1);
}

if(eregi("(MSIE 5.0|MSIE 5.1|MSIE 5.5|MSIE 6.0)", $HTTP_USER_AGENT))

if(strstr($HTTP_USER_AGENT, "MSIE 5.5")) 

Header("Content-Type: doesn/matter"); 
Header("Content-disposition: filename=$dnfile"); 
Header("Content-Transfer-Encoding: binary"); 
Header("Pragma: no-cache"); 
Header("Expires: 0"); 


if(strstr($HTTP_USER_AGENT, "MSIE 5.0")) 

Header("Content-type: file/unknown"); 
Header("Content-Disposition: $dn_yn; filename=$dnfile"); 
Header("Content-Description: PHP3 Generated Data"); 
Header("Pragma: no-cache"); 
Header("Expires: 0"); 


if(strstr($HTTP_USER_AGENT, "MSIE 5.1")) 

Header("Content-type: file/unknown"); 
Header("Content-Disposition: $dn_yn; filename=$dnfile"); 
Header("Content-Description: PHP3 Generated Data"); 
Header("Pragma: no-cache"); 
Header("Expires: 0"); 


if(strstr($HTTP_USER_AGENT, "MSIE 6.0"))
{
Header("Cache-Control: ");
Header("Pragma: ");
Header("Content-type: application/x-msdownload"); 
Header("Content-Length: ".(string)(filesize("$file")));
Header("Content-Disposition: $dn_yn; filename=$dnfile"); 
Header("Content-Transfer-Encoding: binary"); 
Header("Pragma: no-cache"); 
Header("Expires: 0"); 
}

else 

Header("Cache-Control: ");
Header("Pragma: ");
Header("Content-type: file/unknown"); 
Header("Content-Length: ".(string)(filesize("$file"))); 
Header("Content-Disposition: $dn_yn; filename=$dnfile"); 
Header("Content-Description: PHP3 Generated Data"); 
Header("Pragma: no-cache"); 
Header("Expires: 0"); 


if(is_file($file)) 
{
$fp = fopen($file, "rb"); 
if (!fpassthru($fp)) 
fclose($fp); 

else 

echo "해당 파일이나 경로가 존재하지 않습니다."; 
}
?>

오늘은 DB 테이블의 내용을 읽어서 화일로 저장하는 방법을 알아 보겠습니다. 

테이블의 내용을 화면에만 뿌려주면 나중에 실제 데이타를 사용해야 할 일이 있을때 많이 불편하거든요 
그래서 만들어 낸것이 CSV(Comma Separated Values) 포맷을 이용해 화일로 만들고 이것을 받아서 
EXCEL 등에서 사용하는 것 입니다. 
CSV 포맷은 각각의 필드가 콤마(,)로 분리된 일반 텍스트입니다. 


우선 이름,국어,영어,산수,음악의 필드를 가진 점수 테이블을 만듭니다. 

create table score( 
name char(10), 
korean int , 
english int , 
math int , 
music int 
); 
insert into score values('진호',91,95,88,72); 
insert into score values('영수',88,98,100,85); 
insert into score values('철수',100,78,91,76); 
insert into score values('희동',95,76,67,95); 
insert into score values('둘리',78,66,82,100); 


특별히 어려운 점은 없고 테이블 내용을 화면에 써주는 대신 화일로 써주는 것 뿐입니다. 
한가지 주의할점은 파일이 생성되는 디렉토리의 퍼미션이 웹서버에게 쓰기 가능하도록 해 주셔야 합니다 
# chmod 777 ./CSV 처럼요 

아래는 소스 입니다.





//=============DB 접속 ======================== 
$connect=mysql_connect( "", "mysql", "") or die( "SQL server에 연결할 수 없습니다."); 
mysql_select_db("test",$connect); 

// ===================화일 생성============= 
$que1=" select * from score " ; 
$result=mysql_query($que1,$connect ); 

if(file_exists('/score.csv')) 
{ unlink('./score.csv'); } // 만일 이전에 만든 화일이 있으면 지운다 

$newline = chr(10); // LF(줄바꿈)의 ascii 값을 얻는다. 

$fp = fopen( "./score.csv", "w" ) or die("./score.csv 화일을 열수 없습니다") ; 
// score.csv 를 새로 연다 

fwrite($fp,"이름,국어,영어,산수,음악"); // 타이틀 쓰고 
fwrite($fp,$newline); // 줄바꾸기 

$row=mysql_fetch_array($result); 

while($row) 

fwrite($fp,$row[0].",".$row[1].",".$row[2].",".$row[2].",".$row[2]);
// 점수를 한줄씩 쓰고 
fwrite($fp,$newline);
// 줄 바꾸기 
$row=mysql_fetch_array($result); 

fclose($fp); 
//===================== 화일 쓰기 끝 ============== 

echo ("

CSV 파일로 저장하기

"); 
echo (" 저장FILE : score.csv "); 

?> 

// phpschool

+ Recent posts