728x90

미리보는 프로젝트 완성코드 -->https://github.com/leeceo97/python_community

 

이번 유저 회원가입 로그인 기능을 만들기전 알아야 할것은 세션과 쿠키의 개념입니다. 

아래의 사이트에 자세히 설명이 나와있으니 반드시! 이해하고 구현을 해주셨으면 합니다.

 

쿠키(Cookie) 그리고 세션(Session)

 

nesoy.github.io

1. 템플릿 구성

장고는 서버언어로써 눈에 보이는 프론트엔드 영역이 아닌 백엔드 영역입니다. 그래서 눈에 보이는 영역인 프론트엔드부분은 templates폴더를 따로 만들어 관리합니다. MVC패턴중 V를 담당한다고 알아주시면 될것 같습니다.

 

accounts폴더안에 templates폴더를 만드신 후 안에 register.html, login.html, base.html파일을 만들어주세요.

그럼 위와 같이 파일이 구성될것이고 각파일의 소스는

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="/static/bootstrap.min.css">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>
    <title>Document</title>
</head>

<body>
    <div class="container">
        {% block contents %}
        
        {% endblock %}
    </div>
</body>
</html>

register.html

{% extends "base.html" %}
{% block contents %}
        <div class="row mt-5">
            <div class="col-12 text-center">
                <h1>회원가입</h1>
            </div>
        </div>
        <div class="row mt-5">
            <div class="col-12">
                {{ error }}
            </div>
        </div>
        <div class="row mt-5">
            <div class="col-12">
                <form method="POST" action=".">
                    {% csrf_token %}
                    <div class="mb-3">
                        <label for="username" class="form-label">사용자 이름</label>
                        <input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username">
                    </div>
                    <div class="mb-3">
                        <label for="useremail" class="form-label">사용자 이메일</label>
                        <input type="text" class="form-control" id="useremail" placeholder="사용자 이메일" name="useremail">
                    </div>
                    <div class="mb-3">
                        <label for="password" class="form-label">비밀번호</label>
                        <input type="password" class="form-control" id="password" placeholder="비밀번호" name="password">
                    </div>
                    <div class="mb-3">
                        <label for="re_password" class="form-label">비밀번호</label>
                        <input type="password" class="form-control" id="re_password" placeholder="비밀번호 확인" name="re_password">
                    </div>
                    <button type="submit" class="btn btn-primary">등록</button>
                </form>
            </div>
        </div>
        {% endblock %}

login.html

{% extends "base.html" %}
{% block contents %}
        <div class="row mt-5">
            <div class="col-12 text-center">
                <h1>로그인</h1>
            </div>
        </div>
        <div class="row mt-5">
            <div class="col-12">
                {{ error }}
            </div>
        </div>
        <div class="row mt-5">
            <div class="col-12">
                <form method="POST" action=".">
                    {% csrf_token %}
                    <div class="mb-3">
                        <label for="useremail" class="form-label">사용자 이메일</label>
                        <input type="text" class="form-control" id="useremail" placeholder="사용자 이메일" name="useremail">
                    </div>
                    <div class="mb-3">
                        <label for="password" class="form-label">비밀번호</label>
                        <input type="password" class="form-control" id="password" placeholder="비밀번호" name="password">
                    </div>
                    <button type="submit" class="btn btn-primary">로그인</button>
                </form>
            </div>
        </div>
{% endblock %}

위에서 의문점이 base.html이 무엇이냐?라는 생각이 들수 있을겁니다.

웹페이지를 제작하다보면 헤더 부분과 푸터 부분의 디자인은 똑같은 경우가 많습니다. 그리고 지금처럼 부트스트랩을 연결 코드를 파일하나하나 쓰기에는 귀찮기도 하고 이때 중복되는 코드들은 base.html에 적어주신뒤 바뀌는 내용 즉 body부분은 {% block contents %} ~ {% endblock %}로 처리한뒤 다른 html 파일에서 {% extends "base.html" %}로 임포트 해주시고 {% block contents %} ~ {% endblock %}안에 넣어주시면 되는 구조입니다. 

 

그리고 부트스트랩 코드를 이용하기 위해서는 2가지 방법이 있습니다. html head부분에 부트스트랩 주소를 임포트 하거나 부트스트랩 파일을 다운받아 static폴더에 저장하여 사용하는 방법이 있는데 이번 프로젝트는 후자의 방법을 사용하겠습니다. 아래의 사이트에 접속해 마음에 드는 스타일을 선택한뒤 다운 받아 주시길 바랍니다.

 

Bootswatch: Free themes for Bootstrap

Customizable Changes are contained in just two SASS files, enabling further customization and ensuring forward compatibility.

bootswatch.com

루트 위치에 static 폴더를 생성후 안에 다운받은 css파일을 넣어주세요.

base.html 파일의 head부분 소스를 보시면 

<link rel="stylesheet" href="/static/bootstrap.min.css">

이부분이 있는데 static 파일의 css파일을 임포트 한걸 알수 있습니다.

 

이후, community/setting.py로 이동하셔서

import os

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

css파일 즉, 스타일 소스들을 모아둔 파일을 바라볼수 있는 위치를 static으로 연결하겠다는 의미입니다. 위의 소스를 추가해 주시면 프론트 엔드부분의 준비는 끝이 났습니다.

 

2. url연결

일단 accounts/views.py에 아래의 코드를 추가해주세요.

from django.shortcuts import render
from django.http import HttpResponse

def home(request):
    return HttpResponse("Hello!")

def register(request):
    return render(request, 'register.html')

def login(request):
    return render(request, 'login.html')

def logout(request):
    pass

간단한게 url에 템플릿을 연결시키는 코드를 테스트로 작성한거니 설명은 넘어가겠습니다.

 

community/urls.py

from django.contrib import admin
from django.urls import path, include
from accounts.views import home

urlpatterns = [
    path('', home),
    path('admin/', admin.site.urls),
    path('accounts/', include('accounts.urls')),
]

여기서 include는 accounts.urls에 연결된 url은 앞에 accounts를 포함한 url이라는 뜻입니다. 쉽게 말해 accounts.urls에 연결된 url이 test1, test2가 있다면 각각의 url에 접속하기 위해서는 accounts/test1, accounts/test2로 접속을 해야한다는 의미입니다.

 

마지막으로, accounts폴더에 urls.py를 생성한후 아래의 코드를 추가해주세요.

from django.urls import path
from .views import register, login, logout
urlpatterns = [
    path('register/', register, name='register'),
    path('login/', login, name='login'),
    path('logout/', logout, name='logout'),
]

임포트한 views.py에서 생성했던 register, login, logout 함수를 임포트해준뒤 각각을 연결해준것입니다. name은 나중에 템플릿이나 view에서 유용하게 사용 될것입니다. 

 

3. 마무리 멘트

글이 생각보다 길어져서 로그인 파트는 총 3파트로 나누어 포스팅 하겠습니다. 처음 하시는 분이라면 욕심내서 하루에 다하려고 하시기 보다는 1~2개의 글을 하루에 마스터 한다는 생각으로 따라치기만 하기보단 코드를 몸으로 익히는 연습을 해보시는게 좋을것 같습니다! 처음에도 말했지만 중간에 포기하지말고 오류가 뜨더라도 해결하기 위해서 구글링 하는 습관 들여보시는게 좋을겁니다! 화이팅입니다!! 감사합니다:)

728x90
728x90

미리보는 프로젝트 완성코드 -->https://github.com/leeceo97/python_community

 

1. 프로젝트/ 앱 생성

일단 django를 사용하기 위해서는 가상환경폴더에 django를 인스톨 해줘야 한다. 

터미널 창에 pip install django를 입력하여 django를 설치해준후

django-admin startproject community . 을 입력하여 프로젝트 폴더를 생성해준다.

여기서 뒤에 붙은 .은 앞으로 우리가 생성될 manage.py를 사용하여 데이터베이스에 적용및 여러 조작명령어를 사용할껀데 manage.py와 프로젝트 폴더를 루트 폴더에 위치 시키겠다는 이야기다. 

생성된 community폴더에는 

위와 같이 구성이 되어있을껀데 여기서 우리가 주로 사용한 파일명은 settings.py와 urls.py이다.

간단히 말해 settings.py는 우리가 앞으로 설치할 앱이나 추가적인 설치파일 관리 및 데이터베이스 템플릿폴더등 프로젝트 전반에 걸쳐 설정하는데 관여할것이고 urls.py는 프로젝트 전체의 url을 관리해준다 생각하면 된다.

 

이제는 실질적인 기능을 할 앱들을 만들어 주면된다. 우리는 크게 2가지 앱을 생성할것이다. 유저의 회원가입, 로그인, 권한등을 관리할 accounts앱, 게시판 기능을할 boards앱을 만들어준다.

python manage.py startapp accounts

python manage.py startapp boards

를 입력하여 앱을 생성해준다.(주의할점: manage.py를 사용하기위해 터미널창에서 현재 위치에 manage.py가 위치하여야 한다.)

그럼 위와 같이 폴더가 구성 되어있을것이다.

앱을 생성한 이후엔 community/settings.py에 들어가 INSTALLDE_APPS에 생성한 앱을 반드시 등록해줘야 합니다.

사실 초기에 settings.py에 초기설저엔 SECRET_KEY 숨기기, 데이터베이스,시간 설정과 같은 작업들을 해줘야 이번 프로젝트는 튜토리얼 단계이므로 건너뛰고 다음에 해보도록 하겠습니다.

 

2. accounts모델 생성

Accounts/models.py에 들어가 아래와 같이 작성해준다.

from django.db import models

class User(models.Model):  # 1
    username = models.CharField(max_length=64)
    useremail = models.EmailField(max_length=64)
    password = models.CharField(max_length=64)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self): # 2
        return self.username

    class Meta: # 3
        db_table = 'community_user'
        verbose_name = '커뮤니티 사용자'
        verbose_name_plural = '커뮤니티 사용자'

위에서 부터 차근차근 설명하면 

# 1부분은 전형적인 python 클래스 선언문으로 User라는 이름의 클래스를 선언한후

유저의 이름이 들어갈 username은 charfield로, 유저의 이메일 즉 아이디로 사용할 useremail은 emailfield등으로 설정한 것이고 created_at는 생성한 시간으로 datetimefield를 썻다. 나머지는 알것이라 생각 되고 DateTimeField부분의 auto_now_add=True의 뜻은 유저가 생성된 바로 그시간에 저장됨을 나타낸다. 보통 사용되는 auto_now=True같은 경우는 수정된 시간을 나타내는 것으로 이후 우리가 boards모델을 작성할때 쓰이게 될것입니다. 간단히 말하면, auto_now_add는 최초 생성한 시간을 auto_now는 모델이 save될때마다 변경되는 시간이라고 알면 될것입니다.

 

# 2부분은 이후 들어가볼 admin페이지에서 새로운 유저가 등록될때마다 User object(1)과 같이 원래 유저를 표시하는데

# 2부분을 추가할 경우, 생성된 유저의 username으로 바뀌어 나옴을 알수 있을겁니다. 제대로 이해가 가지 않는다면 처음엔 지우고 어드민 페이지에 들어가 확인을 해본후 설정하고 확인을 해보시면 확실히 알수 있을겁니다.

 

# 3부분은 등록된 데이터베이스의 테이블 명을 설정해주고 verbose_name은 가시적으로 표시될 어드민페이지의 이름명을 커뮤니티 사용자라고 입혀준것이고 plural은 복수형으로 나타날 이름을 커뮤니티 사용자로 통합해준거라고 생각하시면 됩니다.

 

3. accounts 모델 적용

데이터베이스에 이제 테이블을 생성해준다고 생각하면 된다. 명령어로는

1. python manage.py makemigrations accounts

2. python manage.py migrate accounts

3. python manage.py migrate

위의 순서대로 하나씩 해주면된다. 

1번의 경우, accounts/models.py에 저장한 모델을 등록전 테이블 양식을 생성해주는것이다.

2번의 경우, 생성해준 테이블양식을 적용하는절차이다.

3번의 경우, 앱의 모델이 아닌 전에 설정한 settings.py와 그 외의 데이터베이스에 들어갈 변경사항을 적용시키는 절차입니다.

 

4. 관리자 계정 생성 및 어드민페이지 등록

터미널창에 python manage.py createsuperuser 를 입력후 절차에 따라 관리자 계정을 생성해줍니다.

이후에 accounts/admin.py에 들어가서

from django.contrib import admin
from .models import User

admin.site.register(User)

위와 같이 입력해줍니다. 간단히 말해 .models -> 현재 폴더내의 models파일로부터 User클래스를 임포트 해와서

사이트를 등록해준다는걸 의미합니다. 

 

python manage.py runserver 명령어를 통해 서버를 활성화 시킨후 http://127.0.0.1:8000/ 주소로 접속하면 

위와 같이 접속이 가능하고 http://127.0.0.1:8000/admin 주소로 이동후 전에 등록한 관리자 계정으로 로그인하면

위와 같이 나오는것을 알수 있습니다. 

 

5. 마무리 멘트

이번 챕터에서의 과정은 앞으로 수많은 프로젝트를 실행할때 필연적으로 사용되는 방식이기때문에 이번 챕터는 반드시 알아 갔으면 좋겠습니다. 명령어들이야 여러번 사용하다보면 자연스럽게 외워 지겠지만 어떻게 작동하는지에 대한 부분은 숙지 하셔야 합니다. 특히 2번 모델 필드 같은경우는 아래의 사이트에 가면 이번에 사용된것 이외에도 설명이 잘나와 있으니 참고하셔도 좋을것 같습니다! 감사합니다:)

 

Django 모델의 필드

장고의 모델(db)에는 다양한 필드가 존재한다ID(pk)로 사용 가능한 자동으로 증가하는 IntegerField다. 직접 사용할 필요는 없다. 모델의 기본키 필드는 별도로 지정하지 않으면 자동으로 추가됨.AutoFi

velog.io

 

728x90
728x90

미리보는 프로젝트 완성코드 -->https://github.com/leeceo97/python_community

 

1. 프로젝트 소개

뭐 거창하게 프로젝트라고 설명할것은 없지만 모든 프로젝트에 있어 기본적이 기능들이 들어가 있는 간단한 게시판 기반 커뮤니티 사이트를 만들예정입니다. 백엔드에 초점을 맞춰 진행할 예정이기 때문에 그냥 프론트는 부트스트랩으로 제작하겠습니다.

 

2. 가상 환경 구성

cmd 창에서 위와 같이 바탕화면에서 community 이름의 프로젝트 폴더를 만들어 줍니다.

이후, 프로젝트 폴더 위치로 이동한후

 

venv란 이름의 가상환경 파일을 생성 합니다. 

venv 폴더의 scripts안에있는 activate.bat 파일을 활성화 시킴으로써 가상환경 세팅이 완료됩니다.

이후부턴 활성화된 cmd창에 code를 입력해 vscode의 터미널에서 프로젝트를 진행하면 됩니다.

 

3. 마무리 멘트

앞으로 블로그 글을따라 진행하다보면 많은 오류가 뜨고 그냥 따라치기만 한다는 생각이 들것입니다. 오류가 발생한다고 그만두는게 아닌 그걸 해결하기 위해 구글링을 해보고 코드를 고쳐 가다보면 시간낭비가 아닌 자신의 것이 될테고 따라치기만 하는게 아닌 하루에 한개의 포스팅 이라도 정복한다는 마음가짐으로 하나하나의 의미를 이해하고 기록하며 공부해가길 바랍니다!! 이건 저한테 하는 소리이기도 합니다ㅎㅎ 다들 화이팅!

728x90
728x90

배열의 크기 N, 숫자가 더해지는 횟수 M, 똑같은 수가 더해지는 최대의 수 K라 할때 입력받은 N중에서 가장M번을 더하여 가장 큰 숫자가 나올수 있는 경우의 수를 구하라.(각자연수는 공백으로 구분한다.)

n,p,k=map(int, input().split())
number = list(map(int, input().split()))

number.sort()
number.reverse()
first=number[0]
second=number[1]
result=0

while True:
	for i in range(k):
    	if m==0:
        	break
        result += first
        m-=1
    if m==0:
    	break
    result+=second
    m-=0
    
print(result)

여기서 중요한 함수는 자료형을 입력받는 map함수와 입력받은 수를 정렬하는 sort함수이다.

map(자료형, 입력받는 방식)으로 입력하면 여러 변수를 내가 설정한 자료형과 방식으로 변경하여 입력받을 수 있고 sort함수를 통해 무작위로 입력받은 값들은 오름차순으로 정렬할수 있다. 그 이후부터는 while반복문을 통해 무한반복으로 설정한 조건에 따라 break문으로 반복문을 종료시킴으로써 원하는 값을 얻을수 있다.

728x90

'기술 > 알고리즘' 카테고리의 다른 글

자료구조(2)-링크드리스트(LinkedList)  (0) 2022.01.21
자료구조(1)-큐와 스택  (0) 2022.01.19
코딩테스트(0)- 자료구조/알고리즘이란?  (0) 2022.01.19
코딩테스트 준비  (0) 2022.01.19
그리디(1): 거스름돈  (0) 2021.05.21
728x90

당신은 음식점의 계산을 도와주는 점원이다. 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정한다. 손님에게 거슬러 줘야 할 돈이 N원일 때 거슬러 줘야 할 동전의 최소 개수를 구하라. 단, 거슬러 줘야할 돈 N은 항상 10의 배수이다.

n = 2860
count = 0
coin_type = [500,100,50,10]
for coin in coin_type:
	count += int(n/coin)
	n %= coin
print(count)

여기서 알아야 할점은 int() 이다. int는 정수형으로 정수만을 출력할수 있는데 처음 애먹었던 부분이 count에 동전의 개수를 저장해야하는데 처음 500원의 몫은 소수까지 나와서 어려웠다. 답은10이 출력되었다.

728x90
728x90

프로젝트 목차에서 가장 먼저 설명해야 할것은 일단 개발자들이 협업때 소통하는 방식이다.

필자의 경우, 가장 중요한 팀원들을 캠퍼스픽 이라는 대학생 스터디 모집란에서 모집하였다.

 

캠퍼스픽

대학생 커뮤니티, 동아리, 공모전, 대외활동 등 즐겁고 유익한 정보가 한 곳에!

www.campuspick.com

가장 쉬운 방법은 it연합동아리에 들어가는 것인데 일단 어느정도 실력이 갖춰진 사람들을 모집하기 때문에 처음 프로젝트 팀원을 모집할때는 캠퍼스픽을 통해 구하는것도 나쁘지 않아보인다.

처음 모집할때의 글이였다.

처음 협업을 하다보니 어떻게 무엇부터 해야할지 몰랐지만 일단 크게 3가지의 협업 방식이 있다고 생각한다.

첫번째는 깃허브다. 

위와 같이 한명이 레포지토리를 만들어 각각의 팀원들을 초대하고 그곳에 서버, 디자인, 웹, 안드로이드의 디렉터리를 생성후 각자의 브랜치를 만들어 서로 만나지 않을때는 그주차에 해당하는 작업량을 수행할때마다 자신의 브랜치에 push를하고 정기적으로 정해진 날짜에 맞춰 서로의 코드를 확인하고 문제가 없다고 생각될때 master브랜치에서 merge를 하는 식으로 협업을 진행하였다.

 

두번째 방식부터는 협업을 좀더 원활하게 해주는 역할이므로 깃허브가 필수 였다면 이제부터는 선택의 분야이다.

두번째는 노션이다.

 

Notion – 메모, 작업, 위키, 데이터베이스를 위한 올인원 워크스페이스.

매일 쓰는 여러 업무용 앱을 하나로 합친 새로운 도구. 당신과 당신의 팀을 위한 올인원 워크스페이스예요.

www.notion.so

노션은 개발자들의 협업 뿐만아니라 스타트업들도 각자 회사의 정보나 채용 공고를 보여주는데 많이 사용이 된다.

필자의 경우 크게 팀작업 공간, 개인작업 공간, 일정으로 나눈후 팀작업 공간에는 위와 같이 ToDo라는 페이지에서는 현재 프로젝트에서 진행해야할 업무를 나열하고 진행전, 진행중, 작업완료로 나눠 전체적인 진행 상태를 나타냈고

개인 작업공간에서는 팀원 각자의 진행률 페이지를 만들어 각자 작업상태를 나타내는데 사용하였다. 노션을 사용하는 가장 큰 이유라고 생각된다. 

 

세번째는 슬랙이다.

 

새 HQ에 오신 것을 환영합니다.

Slack은 여러분의 팀과 소통할 새로운 방법입니다. 이메일보다 빠르고, 더 조직적이며, 훨씬 안전합니다.

slack.com

사실 필자의 경우, 대부분의 소통을 카카오톡으로 진행하기 때문에 아직까진 제대로 활용을 하지는 않고 있지만 주된 기능중하나가 코드를 가져올수 있어 피드백을 하는데 도움이 되고, 무엇보다 노션에서 변경사항이 있다면 슬랙에 즉각적으로 알림이 가기때문에 많이 사용한다고 생각된다. 이외에도 슬랙이 가지는 이점들이 많을 텐데 이건 조금씩 이용을 해보며 알아가봐야겠다. 

 

후기

사실 프로젝트 팀원을 필자가 처음 모집하였고 팀장이라는 직책을 가지고 있다보니 팀원들보다 협업의 방식에 대해 좀더 공부가 되어있어야 한다고 생각되서 알아본건데 무조건 위의 세가지 방식을 사용해라! 라기보다는 팀원들과 소통을 하며 각자에게 도움이 되는 방식을 적용시키는것이 가장 중요한것이라 생각된다. 위의 방식은 도구일뿐 협업에 있어서 가장 중요한것은 실제로 일어나는 소통에 집중을 하여야 한다는것을 잊어서는 안된다.

728x90
728x90

1. MYSQL설치

다운로드 방법에 대해서는 

 

윈도우10 MySQL Community Server 설치하기

윈도우10 MySQL Community Server 설치하기 환경: Windows10 MySQL 은 많은 곳에서 쓰이고 있는 인기 있는 데이터베이스입니다. 무료 개발 버전을 제공하기 때문에 DB 테스트가 필요한 경우 주로 이용하고 있

mainia.tistory.com

이블로그에 자세히 설명되어 있으므로 참고하면 될듯하다.

 

2. 실행

다운로드를 모두 받고 나면 실행방법은 총 2가지가 존재한다.

-cmd창

시작메뉴의 cmd창을 켠후 해당 디렉터리로 이동해야하므로

cd C:\Program Files\MySQL\MySQL Server 8.0\bin 입력하여 실행해준다(위블로그대로 했다면 문제없이 진행될거다.  만약 되지않는다면 경로상의 문제이므로 직접 위치를 찾아서 경로를 설정해주면 된다.)

그후 mysql -u계정명 -p 를 입력하면 다운로드하면서 설정한 비밀번호를 입력해주면 클라이언트를 실행할수있다.

-직접 실행

필자는 이방법을 많이 사용한다.(편하기때문)

시작 메뉴에서 클라이언트를 클릭해 직접실행하는방식이다. 방법설명은 따로없다 이미지를 참고하자.

이제 모두 다운로드및 실행방법을 알아봤으니 다음부터 제대로 실습을 시작해보면 되겠다.

728x90
728x90

1. 데이터베이스에있어 KEY란?

MYSQL과 같은 관계형 데이터베이스에는 중요한 키라는 것이 존재한다.

 

  여러 종류 키에 관해 설명하기전, 릴레이션(realation)에 관해 간단히 정리하자면 같은 성격의 데이터들의 집합을 의미하며 릴레이션은 각행을 의미하는 튜플(tuple)과 이름을 가진 하나의 열을 말하는 에트리뷰트(attribute)로 데이터를 정렬하여 관리한다.

  이러한 릴레이션의 특징 중 이번 과제와 관련이 있는 (key)가 있는데 키란, 릴레이션을 구성하는 튜플을 고유하게 식별할 수 있는 하나 이상의 애트리뷰트들의 모임을 뜻한다. 키의 종류는 수퍼키(super key), 후보키(candidate key), 기본키(primary key), 대체키(alternate key), 외래키(foreign key)로 총 5가지가 있다.

 

  첫번째, 수퍼키는 한 릴레이션 내의 특정 튜플을 고유하게 식별하는 애트리뷰트 또는 애트리뷰트들의 집합으로, 예를 들어 회사의 사원의 릴레이션에서 사원번호+이름 또는 사원번호가 수퍼키가 될 수 있다. 하지만 이러한 수퍼키는 투플들을 고유하게 식별하는데 꼭 필요하지 않은 애트리뷰트들을 포함할 수 있다는 점이 있다.

  두번째, 후보키는 각 튜플을 고유하게 식별하는 최소한의 애트리뷰트들의 모임으로 사원번호는 사원 릴레이션의 후보 키가 되지만 사원번호+이름은 사원 릴레이션의 후보키가 아니다. 따라서, 후보키는 유일성만 만족하는 슈퍼키와는 다르게 유일성, 최소성을 모두 만족해야 하며 모든 릴레이션에는 최소 한 개 이상의 후보 키가 있고 후보키는 두개 이상의 복합 애트리뷰트로 이루어 질 수가 있다.

  세번째, 기본키는 한 릴레이션에 후보 키가 두 개 이상 있으면 설계자 또는 데이터베이스 관리자가 이들 중에서 하나를 기본 키로 선정하는 것으로, 사원 릴레이션에서 사원번호와 이메일 주소가 후보키가 될 수 있는데 관리자의 임의사원번호를 기본키로 선정할 수 있다. 만약 한 릴레이션에서 기본키를 찾을 수 없는 경우에는 레코드 번호와 같이 종종 인위적인 키 애트리뷰트를 릴레이션에 추가할 수 있으며, 기본 키로 지정된 애트리뷰트들은 모든 튜플에 대해 널(null)값을 가질 수가 없다. 따라서, 기본키는 후보키가 만족해야 하는 유일성, 최소성 뿐만 아니라 값에 대해 not null또한 만족하여야 한다.

  네번째, 대체키는 간단하게 기본키가 아닌 후보키로 관리자가 사원번호와 이메일 주소 중에 사원번호를 기본 키로 선정하면 이메일 주소가 대체키가 되는 것이다.

  마지막, 외래키다른 릴레이션의 기본키를 참조하는 애트리뷰트이며 릴레이션 간의 관계를 나타내기 위해 사용되는 키로 이를 유형과 함께 설명할 수 있다. 외래키는 사원 릴레이션에서 기본키가 사원 번호이고 부서명이 기본키는 아니지만 회사의 조직도를 나타내는 릴레이션에서 부서명이 기본키가 되어 참조되어 다른 릴레이션의 기본키를 참조하는 역할을 한다. 또한 사원 릴레이션에서 사수의 사원번호가 애트리뷰트로 존재한다면 이는 기본키가 될 수는 없겠지만 일반사원의 사원번호는 일반키가 되고 사수의 사원번호키가 기본키의 값을 가져와 하나의 릴레이션에서 외래키가 기본키를 참조하는 역할을 한다.

  정리하자면, 튜플과 애트리뷰트로 구성되어 있는 릴레이션에서 키는 이들을 구별해주는 중요한 역할을 한다는 것이다.

 

2. 무결성이란?

  키에 관해 공부하다보면 중요한 개념이 개체 무결성, 참조 무결성이 있다.

  개체 무결성(Entity Integrity)은 릴레이션의 기본키를 구성하는 속성은 NULL일수 없다는 것이다. 기본키는 하나의 릴레이션에서 속성들을 구별해주는 가장 중요한 대표 역할을 하므로 유일성, 최소성 뿐만 아니라 값에 대해 not null또한 만족해야 하는데 이것이 개체 무결성과 연관 지어지는 이유이다. 정리하자면 개체 무결성은 기본키에 속해 있는 속성은 절대 널(Null)값을 가질수 없다는것과 기본키에 속해 있는 속성은 중복 값을 가질 수 없음을 뜻하는 것이다.

  참조 무결성(Referential Integrity)은 릴레이션은 참조할 수 없는 외래키 값을 가질 수 없다는 것을 말한다. 외래키는 다른 릴레이션의 기본키를 참조하나는 애트리뷰트이며 릴레이션 간의 관계를 나타내기 위해 사용되는 키로 참조 무결성에 의해 외래키 값은 NULL이거나 참조 릴레이션의 기본키 값과 동일해야 한다는 규정 제약 조건은 참조 할수 없는 외래키를 가질수 없다는 것과 외래키는 NULL이거나 참조하는 테이블의 기본키와 같은 값이어야한다. 참조되는 테이블의 행을 이를 참조하는 참조키가 존재하는한 삭제될수 없고 기본키도 변경될수 없음을 뜻한다.

 

이밖에도 데이터베이스의 이론에는 여러가지가 더있지만 학습중 가장 중요해보이는 것들을 간단하게 2차시로 구성하여 적어 봤다. 다음 차시부터는 MYSQL설치부터 시작하여 실습에 관한 내용을 다뤄볼것이다.

 

728x90
728x90

학교에서 수강했던 데이터베이스 수업간 배웠던 MYSQL에 대해 포스팅을 하려한다. 

초반엔 과제를 하며 중요하다 생각했던 정의에 대해 2차시정도로 축약하여 설명한후 그 이후부터는 실습에 관련한 내용들을 주로 다뤄볼생각이다.

 

1. 데이터베이스 정의

특정 조직의 업무를 수행하는데 있어 작동하고 있는 데이터들의 모임을 데이터베이스라고 정의한다. 이러한 데이터베이스의 구성요소는 크게 개체(entity), 속성(attribute), 관계(relationship)로 크게 3가지로 나뉜다.

 

  첫번째, 개체(entity)의 경우 업무가 다루는 사물(대상)을 가리 키는 것으로 데이터베이스에서 표현하려는 객체로서 서로 구별되는 것을 뜻한다. 대학교를 예로 들면 교수, 학생, 과목이 데이터베이스에서의 개체라고 할 수 있다.

  두번째, 속성(attribute)의 경우 각 사물(대상)이 가지고 있는 상세한 특성으로 즉, 하나의 개체는 하나 이상의 속성으로 구성되어 그 개체의 특성을 설명해주는 지표가 되는 것이다. 예로 들면 교수라는 개체는 교수번호, 교수이름, 전공, 학과로 학생은 학번 이름, 학년, 학과로 과목은 과목번호, 과목이름, 학점이란 속성들로 구성되어 각각의 개체를 구성한다.

  마지막, 관계(relationship)의 경우 업무가 다루는 사물들 사이에 존재하는 연관으로 즉, 각각의 개체 또는 개체 집합들 사이의 관계를 나타내는 것이다. 예로 들면 교수와 학생은 지도라는 관계, 교수와 과목은 강의라는 관계, 학생과 과목은 등록이라는 관계로 이루어 진다 할 수 있다.

  정리하자면, 각각의 속성을 가진 개체들이 관계를 가지고 모여 만들어진 모임을 데이터베이스라고 한다.

 

2. 데이터베이스의 특징

데이터 베이스의 특징은 크게 6가지로 표현할 수 있다.

 

  첫번째, 실시간 접근성(Real-Time Accessibility)로 질의에 관해 실시간으로 처리 및 응답이 이루어져야 한다.

  두번째, 계속적인 변화(Continuous Evolution)로 데이터베이스는 만든 이후 정적인 것이 아닌 계속해서 새로운 데이터가 갱신, 삭제, 삽입 등의 동적인 특성을 가짐으로써 항상 최신의 상태를 유지하여야 한다. 물론 동적인 특성을 띔과 동시에 정확성 또한 유지해야 한다.

  세번째, 동시 공용(Concurrent Sharing)으로 데이터베이스는 여러 사용자들이 동시에 사용하는 것이므로 다수의 사용자가 동시에 같은 데이터를 이용할 수 있어야 한다.

  네번째, 내용에 의한 참조(Content Reference)로 데이터 베이스는 위치나 주소가 아닌 체중, 신장과 같은 사용자가 요구하는 데이터의 내용으로 데이터를 찾아낸다.

  다섯째, 지속성(Persistent)로 데이터 베이스는 한번 데이터를 생성하고 나면 일부러 저장매체를 훼손하지 않는 한 소멸하지 않고 지속된다.

  마지막, 상호 관련성(Inter-Related)로 데이터 베이스는 각 개체들이 서로 관계를 맺어 만들어 진다는 상호 관련성을 띈다는 특징이 있다.

 

데이터 베이스는 어떠한 성질을 가지고 있는 데이터들이 모여 있는 것으로 크게 4가지로 정의할 수 있다.

  첫번째, 통합된 데이터(Integrated Data)로 자료의 중복을 최소로 통제한다는 뜻을 가진다. 중복을 완전히 없애기는 중복이 없을 경우 다른 테이블 사이에 연관을 할 수가 없기에 불필요한 자료의 중복을 최소화한다.

  두번째, 저장된 데이터(Stored Data)로 말그대로 컴퓨터가 접근 가능한 저장매체(테이프, 디스크 등)에 저장된 자료라는 뜻을 가진다.

  세번째, 운영 데이터(Operational Data)로 한 조직의 고유 업무를 수행하기 위해 반드시 필요한 데이터로 단순한 입출력이나 임시 데이터가 아닌 존재목적이 뚜렷한 데이터 라는 뜻을 가진다.

  마지막, 공용 데이터(Shared Data)로 한 조직의 여러 응용 프로그램이 공동으로 소유, 유지, 이용하는 데이터라는 뜻을 가진다.

  정리하자면, 데이터베이스란 한 조직의 여러 응용 시스템들이 공용(shared)하기 위해 통합(integrated), 저장(stored)한 대용량(large)운영(operational)데이터의 집합이다.

 

3. DBMS란?

DBMS 제품을 설명하기전에 간단히 데이터베이스의 종류에 대해 나눠보자면 크게 계층형 데이터베이스, 네트워크형 데이터베이스, 관계형 데이터베이스로 나눌 수 있다.

 

  계층형 데이터베이스는 데이터의 관계를 트리 구조로 정의하고, 부모,자식 형태를 갖는 구조로써 상위의 레코드가 복수의 하위 레코드를 갖는 구조이다. 하지만 데이터의 중복이 생긴다는 문제점이 있다.

  네트워크형 데이터베이스는 계층형 데이터의 데이터중복 문제를 해결했고, 레코드 간의 다양한 관계를 그물처럼 갖는 구조이다. 하지만 복잡한 구조 때문에 추후에 구조를 변경한다면 많은 어려움이 따른다.

  관계형 데이터베이스는 우리가 흔히 표현하는 행(Column), (Record)로 구성된 Table간의 관계를 나타낼 때 사용한다 우리는 이렇게 표현된 데이터를 SQL(Structured Query Language)을 사용하여 데이터 관리 및 접근을 한다.

  이와는 다르게 SQL을 사용하지 않는다는 의미로 NoSQL데이터베이스가 있는데 이번 목차에서는 이러한 SQL데이터베이스인 MYSQL, MS-SQLNoSQL데이터베이스인 MongoDB의 특성에 대해 설명해보려 한다.

 

  첫번째, MYSQL PHP, jsp, 자바 웹 프로그래밍에서 사용되는 일반적인 DBMS이며, MYSQL은 공개용 소프트웨어이기 때문에 누구나 무료로 다운로드 받아 사용할 수 있지만, 상업적인 목적으로 MySQL을 사용하려면 반드시 라이센스를 별도로 구매하여야 한다. MySQL은 무료이면서 처리되는 속도 또한 상당히 빠르고 용이하며, 대용량의 데이터를 처리할 수 있는 장점과 보안에도 뛰어난 특성을 지니고 있다.

  두번째, MS-SQL C# ,asp.net 웹 프로그래밍에서 사용되는 일반적인 DBMS이며, MS-SQL은 많은 기능들이 마법사로 구성되어 있어 SQL을 몰라도 백업,튜닝,스케쥴,복제등의 관리가 가능해 DB관리툴이 편리하며, 트랜잭션 기반으로 완전한 무결성 구축이 가능하고, 여러 단계의 보안레벨을 지원해 뛰어난 보안성을 자랑하는 특성을 지니고 있다.

  마지막, MONGODB는 모드데이터가 JSON형태로 저장되며, 스키마가 없어 이에 따라 필요할 때마다 필드를 추가하거나 제거하는 것이 매우 쉬워졌음을 의미해 개발과정이 매우 단순해지고 빠르게 개발이 가능하게 되었다. key기반의 get, put 뿐만 아니라 다양한 종류의 쿼리들을 제공한다. 그리고 별도의 스토리지 엔진을 통해 파일을 저장할 수 있는 특징이 있으며, 조인과 트랜잭션이 없는 특성을 지니고 있다.

 

  정리하자면, 방식에 따라 여러 종류로 나누어 지더라도 결과적으로 DBMS 응용 프로그램과 데이터의 중재자로서 모든 응용 프로그램들이 데이터베이스를 공유할 수 있도록 관리해 주는 소프트웨어 시스템이라는 것이다.

(나의목표는 일단 MYSQL과 MONGODB를 올해안에 다뤄보는게 목표이다.) 

 

2020.09월기준, ORACLE, MY-SQL, MS-SQL순으로 세계 DBMS시장을 점유하고 있는 것으로 나타났으며 점유율로 나타낼 경우 ORACLE 42%, MY-SQL 19%, MS-SQL 16%로 나타났다. 국내 DBMS시장의 경우 ORACLE60%이상을 점유하고 있는 것으로 나타나 있다. 

*참고문헌 및 사이트
1. DBMS특징 및 구별에 관하여
https://ourcstory.tistory.com/30
https://ykh9300.tistory.com/52
https://siyoon210.tistory.com/130
https://lazyer.tistory.com/27
https://server-talk.tistory.com/29
https://ssmsig.tistory.com/19
https://league-cat.tistory.com/23
2. DBMS 시장 점유율
https://db-engines.com/en/ranking-
728x90
728x90

이렇게 글을 쓰게 된이유는 목표로 삼게된 회사가 있기 때문이다.

언제 들어가게 될지는 몰라도 언젠가는 한번 경험해고픈 회사이다.

그곳은 바로 딜리버리 히어로 라는 회사이다. 

회사의 성장성 연봉 그런걸 제쳐두고 무엇보다 회사의 분위기가

경험해보진 못했지만 그래도 정말 좋아보였고, 백엔드 서버를 파이썬으로

다룬다는게 가장이목을 끌었다. 전글에서 언급했던것 처럼 요즘 파이썬에

푹빠져있는 상황이라 더욱 호감가는 회사이다!!

 

What you will get

  • Python으로 개발하는 대용량 서비스 back-end의 모든 것
  • 공부하고 성장하는 Python 개발자 동료
  • Microservices architecture 구현과 운영 knowhow
  • 우리가 원하는 것을 개발하여 사용자들에게 영향을 주는 서비스를 만드는 경험
  • 급성장하는 회사와 같이 성장하는 기회
  • 전세계 개발자들과의 교류

 

What you will do

  • Open API 기반 서버 시스템의 개발 및 유지보수/운영
  • 대용량 서비스에 적합한 서버 아키텍처 구현/개발
  • Cross-functional team의 일원으로 서비스의 기획부터 출시, 운영까지 전 과정 참여
  • 연동하는 시스템과의 데이터 형식 전환 모듈 작성 및 이를 이용한 작업
  • 글로벌 서비스 프러덕트를 개발하고 전세계 사용자에게 제공

 

What we expect from you

  • Python 개발 경험 있는 분
  • 웹 서비스 개발 경험 있는 분
  • 코드리뷰와 테스트코드 작성을 즐기시는 분 
  • 만 1년 이상의 개발 경력 있는 분

 

그 외 이런 것이 있으면 더 좋겠어요

  • 기초 전산 지식
  • 관계형 데이터베이스(RDBMS)의 이해
  • Web framework (Django, Flask, Spring 등) 또는 ORM 사용 경험

(boards.greenhouse.io/deliveryherokoreatech/jobs/4713964002?gh_src=4f11b4bc2us)

이것이 채용공고에 나와있는 준비사항들인데 하나하나 준비해가야 겠다.

 

 

728x90

+ Recent posts