내배캠 17일차

·2022년 11월 29일
2

내일배움캠프

목록 보기
17/142
post-thumbnail

TODO
타임어택 문제 설명 강의(9~)
DB특강(10~17?)
db연동
git 강의 2주차-1
cs 강의 (http/https)

DB특강(참고)

DB개념

  • 데이터베이스는 한마디로 데이터의 집합.
  • 데이터베이스를 관리하고 운영하는 소프트웨어를 DBMS(Database Management System)
  • 다양한 데이터가 저장되어 있는 데이터베이스는 여러 명의 사용자나 응용 프로그램과 공유하고 동시에 접근이 가능.

DBMS

  • SQL: DBMS에서 사용하는 언어
    간단하게 SQL은 틀이 잡혀있는 덜 유연한 언어, NoSQL은 틀이 잡혀있지 않아 유연한 언어
  • mysql naming convention 참고 링크
  • DBMS 종류
    • 계층형 DBMS
    • 망형 DBMS
    • 관계형 DMBS
      • 관계형 DBMS(Relational DBMS)는 줄여서 RDBMS라고 부릅니다. MySQL뿐만 아니라, 대부분의 DBMS가 RDBMS 형태로 사용됩니다. RDBMS의 데이터베이스는 테이블(table)이라는 최소 단위로 구성되며, 이 테이블은 하나 이상의 열(column)과 행(row)으로 이루어져 있습니다.

DB생성

-- 데이터베이스 생성
CREATE database sparta_test;
use sparta_test;
-- 학생 테이블 생성
CREATE TABLE student(
	id int PRIMARY KEY AUTO_INCREMENT,
	name varchar(50) NOT NULL,
	email varchar(50) UNIQUE
	);

-- 도시 테이블 생성
CREATE TABLE city(
	id int PRIMARY KEY AUTO_INCREMENT,
	name varchar(50) NOT NULL
	);

-- 도시 데이터 입력
insert into city (name)
values("서울"),("도쿄"),("상하이"),("뉴욕"),("파리");

-- 학생 데이터 생성
insert into student (id, name, email)
values(1, "정지우", "wldn0229@naver.com");

-- 학생 테이블 수정 (city_id 추가)
ALTER TABLE student ADD column city_id int, ADD CONSTRAINT `fk_city_table_id` FOREIGN KEY student(city_id) REFERENCES city(id);

-- 학생 이메일 수정
update student set email = null where id = 1;

-- 학생 데이터 삭제
DELETE
FROM
	student
WHERE
	id = 1;
	
-- 전체 학생 조회
SELECT
	*
FROM
	student s
	

-- db연결 테스트 테이블
create table `user` (
	id int primary key auto_increment,
	name varchar(10) not null
);

select * from `user` u;

DB연결(mysql과 flask.api연동-참고)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <link
        href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
        rel="stylesheet"
        integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
        crossorigin="anonymous"
    />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script
        src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
        crossorigin="anonymous"
    ></script>
    <script>
        function save_user() {
            let userName = $('#user-name').val();
            $.ajax({
                type: 'POST',
                url: '/api/user/post',
                data: {name: userName},
                success: function (response) {
                    alert(response['msg']);
                    window.location.reload();
                }
            });
        }
    </script>
</head>
<body>
    <div id = 'user'>
        <input type="text" id="user-name" placeholder="이름">
        <button onclick="save_user()">등록</button>
    </div>
</body>
</html>

app.py

from flask import Flask, render_template, request, jsonify
from sqlalchemy import create_engine, text
app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/api/user/post', methods=['POST'])
def save_user():

    # userName = {'name': request.form['name']}

    userName = request.form['name']

    sql = 'INSERT INTO user(name) VALUES(%s)'

    app.database.execute(sql, (userName)).lastrowid #실행한 테이블의 마지막 행 아이디를 가져옴.

    return jsonify({'msg':'등록성공'})

if __name__ == '__main__':
    app.config.from_pyfile("config.py")
    database = create_engine(app.config['DB_URL'], encoding='utf-8', max_overflow=0)
    app.database = database

    app.run('0.0.0.0', port=5000, debug=True)

config.py

db = {
    # 데이터베이스에 접속할 사용자 아이디
    'user': 'root',
    # 사용자 비밀번호
    'password': '비공개',
    # 접속할 데이터베이스의 주소 (같은 컴퓨터에 있는 데이터베이스에 접속하기 때문에 localhost)
    'host': 'localhost',
    # 관계형 데이터베이스는 주로 3306 포트를 통해 연결됨
    'port': 3306,
    # 실제 사용할 데이터베이스 이름
    'database': 'sparta_test'
}

DB_URL = f"mysql+mysqlconnector://{db['user']}:{db['password']}@{db['host']}:{db['port']}/{db['database']}?charset=utf8"

데이터베이스 설계

데이터베이스 설계 순서

DB설계순서

개념적 모델링

: 개체와 개체들 간의 관계에서 ER다이어그램을 만드는 과정

ER모델

: 세상의 모든 사물을 개체(entity)와 개체간의 관계(relaitonship)로 표현

  • 개체는 독립적인 의미를 지니고 있는 유무형의 사람 또는 사물로 개체의 특성을 나타내는 속성에 의해 식별됨. 개체들끼리 서로 관계를 지님.
  • ER모델로 ER다이어그램을 만들 수 있음.

ERD(개체관계도)

: 데이터와 그들 간의 관계를 사람이 이해할 수 있는 형태로 명확하게 표현하기 위해서 가장 널리 사용되고 있는 모델 개념적 모델링의 대표적인 도구

정규화(Normalization)

💡 정규화의 목적, 목표
중복 데이터를 없애고 관계를 단순하게 가져 간다!

제1정규화: 원자성

  • 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것

제2정규화: 완전 함수적 종속 (부분 종속 제거)

  • 제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
    여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.

제3 정규화: 이행 종속 제거

  • 제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.

정규화 연습(아래 링크를 보면서 정규화 하는법을 연습)

https://mjn5027.tistory.com/46
https://yaboong.github.io/database/2018/03/09/database-normalization-1/
https://ko.wikipedia.org/wiki/제2정규형

git

협업

1단계. 누가 이 작업 할 것인지 정한다. - Issue
2단계. 각자 맡은 것을 작업한다. - Branch
3단계. 각자 작업을 프로젝트에 합친다. - merge
(경우에 따라). 작업한 내용을 리뷰하고 최종적으로 프로젝트에 반영한다. - PR 후 merge

issue

  • 프로젝트에서 issue(이슈)는 프로젝트에서 해결해야하는 문제로 아래같은 것이 있어요.
    • 버그(프로그램이 원하는 대로 동작하지 않는 것)를 신고 (Bug report, 버그 리포트)
    • 기능 추가 등의 프로젝트 개선 제안 (enhancement)
    • 위 문제들을 해결하기 위한 작업단위
  • github의 내 원격 repo의 issue탭을 클릭
    => new issue 클릭
    => 제목, 상세내용, 작업할 사람, 분류 등을 작성해 이슈를 생성
  • 생성된 issue 제목 옆의 #숫자가 해당 이슈의 번호
    => #숫자를 같이 commit해주면 해당 이슈에 자동으로 연결됨.
profile
개발자 꿈나무

2개의 댓글

comment-user-thumbnail
2022년 12월 1일

많은 걸 배우셨네요 잘 보고 갑니다

1개의 답글