분류 전체보기 (40)
2025-01-09 17:58:24

1. 폴더 생성 및 데이터 이동

import os
import shutil

# 폴더 생성
os.makedirs("C:/0109_project/data_move_test/images")
os.makedirs("C:/0109_project/data_move_test/labels")

# 옮길 파일명
img_filename = 'image.jpg'
label_filename = 'label.txt'

# image 원본 및 옮겨질 경로
src1 = 'Origin_image/path'
dst1 = 'moved_image/path'

# label 원본 및 옮겨질 경로
src2 = 'Origin_label/path'
dst2 = 'moved_label/path'

# 이동복사
shutil.copy(os.path.join(src1, img_filename), os.path.join(dst1, img_filename))
shutil.copy(os.path.join(src2, label_filename), os.path.join(dst2, label_filename))

 

2. 텍스트 파일 읽기, 쓰기

txt_root = '텍스트 파일 경로'

# 텍스트 파일 읽기
f = open(txt_root, 'r')
f.read # read, readlines
f.close() # 파일 닫기

# 텍스트 파일 쓰기
f = open(txt_root, 'w')
f.write("example")
f.close()

 

3. 이미지 출력

import PIL
from PIL import Image, ImageDraw


# Load the image
image = Image.open('이미지 경로')
txt_root = '텍스트 파일 경로'

# Create an instance of ImageDraw
draw = ImageDraw.Draw(image)

f = open(txt_root, 'r') # file 열기/생성하기 / r: 읽기용, w: 쓰기용
data = f.readline()
f.close() # 파일 닫기

data = data.split()

data = list(map(float, data))

x1 = data[1]*255 - (data[3]*255 / 2)
x2 = data[1]*255 + (data[3]*255 / 2)

y1 = data[2]*255 - (data[4]*255 / 2)
y2 = data[2]*255 + (data[4]*255 / 2)

x, h, w, y = x1, data[4]*255, data[3]*255, y1
draw = ImageDraw.Draw(image)
draw.line([(x, y+30), (x+60, y+30), (x+60, y+90), (x, y+90), (x, y+30)], fill="red", width=2)

image.show()
image.save('저장 경로')
2025-01-09 17:34:14

현재 우리가 진행중인 프로젝트에서 사용할 데이터는 교통 표지판 데이터셋이다.

 

데이터셋의 정보는 다음과 같다.

 

(표 채우기)

(출처)

 

모델 학습에 악영향을 끼칠 수 있다고 판단되는 데이터의 모습을 생각해보자.

 

그리고 이를 sinfect 데이터라 칭하겠다.

 

반대로 좋은 데이터를 clean 데이터라 칭하겠다.

 

나중에 더 추가될 수 있지만 현재로서는 이 정도가 최선인 거 같다.

 

- sinfect 데이터 예시 -

 

1. 주제와 상관없는 데이터

동물

 

사람 얼굴
검은 배경

 

 

2. 바운딩 박스 좌표가 잘못된 데이터

잘못된 바운딩 박스

 

3. 객체의 클래스 정보가 잘못된 데이터

잘못된 클래스

2025-01-09 14:29:27

 우선 프로젝트 주제를 얘기하기 전에 짚고 넘어가야할 부분이 있다. 반성아닌 반성을 하자면, 지난 1년 동안 개발 공부를 해왔지만 정리도 제대로 안하고 코드 분석도 소홀히 한 거 같다. 블로그, 깃허브 또한 마찬가지이다. 처음엔 엄청난 의욕을 가지고 작성했었는데 지금은 그렇지 않고 있다. 주변에서는 이런 말을 많이 한다. "기록을 남겨야 한다." 이런 조언을 무시하며 1년 정도를 보내왔다. 그리고 이런저런 핑계를 대며 기록을 소홀히 했다. 아직 완성되지 않았으니 완성하고 올리자, 블로그에 시간을 많이 쓰면 결국 공부를 못한다 등. 사실은 이 모두가 핑계였다는 것을 나는 알고 있었을 지도 모른다. 따라서 지금부터라도 시작하려고  한다.

 

 

  지난 1년 동안 개발 공부를 하면서 시계열 데이터에 관한 프로젝트도 진행해보고 이미지 데이터에 관한 프로젝트도 진행하였다. 전자의 경우 깊이감있는 공부를 하진 않았고 후자의 경우 나름 논문도 하나 나올만큼의 성과가 있었다. 주제는 "교통 표지판 인식에서의 일반화 성능 평가"이다. 프로젝트 진행은 나와 연구실 동료와 진행하였고 담당 교수님의 지휘 하에 진행하였다. 프로젝트를 진행하면서 많은 고충이 있었다. 처음에는 GPU 연동과 모델 수집이 너무 어려웠다. 하지만 지나고보니 가장 힘들었던 부분은 데이터였다. 그저 데이터를 수집하고 모델에 입력하면 끝이라고 생각했는데 너무 오만한 생각이었다. 데이터 수집뿐만 아니라 분석 및 이상치 데이터를 관리하는 것이 이렇게나 힘들 줄 몰랐다. 또한 잘못된 데이터로 인해 모델의 성능이 떨어지는 것 또한 간과하고 있었다. 실제로 논문 마감 1주일 전에 예상치 못한 데이터의 오류가 있었다. 이를 해결하기 위해 낮과 밤이 바뀔 정도였다. 몇 천개 이상의 데이터를 눈으로 확인하고 잘못된 데이터를 직접 수정하는 것은 여간 쉬운 일이 아니었다. 따라서 생각한 것이 클린한 데이터를 학습한 모델로 다른 데이터를 정제하는 것이다.

 

 

 다음 챕터부터는 데이터 정제를 위한 설계를 준비하도록 하겠다.

2024-06-16 10:43:49

본 내용은 "생활코딩! HTML + CSS + 자바스크립트" 책을 통해 학습했음.

CSS란?

 웹 페이지를 좀 더 아름다우면서 보기 좋은 형태로 만들기 위한 언어로 글씨의 색깔을 바꾸는 기능을 예로, 기존에 하나하나 바꿔야하는 불편함에서 벗어나도록 도와준다. 이는 HTML이 정보 전달에만 전념하도록 HTML으로부터 디자인에 대한 기능을 빼앗아 왔다고 표현할 수 있다.

 

 HTMl과 CSS는 완전히 다른 언어이므로 웹 페이지에 CSS를 포함시킬 때, 웹 브라우저로 하여금 어디서부터 어디까지가 CSS인지 알려줘야 한다.

 

웹 페이지에 CSS를 삽입하는 방법

 웹 페이지에 CSS를 삽입하는 방법은 2가지가 있는데, 하나는 태그를 사용하는 것이고 나머지 하나는 속성을 쓰는 것이다.

 

1. 태그 사용

 먼저 <style> 태그를 추가한다. 이 태그는 기본적으로 HTML 문법이지만, 태그 안쪽에 있는 내용은 CSS이므로 CSS의 언어 문법에 맞게 처리해야 한다.

#기본코드
<style>
    (대상) {
    color : red;
    }
    
#예시코드
<style>
    a {
    color : red;
    }
</style>

 

 이러한 코드를 이 웹 페이지에 주고 싶은 효과를 누구에게 줄 것인가를 선택한다는 점에서 선택자(selector)라고 한다. 그리고 선택자에 지정될 효과를 효과 혹은 선언(delaration)이라고 부른다.

 

 아래 코드가 <style> 태그의 기본 예시이며, 안쪽에 있는 내용은 "모든 <a> 태그에 대해서 폰트 색상이 빨간색"이라는 의미를 가진 CSS 코드이다.

 

2. 속성 이용

 우선 코드부터 살펴보도록 하겠다.

<a href = "2.html" style = "color : red">CSS</a></li>

 

 style = ""은 HTML의 속성이다. 그리고 style이라는 속성은 값으로 반드시 CSS 효과가 들어온다고 약속되어 있다.

 

 

기본적인 기능 알아보기

 

1. CSS를 이용해 링크에 밑줄 없애기

<style>
    (대상) {
    text-decoration : none;
    }
</style>

 

 추가로 알아야할 점은, 각 줄의 끝에 세미콜론(;)을 붙여 각 줄을 구분해야 한다는 것이다.

 

1-2. 현재 선택된 웹 페이지만큼은 링크에 밑줄을 긋고 싶다면

...생략...
<a href = "2.html" style = "color : red; text-decoration : underline;">CSS</a>
...생략...

 

2. 정렬 및 크기 변경

<style>
    h1 {
    font-size : 45px;
    text-align : center;
    }
</style>

 

 위 코드를 해석하면, 폰트 사이즈는 45픽셀, 위치는 중앙으로 한다는 뜻이다. 정렬 방식은 center 말고도 left, right 등이 있다.

 

3. 

 

 

박스 모델이란?

 제목, 목차, 본문과 같이 각 요소들을 깔끔하게 정리할 수 있게끔 선을 그어주는 작업을 하기 위해 알아야할 선행 학습이다.

 

기본적인 기능 알아보기

 

1. 구역을 나눌 태그에 테두리 그리기

<style>
    (대상1) {
    border-width : 5px;
    border-color ; red;
    border-style : solid;
    }
    (대상2) {
    border-width : 5px;
    border-color ; red;
    border-style : solid;
    }
</style>

 

※HTML에 있는 여러 태그들은 태그의 성격과 일반적인 쓰임에 따라 화면 전체를 쓰는 것이 편한 것과 자신의 크기만큼의 부피를 갖는 게 편한 것이 있기 때문에 화면 전체를 쓰는 태그가 있고, 자기 크기만큼 쓰는 것들이 있다. 그래서 화면 전체를 쓰는 태그들을 블록 레벨 엘리먼트, 자기 자신의 컨텐츠 크기만큼 쓰는 태그들을 인라인 엘리먼트라고 한다. 태그 안에 display : block; 을 사용하면 블록 레벨 엘리먼트, display : inline; 을 사용하면 인라인 엘리먼트가 된다.

 

2. 코드의 중복 제거

 위 코드의 {} 안에 중복된 부분이 존재하므로 이를 줄일 수 있다.

<style>
    (대상1, 대상2) {
    border-width : 5px;
    border-color ; red;
    border-style : solid;
    }
</style>

 

 하지만 여전히 중복이 존재하는데, 바로 border- 부분이다. 이 또한 줄일 수 있다.

<style>
    (대상1) {
    border : 5px solid red;
    }
</style>

 

 5px, solid, red 의 순서는 중요하지 않다.

 

3. 콘텐츠와 테두리 사이에 여백 추가하기

<style>
    (대상) {
    border : 5px solid red;
    padding : 20px;
    }
</style>

 

 padding 의 크기에 따라 콘텐츠와 테두리 사이의 간격이 결정된다.

 

4. 테두리와 테두리 사이의 간격 없애기(3번에서 다룬 콘텐츠와 같은 콘텐츠를 추가했다고 가정한다.)

 각 테두리 사이에 여백이 존재하게 되는데, 이는 margin 떄문이다. 다음 코드를 추가하면 마진이 사라진다.

<style>
    (대상) {
    border : 5px solid red;
    padding : 20px;
    margin : 0px;
    }
</style>

 

5. width 속성을 지정하여 태그의 크기 변경

<style>
    (대상) {
    border : 5px solid red;
    padding : 20px;
    margin : 0px;
    display : bolck;
    width : 100px;
    }
</style>

 

※웹 페이지에서 'CSS' 텍스트를 대상으로 마우스 우클릭하면 '검사'라는 항목이 나온다. 이를 클릭하면 개발자 도구가 나오는데, 이를 이해하고 활용하면 border, margin 등의 영역을 확인할 수 있다.

 

박스 모델 활용하기

 

1. <h1> 태그 아래쪽 테두리 만들기

<style>
    h1 {
    font-size : 45px;
    text-align : center;
    border-bottom : 1px solid gray;
    }
</style>

 

1-2. <h1> 태그의 margin 값 지정하기

1-3. <h1> 태그의 padding 값 지정하기

 

2. <ol> 태그에 오른쪽 테두리 만들기

<style>
    ol {
    border-right : 1px solid gray;
    }
</style>

 

2-2. <ol> 태그의 width 지정

2-3. <ol> 태그의 margin 값 지정

2-4. <ol> 태그의 padding 값 지정

 

※어떤 태그의 테두리를 만드냐에 따라 border- 값이 바뀐다. 또한 width, margin 등의 값을 변경하여 깔끔하고 보기 좋은 형식을 만들 수 있다.

 

 

그리드란?

 사전적 의미로 '격자무늬' 또는 '격자판'을 의미하며, 디자인에서는 일정한 영역을 정하는 것을 의미하고 있다. 우리는 이 그리드를 사용하여 목록과 본문이 나란히 위치하는 디자인을 할 것이다.

 

기본적인 기능 알아보기

 

1. <div> 태그로 묶기

<body>
    <div>내용1</div>
    <div>내용2</div>
</body>

 

※여기서 <div> 태그는 디자인을 하기 위한 목적으로 사용하는 목적없는 태그이다.

 

2. 부피감을 확인하기 위해 <div> 태그에 테두리 지정

<style>
    div {
    border : 5px solid gray;
    }
</style>

 

3. 두 개의 <div> 태그를 감싸는 부모 태그 추가(두 내용을 나란히 놓기 위해)

<body>
    <div>
    	<div>내용1</div>
    	<div>내용2</div>
    </div>
</body>

 

4. 부모 태그의 id 값 설정, 테두리를 분홍색으로 변경

<style>
    #grid {
    border : 5px solid pink;
    }
    
    div {
    border : 5px solid black;
    }
    
...생략...
    
<body>
    <div id = "grid">
    	<div>내용1</div>
    	<div>내용2</div>
    </div>
</body>

 

5. 두 개의 태그를 나란히 배치하기

...생략...
#grid {
    border : 5px solid pink;
    display : grid;
    grid-temperate-columns : 150px 1fr;
    }

 

※150px 1fr 부분을 1fr 1fr 로 바꾸면 두 칼럼의 크기는 같아지게 된다. 2fr 1fr로 바꾸면 전체를 3fr이라고 했을 때, 좌측 영억은 2만큼, 우측 영역은 1만큼 화면 전체를 나눠서 쓰게 된다.

 

 

반응형 디자인

 화면 크기에 따라 웹 페이지의 각 요소들이 반응해서 동작하게 된다는 것

<style>
    @media(min-width : 800px) {
    (대상) {
    display : none;
    }
    }
</style>

 

 화면의 크기가 800px보다 작으면 <div>가 사라진다. min-width 를 max-width로 바꾸면 반대로 작동한다.

2024-06-14 16:45:44

본 내용은 "생활코딩! HTML + CSS + 자바스크립트" 책을 통해 학습했음.

HTML 이란?

 웹 페이지의 구조를 정의하고, 텍스트, 이미지, 링크 등 다양한 요소를 포함하여 웹 콘텐츠를 작성하고 표시하는 언어

 

웹 페이지란?

 인터넷을 통해 접근할 수 있는 문서로, 텍스트, 이미지, 비디오, 링크 등 다양한 콘텐츠를 포함하여 웹 브라우저에서 표시되는 디지털 문서

 

태그란?

 태그는 HTML 문서에서 요소의 시작과 끝을 표시하는 기호로, <태그이름> 형식으로 작성되며, 요소의 속성과 내용을 정의한다. 예를 들어, <p>는 단락을 시작하고 </p>는 단락을 종료한다. <br> 태그처럼 단락을 종료하지 않고 단락을 시작하기만 하는 태그도 있기에 사용할 태그의 형식을 어느정도 알아야 한다.

 

HTML 기본 양식

 HTML은 기본적으로 <head>와 <body> 로 나뉘며, 이를 <html> 태그로 묶어준다. 즉, <head>는 본문을 설명을 작성하고, <body>는 본문의 내용을 작성하며 이 모두를 <html>로 감싸주는 것이다. 추가로 <html> 상단에 <!DOCTYPE HTML> 을 작성해주는데, 이는 이 문서에 HTML이 담겨 있다는 관용적인 의미로 쓰인다.

<!DOCTYPE HTML>
<html>
    <head>
    "본문에 대한 설명"
    </head>
    
    <body>
    "본문"
    </body>
</html>

 

 

기본적인 태그 알아보기

 

1. <title> 태그

 일반적으로 <head> 태그에 작성하며, 작성한 값이 웹 페이지의 이름이 된다.

 

2. <meta> 태그

일반적으로 <head> 태그에 작성하며, HTML 문서의 정보를 제공하는 태그로, 문자 인코딩, 작성자, 페이지 설명, 키워드 등을 설정하는 데 사용한다.

<head>
    <title>WEB1 - HTML</title>
    <meta charset="utf-8">
</head>

 

3. <strong> 태그

 글씨를 강조하는 역할을 한다.

<strong>강조할 문장</strong>

 

4. <h1>, <h2>, ... <h6> 태그

 제목의 크기를 결정하는 태그로 숫자가 커질수록 크기가 작아진다.

<h1>제목1</h1>
<h2>제목2</h2>
.
.
.

 

5. <u> 태그

 선택한 글씨에 밑줄을 그어준다.

<u>밑줄 그을 문장</u>

 

6. <br> 태그

 문장이나 단락 사이에 강제적으로 줄을 바꿀 때 사용한다.

문장1<br>문장2

단락1<br>단락2

 

7. <p> 태그

 단락을 나눌 때 사용한다.

<p>문장</pr>

 

8. <img>

 웹 페이지에 이미지를 띄울 수 있다.

<img src = "이미지 이름" width = "배율(%)">

 

9. <li>, <ol>, <ul> 태그

<li> 태그는 목록 항목을 정의할 때 사용하는 태그로, 순서가 있는 목록(<ol>)이나 순서가 없는 목록(<ul>) 내에서 사용된다. 여기서 <li> 태그를 자식 태그, <ol>과 <ul> 태그를 부모 태그라 한다.

<ol>
    <li>목차1</li>
    <li>목차2</li>
    .
    .
    .
</ol>

<ul>
    <li>목차1</li>
    <li>목차2</li>
    .
    .
    .
</ul>

 

10. <a> 태그

 링크를 추가할 수 있다.

<a href = "주소" target = "_blank" title = "링크 설명"></a>

 

 

전체 코드는 https://github.com/NamkKungGeon/my-first-web-site 에서 확인할 수 있음. 내가 만든 웹 페이지는 다음에서 https://namkkunggeon.github.io/my-first-web-site/index.html확인할 수 있음.(오류 때문에 뜨지 않을 수 있음.) 웹 페이지에서 뒤에 index.html 을 지우고 검색해도 똑같은 페이지가 나옴. 단, 댓글창에 달린 댓글은 다름. 왜 그런지 이유를 모르겠음.

 

 

vscode 설치와 기본 설정에 대해서 다음 유튜브 영상을 참고하였음:

https://youtu.be/2mBbZG9vVtE?si=iAVf1QPEXmuQ2zPP

2024-06-12 20:38:30

설치

pip install fastapi

pip install uvicorn

 

코드입력

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def main():
    return {"res": "hello world"}

 

 

실행하기

uvicorn main:app --reload

링크 클릭

 

 

구현한 웹페이지 모습

 

 

출처 : https://youtu.be/S_mpbHxNC84?si=u8_sp2U_LXung0vW

 

2024-06-12 19:33:23

Application Programming Interface

한 프로그램에서 다른 프로그램으로 데이터를 주고 받기 위한 방법

 

API에서 필요한 3가지

 

method/endpoint/parameter

 

1. method_요청방식(데이터를 받을 것인지, 보낼 것인지)

 

2. endpoint_무슨 자료를 요청할 것인지

 

3. parameter_자료 요청에 필요한 추가 정보

 

※웹의 경우 REST API라는 원칙에 따라 작성하면 좋음

 

DATABASE 관리프로그램 API 를 사용하여 DB 입출력 기능들 사용 가능

 

 

https://youtu.be/ckSdPNKM2pY?si=3VbF2DMYpcwJ7MdM

 

2024-06-08 20:46:54

데이터와 정보

데이터 : 현실 세계에서 단순히 관찰하거나 측정하여 수집한 사실이나 값으로, 자료라고도 함

 

정보 : 데이터를 의사 결정에 유용하게 활용할 수 있도록 처리하여 체계적으로 조직한 결과물

 

정보 처리 : 데이터에서 정보를 추출하는 과정 또는 방법

 

데이터베이스 : 유용하게 활용할 수 있는 정보를 정확히 추출할 수 있도록 데이터를 관리

 

정보 시스템과 데이터베이스

정보 시스템 : 데이터를 수집 및 저장했다가 필요할 때 유용한 정보를 만들어주는 역할

 

데이터베이스의 정의

공유 데이터 : 여러 사용자가 함께 소유하고 이용할 수 있어야하기에 여러 목적의 사용자를 고려

 

통합 데이터 : 효율성 때문에 중복을 허용하는 경우가 있지만, DB는 데이터 중복을 허용하지 않음

 

저장 데이터 : 컴퓨터가 접근할 수 있는 매체에 DB를 저장

 

운영 데이터 : 조직 활동을 수행하기에 데이터를 지속적으로 유지

 

데이터베이스의 특징

실시간 접근 : 사용자의 요구에 실시간으로 응답

 

계속 변화 : DB의 동적인 특징 때문에 현재의 정확한 데이터를 유지

 

동시 공유 : 여러 사용자가 동시에 동일한 데이터에 접근 및 사용할 수 있고 데이터 일관성과 무결성을 유지

 

내용으로 참조 : 데이터의 내용 조건만 제시하면 조건에 맞는 데이터를 검색 가능

 

데이터 종류

스키마 : 미리 정해진 데이터 구조

 

정형 데이터 : 미리 정해진 구조에 따라 저장된 데이터

 

반정형 데이터 : 구조에 따라 저장된 데이터이지만 데이터 내용 안에 구조에 대한 설명이 존재

메타 데이터

 

비정형 데이터 : 정해진 구조 없이 저장된 데이터로, 소셜 데이터의 텍스트, 영상, 이미지, 워드나 문서와 같은 멀티미디어 데이터가 대표적임

 

과거 데이터 관리 시스템의 단점

 

DB 관리 시스템

DB 관리 시스템의 정의 : 조직에 필요한 데이터를 DB에 통합하여 저장하고 이에 대한 관리를 담당

 

정의 기능 : 데이터베이스 구조를 정의하거나 수정할 수 있음

 

조작 기능 : 데이터를 삽입, 삭제, 수정, 검색하는 연산을 할 수 있음

 

제어 기능 : 데이터를 항상 정확하고 안전하게 유지할 수 있음

 

데이터베이스 관리 시스템의 장단점

장점

1. 데이터 중복 통제

2. 데이터 독립성

3. 데이터 동시 공유

4. 데이터 보안력

5. 데이터 무결성

6. 표준화

7. 장애 회복 가능

8. 응용 프로그램 개발 비용 감소

 

단점

1. DB 관리 시스템 개발 비용 증가

2. 백업과 회복 방법이 복잡

3. 중앙 집중 관리의 취약점

 

DB : 저장된 데이터의 집합

 

DB 관리 시스템 : DB에 저장된 데이터를 일관되고 무결한 상태로 유지

 

DB 시스템 : DB 관리 시스템을 통해 조직에 필요한 정보를 제공해주는 전체 시스템

 

스키마와 인스턴스의 차이

스키마 : 데이터 구조와 제약 조건을 정의한 것

 

인스턴스 : 정의된 스키마에 따라 DB에 실제로 저장된 값

 

스키마는 한 번 정의되면 자주 변경되지 않지만, 인스턴스는 계속 변함

 

3단계 데이터베이스 구조

외부단계_외부 스키마

사용자 관점 : DB의 특정 부분만을 볼 수 있는 개별 사용자나 애플리케이션의 관점

뷰 : 각 사용자나 애플리케이션에 맞게 데이터의 특정 부분을 보여주는 맞춤형 뷰를 제공

보안 및 접근 제어 : 데이터 접근 권한을 관리하여 보안성을 향상

 

개념단계_개념 스키마

전체 조직 관점 : DB의 전체 구조를 나타내며, 모든 데이터와 그 관계를 포괄

E-R 모델 : 개체, 속성, 관계를 통해 DB의 논리적 구조를 정의

독립성 : 외부 단계와 물리적 단계로부터 독립적이어서, DB의 논리적 구조 변경이 다른 곳에 영향을 미치지 않음

 

내부단계_내부 스키마

물리적 저장 관점 : 데이터가 실제로 저장되는 방식과 위치를 정의

파일 구조 및 인덱스 : 데이터 저장을 위한 파일 구조와 데이터 접근을 위한 인덱스를 포함

성능 최적화 : 저장소 구조와 접근 메커니즘을 최적화하여 성능을 향상

 

데이터 독립성

외부/개념 사상 : DB의 외부 단계와 개념적 단계를 연결

 

개념/내부 사상 : DB의 개념적 단계와 내부 단계를 연걸

 

논리적 데이터 독립성 : 개념 스키마가 변경되더라도 외부 스키마가 영향을 받지 않음

 

물리적 데이터 독립성 : 내부 스키마가 변경되더라도 개념 스키마가 영향을 받지 않음

 

데이터베이스 관리자

DB 관리자의 주요 업무

1. DB의 구성 요소 선정

2. DB의 스키마 정의

3. 물리적인 저장구조와 접근 방법 결정

4. 무결성 유지를 위한 제약조건 정의

5. 보안 및 접근 권한에 대한 정책 결정

6. 백업 및 회복 기법 정의

7. 시스템 DB 관리

8. 시스템 성능 감시 및 성능 분석

9. 변화된 상황에 맞게 DB 재구성

 

데이터 모델링과 데이터 모델의 개념

데이터 모델링_현실에 존재하는 데이터를 DB로 옮기는 변환 과정

0. 데이터 모델은 데이터 구조, 연산, 제약조건으로 구성

1. 개념적 모델링 : 현실에서 중요한 데이터를 추출하여 개념 세계로 옮기는 작업

2. 논리적 모델링 : 개념 세계의 데이터를 DB에 저장할 구조를 결정하고 이 구조로 표현하는 작업

(일반적으로 이 둘을 명확히 구분하지 않고 합쳐서 데이터 모델링이라 칭함)

 

개체-관계 모델

개체 : DB에 저장될 수 있는 구체적인 실세계의 객체나 개념을 나타내는 개념적인 모델이고, DB에서는 테이블로 구현

 

인스턴스 : 개체를 구성하는 속성의 실체로 개체의 특정한 예를 의미, DB에서는 테이블의 행으로 구현

 

속성 : DB에서 개체의 특성이나 성질을 나타내는 필드나 열을 의미, 각 속성은 개체의 특정 측면을 설명

 

단일 값 속성 : 특정 개체를 구성하는 속성 값이 하나

 

다중 값 속성 : 속성이 값을 여러 개 가짐

 

단순 속성 : 의미를 더는 분해할 수 없는 속성

 

복합 속성 : 의미를 분해할 수 있어 값이 여러 개의 의미를 포함

 

유도 속성 : 저장된 값이 없이 기존의 다른 속성 값에서 유도되어 결정되는 속성

 

널 속성 : 아직 결정되지 않았거나 모르는 값을 의미

 

키 속성 : 각 개체 인스턴스들을 식별하는 데 사용

 

※DB를 설계할 때 다중 값 속성을 고려해야 함

 예를 들어, 전화번호라는 속성이 있다고 가정한다. 만약 다중 값 속성을 고려하지 않고 스키마를 설계했다가 나중에 다중 값을 허용해야 하는 상황이 발생할 수 있음. 이를 해결하기 위해 별도의 테이블을 생성해야 될 수도 있음. 또는 단일 값 속성을 다중 값 속성으로 변환시킬 수도 있음. 하지만 DB는 다중 값 속성을 비효율적이라 보기 때문에 일반적으로 별도의 테이블로 분리하여 관리함. 이때 발생하는 특정 속성 값의 중복을 불가피함.

 

 

관계 : 개체와 개체가 맺고 있는 의미 있는 연관성

 

일대일 관계 : 한 테이블의 각 행이 다른 테이블의 각 행과 하나의 고유한 관계를 가짐

 

일대다 관계 : 한 테이블의 각 행이 다른 테이블의 여러 행과 관계를 가짐

 

다대다 관계 : 한 테이블의 여러 행이 다른 테이블의 여러 행과 관계를 가짐

 

관계의 참여 특성 : 모든 개체 인스턴스가 관계에 반드시 참여해야 된다면 필수적 참여, 그렇지 않다면 선택적 참여라 부름

 

관계의 종속성 : 한 개체의 존재가 다른 개체에 의존

 

 

논리적 데이터 모델 : E-R 다이어그램으로 표현된 개념적 구조를 DB에 저장한다고 할 때 저장 형태로 표현한 논리적 구조

 

계층 데이터 모델 : DB의 논리적 구조가 트리 형태

 

네트워크 데이터 모델 : DB의 논리적 구조가 그래프 또는 네트워크 형태

 

관계 데이터 모델의 기본 용어

릴레이션 : 흔히 테이블이라 부름

 

속성(애트리뷰트) : 릴레이션의 열

 

튜플(레코드) : 릴레이션의 행

 

도메인 : 속성 하나가 가질 수 있는 모든 값의 집합_데이터 타입, 값의 범위, 제약 조건 등

 

도메인의 예시

 

널 값 : 릴레이션에 있는 특정 튜플의 속성 값을 모르거나, 적합한 값이 없는 경우 사용

 

차수 : 하나의 릴레이션에서 속성의 전체 개수

 

카디널리티 : 하나의 릴레이션에서 튜플의 전체 개수

 

릴레이션과 데이터베이스의 구성

릴레이션 스키마 : 릴레이션의 이름과 이에 포함된 모든 속성의 이름으로 정의하는 릴레이션의 논리적 구조

 

릴레이션 인스턴스 : 릴레이션 스키마의 구조에 따라 실제로 저장된 데이터

 

데이터베이스 스키마 : 특정 데이터베이스에 설계된 모든 릴레이션 스키마를 포함하는 전체 구조

 

데이터베이스 인스턴스 : 데이터베이스 스키마의 구조에 따라 실제로 저장된 모든 데이터

 

릴레이션의 특성

1. 하나의 릴레이션에 동일한 튜플이 존재할 수 없음

2. 하나의 릴레이션에서 튜플 사이의 순서는 무의미

3. 하나의 릴레이션에서 속성 사이의 순서는 무의미

4. 속성 값으로 원자 값만 사용할 수 있음

키의 종류

기본키 : 테이블에서 각 레코드를 고유하게 식별하는 필드로, NULL값을 가질 수 없음

 

후보키 : 기본 키로 사용할 수 있는 유일성과 최소성을 가진 필드의 집합

 

대체키 : 후보 키 중에서 기본 키로 선택되지 않은 나머지 키

 

외래키 : 다른 테이블의 기본 키를 참조하여 테이블 간의 관계를 설정하는 필드

 

슈퍼키 : 유일성을 보장하는 하나 이상의 필드로 이루어진 집합

 

복합키 : 둘 이상의 필드로 구성된 기본 키

 

관계 데이터 모델의 제약

개체 무결성 제약조건 : 모든 테이블의 기본키는 NULL 값을 가질 수 없고, 각 레코드에서 고유해야 함

 

참조 무결성 제약조건 : 외래키는 참조하는 테이블의 기본키 또는 고유키 값과 일치하거나 NULL이어야 하며, 테이블 간의 관계를 유지

 

관계 대수

                                                                     일반 집합 연산자 / 순수 관계 연산자

 

 

SQL 데이터 정의 기능

테이블 생성

CREATE TABLE 테이블_이름 (
    속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값]
    [PRIMARY KEY(속성_리스트)]
    [UNIQUE(속성_리스트)]
    [FOREIGN KEY(속성_리스트) REFERENCES 테이블_이름(속성_리스트)]
    [ON DELETE 옵션] [ON UPDATE 옵션]
    [CONSTRAINTS 이름] [CHECK(조건)]
);

 

테이블 변경

#새로운 속성 추가
ALTER TABLE 테이블_이름
    ADD 속성_이름 데이터_타입 [NOT NULL] [DEFAULT 기본_값];
    
#기존 속성 삭제
ALTER TABLE 테이블_이름 DROP COLUM 속성_이름;

#새로운 제약조건 추가
ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약조건_이름 제약조건_내용;

#기존 제약조건 삭제
ALTER TABLE 테이블_이름 DROP CONSTRAINT 제약조건_이름;

 

테이블 삭제

DROP TABLE 테이블_이름;

 

SQL의 데이터 조작 기능

데이터 검색

#기본 코드
SELECT 속성1, 속성2, ..., 속성n FROM 테이블_이름;

#모든 속성 검색
SELECT * FROM 테이블_이름;

#특정 속성 검색
SELECT 속성2, 속성7 FROM 테이블_이름;

#중복 허용 검색
SELECT ALL 속성_이름 FROM 테이블_이름;

#중복 제거 검색
SELECT DISTINCT 속성_이름 FROM 테이블_이름;

#산술식을 이용한 검색(+, -, *, /)
SELECT 속성 + K FROM 테이블_이름;

#속성 이름 변경하여 검색(AS 생략 가능)
SELECT 속성_이름 AS 변경할_이름 FROM 테이블_이름;

#조건 검색
SELECT 속성_이름 FROM 테이블_이름 WHERE 조건;

#LIKE를 이용한 검색
SELECT 속성_이름 FROM 테이블_이름 WHERE 속성_이름 LIKE '@';

#NULL을 이용한 검색
SELECT 속성_이름 FROM 테이블_이름 FROM 속성_이름 IS NULL;
SELECT 속성_이름 FROM 테이블_이름 FROM 속성_이름 IS NOT NULL;

#정렬 검색(ASC : 오름차순, DESC : 내림차순)
SELECT 속성_이름 FROM 테이블_이름 WHERE 조건 ORDER BY 속성_리스트 ASC/DESC;

#집계 함수를 이용한 검색
SELECT @(속성_이름) FROM 테이블_이름;

#그룹별 검색_SELECT 절에 나누는 기준이 되는 속성을 작성하는 것이 좋음
SELECT 속성_이름 FROM 테이블_이름 GROUP 속성_이름;

#그룹별 검색_HAVING_GROUP BY 에 대한 조건
SELECT 속성_이름 FROM 테이블_이름 GROUP 속성_이름 HAVING 조건;

#여러 테이블에 대한 조인 검색 예시
SELECT 테이블1.속성 FROM 테이블1, 테이블2 WHERE 테이블1.속성 = ' ' AND 테이블1.속성 = 테이블2.속성;

#부속 질의문을 이용한 검색
SELECT 속성_이름 FROM 테이블_이름 WHERE 속성_이름 = (SELECT 속성_이름 FROM 테이블_이름 WHERE 조건);

#다중 행 부속 질의문을 이용한 검색
SELECT 속성_이름 FROM 테이블_이름 WHERE 속성_이름 @ (SELECT 속성_이름 FROM 테이블_이름 WHERE 조건);

 

 

LIKE 키워드의 사용 예

 

집계 함수

 

다중 행 부속 질의문에 사용 가능한 연산자

 

 

데이터 삽입

#데이터 직접 삽입
INSERT INTO 테이블_이름 VALUES 속성값_리스트;

#부속 질의문을 이용한 데이터 삽입
INSERT INTO 테이블_이름 SELECT 문;

 

데이터 수정

UPDATE 테이블_이름 SET 속성_이름1 = 값1, 속성_이름2 = 값2, ... [WHERE 조건];

 

데이터 삭제

DELETE FROM 테이블_이름 [WHERE 조건];

 

뷰의 개념

뷰 : DB에서 하나 이상의 테이블을 기반으로 생성된 가상 테이블로, 실제 데이터를 저장하지 않고, 저장된 데이터에 대한 특정 쿼리의 결과를 마치 테이블처럼 보여줌

 

뷰의 장점

1. 사용자가 접근할 수 있는 데이터 범위를 제한하여 정보를 보호

2. 복잡한 쿼리를 단순화하여 사용자가 쉽게 데이터를 조회

3. 기본 테이블의 구조가 변경되더라도 뷰를 통해 접근하는 애플리케이션에 영향을 주지 않음

4. 자주 사용되는 쿼리를 뷰로 정의하여 재사용할 수 있음

 

뷰의 생성

CREATE VIEW 뷰_이름[(속성_리스트)] AS SELECT 문 [WITH CHECK OPTION];

 

뷰의 활용

#CREATE VIEW 문으로 생성된 뷰에서도 일반 테이블처럼 원하는 데이터 검색 가능
SELECT * FROM 뷰_이름 [WHERE 조건];

#INSERT 문, UPDATE 문, DELETE 문도 뷰를 대상으로 수행 가능
INSERT INTO 뷰_이름 VAULES [속성_리스트];

 

※변경이 불가능한 뷰

1. 기본 테이블의 기본키를 구성하는 속성이 포함되어 있지 않은 뷰는 변경할 수 없음

2. 기본 테이블에 있던 내용이 아니라 집계 함수로 새로 계산된 내용을 포함하고 있는 뷰는 변경할 수 없음

3. DISTINCT 키워드를 포함하여 정의한 뷰는 변경할 수 없음

4. GROUP BY 절을 포함하여 정의한 뷰는 변경할 수 없음

5. 여러 개의 테이블을 조인하여 정의한 뷰는 변경할 수 없는 경우가 많음

 

뷰의 삭제

DROP VIEW 뷰_이름;

 

삽입 SQL WITH Pytnon

#라이브러리 선언
import pymysql

#데이터베이스 연결
conn = pymysql.connect(host = 'localhost', user = 'root', password = '패스워드_입력', db = 'DB_이름_입력', charset = 'utf8')

#커서 생성
curs = conn.cursor()

#SQL 문 실행
sql = 'select * from 테이블_이름'
curs.execute(sql)

#데이터 가져오기
data = curs.fetchall()
data[0]
data[1]

#연결 끊기
conn.close()
2024-06-08 18:22:52

 다음 코드는 회원 릴레이션을 실제로 생성하는 SQL 문의 작성 예다.

CREATE TABLE 회원 (
    회원아이디 VARCHAR(20) NOT NULL,
    비밀번호 VARCHAR(20) NOT NULL,
    이름 VARCHAR(10) NOT NULL,
    나이 INT,
    직업 VARCHAR(20),
    등급 VARCHAR(10) NOT NULL DEFAULT 'silver',
    적립금 INT NOT NULL DEFAULT 0,
    PRIMARY KEY(회원아이디),
    CHECK (나이 >= 0),
    CHECK (등급 in ('silver', 'gold', 'vip'))
);

'데이터베이스 > 데이터베이스 설계' 카테고리의 다른 글

논리적 설계  (0) 2024.06.08
개념적 설계  (0) 2024.06.08
요구 사항 분석  (0) 2024.06.07
데이터베이스 설계 단계  (0) 2024.06.07
2024-06-08 17:47:45

 E-R 다이어그램을 릴레이션 스키마로 변환하는 일은 쉽지 않다. E-R 모델에서는 개체와 관계를 구분하지만, 관계 데이터 모델에서는 이를 구분하지 않고 모두 릴레이션으로 표현한다. 그리고 E-R 모델에서는 다중 값 속성이나 복합 속성의 표현을 허용하지만, 관계 데이터 모델에서는 이를 허용하지 않는다.

 

릴레이션 스키마 변환 규칙

규칙 1 : 모든 개체는 릴레이션으로 변환한다.

 개체의 이름을 릴레이션의 이름 즉, 테이블 이름으로 하고 개체가 가진 속성도 릴레이션의 속성으로 그대로 변환한다. 단, 개체가 가지고 있는 속성이 복합 속성인 경우에는 복합 속성을 구성하고 있는 단순 속성만 릴레이션의 속성으로 변환한다. 또한 개체가 가지고 있는 키 속성은 릴레이션의 기본키로 변환한다.

 

규칙 2 : 다대다 관계는 릴레이션으로 변환한다.

 관계의 이름을 릴레이션의 이름으로 하고, 관계의 속성도 릴레이션의 속성으로 그대로 변환한다. 단, 관계를 맺고 있는 개체가 무엇인지 중요하므로, 관계를 맺고 있는 개체들을 규칙 1에 따라 변환한 후 이 릴레이션들의 기본키를 관계 릴레이션에 포함시키고 외래키로 지정한다. 그리고 이 외래키들을 조합하여 관계 릴레이션의 기본키로 지정한다.

 

규칙 3 : 일대다 관계는 외래키로 표현한다.

 E-R 다이어그램에 있는 일대다 관계는 릴레이션으로 변환하지 않고 외래키로만 표현한다. 단, 약한 개체가 참여하는 일대다 관계는 일반 개체가 참여하는 경우와 다르게 처리해야 하므로 규칙 3을 2개의 세부 규칙으로 나누어 적용한다.

 

규칙 3-1 : 일반적인 일대다 관계는 외래키로 표현한다.

 관계를 맺고 있는 개체들을 규칙 1에 따라 변환한 릴레이션 중에서, 일대다 관계의 1측 개체 릴레이션의 기본키를 가져와 n측 개체 릴레이션에 포함시키고 외래키로 지정한다. 관계의 속성들도 n측 개체 릴레이션에 포함시킨다.

 

 만약 n측 개체 릴레이션의 기본키를 가져와 1측 개체 릴레이션에 외래키로 포함시키면 해당 외래키가 다중 값을 가져 릴레이션의 특성을 위반하게 된다.

 

규칙 3-2 : 약한 개체가 참여하는 일대다 관계는 외래키를 포함해서 기본키로 지정한다.

 약한 개체가 참여하는 일대다 관계도 릴레이션으로 변환하지 않고 외래키로만 표현한다. 일반 개체들이 참여하는 일대다 관계처럼 관계를 맺고 있는 개체들을 규칙 1에 따라 릴레이션으로 변환한다. 이때 일대다 관계의 1측 개체 릴레이션의 기본키를 가져와 n측 개체 릴레이션에 포함시키고 외래키로 지정한다. 관계의 속성들도 n측 개체 릴레이션에 포함시킨다.

 

 일반 개체들이 참여하는 일대다 관계와 다른 점은, 외래키가 포함된 릴레이션에서 이 외래키를 포함하여 기본키를 지정해야 한다는 점이다. 즉, n측 개체 릴레이션이 가지고 있던 키 속성과 외래키 속성을 조합하여 기본키로 지정한다.

 

규칙 4 : 일대일 관계를 외래키로 표현한다.

 일대일 관계도 일대다 관계처럼 릴레이션으로 변환하지 않고 외래키로만 표현한다. 이때, 데이터의 중복을 피하려면 개체가 관계에 참여하는 특성에 따라 약간 다르게 처리해야 하므로 규칙 4를 3개의 세부 규칙으로 나누어 적용한다.

 

규칙 4-1 : 일반적인 일대일 관계는 외래키를 서로 주고받는다.

 일반적인 일대일 관계는 릴레이션으로 변환하지 않고 외래키로만 표현한다. 관계를 맺는 개체들을 규칙 1에 따라 변환한 릴레이션들이 서로의 기본키를 주고받아 이를 외래키로 지정한다. 이때, 관계가 가지는 속성들은 관계에 참여하는 개체를 변환하는 릴레이션에 모두 포함시킨다.

 

 하지만 관계에 참여하고 있는 개체에 해당하는 릴레이션들이 서로의 기본키를 주고받아 이를 외래키로 지정하면 불필요한 데이터 중복이 발생하게 된다. 이를 해결하기 위해 다음 규칙을 살펴보자.

 

규칙 4-2 : 일대일 관계에 필수적으로 참여하는 개체의 릴레이션만 외래키를 받는다.

 일대일 관계를 맺고 있는 두 개체 중 관계에 필수적으로 참여하는 개체에 대응하는 릴레이션에만 외래키를 포함시킨다. 이때, 관계가 가지고 있는 속성들도 관계에 필수적으로 참여하는 개체에 해당하는 릴레이션에 함께 포함시킨다.

 

 관계에 선택적으로 참여하는 개체에 해당하는 릴레이션이 외래키를 가져도 문제는 없지만, 관계에 선택적으로 참여하는 특성 때문에 외래키로 지정된 속성에 널 값이 저장되는 경우가 발생할 수 있다. 따라서 관계에 필수적으로 참여하는 개체의 릴레이션이 외래키를 가지는 것이 좋다.

 

규칙 4-3: 모든 개체가 일대일 관계에 필수적으로 참여하면 릴레이션 하나로 합친다.

 일대일 관계를 맺고 있는 두 개체가 모두 관계에 필수적으로 참여한다면 그만큼 관련성이 있는 개체라는 의미다. 따라서 두 개체에 해당하는 두 릴레이션을 하나로 합쳐 표현한다. 관계의 이름을 릴레이션의 이름으로 사용하고, 관계에 참여하는 두 개체의 속성들도 관계 릴레이션에 모두 포함시킨다. 그리고 두 개체 릴레이션의 키 속성을 조합하여 관계 릴레이션의 기본키로 지정한다.

 

규칙 5 : 다중 값 속성은 릴레이션으로 변환한다.

 관계 데이터 모델의 릴레이션에서는 다중 값을 가지는 속성을 허용하지 않는다. 따라서 E-R 다이어그램에 있는 다중 값 속성은 그 속성을 가지고 있는 개체에 해당하는 릴레이션이 아닌 별도의 릴레이션을 만들어 포함시킨다. 새로 만들어진 릴레이션에는 E-R 다이어그램에서 다중 값 속성으로 표현된 속성뿐 아니라 그 속성을 가지고 있는 개체에 해당하는 릴레이션의 기본키를 가져와 포함시키고 외래키로 지정한다. 새로 만들어진 릴레이션의 이름은 자유롭게 정하고, 기본키는 다중 값 속성과 외래키를 조합하여 지정한다.

 

기타 고려 사항

 기본 변환 규칙에서는 다대다 관계만 릴레이션으로 변환하였지만 일대일, 일대다 관계도 릴레이션으로 변환할 수 있다. 특히, 속성이 많은 관계는 관계 유형에 상관없이 릴레이션으로 변환하는 것을 고려할 수 있다.

 

릴레이션 스키마 변환 규칙을 이용한 논리적 설계

 

릴레이션 스키마로 변환할 한빛 마트 E-R 다이어그램

 

 논리적 설계를 위해 E-R 다이어그램을 릴레이션 스키마로 변환할 때는 변환 규칙을 순서대로 적용하면 된다.

 

 규칙 1은 모든 개체를 릴레이션으로 변환하는 것이다.

 

규칙 1을 적용한 결과

 

규칙 2는 다대다 관계를 릴레이션으로 변환하는 것이다.

 

규칙 2를 적용한 결과

 

 주문 릴레이션에서 회원아이디와 상품번호는 외래키이며, 이 둘을 조합하여 기본키로 사용한다.

 

 규칙 3은 일대다 관계를 외래키로 표현하는 것이다.

 

규칙 3을 정요한 결과

 

 상품 릴레이션의 제조업체명과 게시글 릴레이션의 회원아이디가 외래키이다.

 

 일대일 관계가 없으므로 규칙 4를 적용할 필요가 없고, 다중 값 속성도 없으므로 규칙 5도 적용할 필요가 없다.

 

 다섯 가지의 변환 규칙을 순서대로 적용하여 최종적으로 변환된 릴레이션 스키마에 대해 속성의 데이터 타입과 길이, 널 값 허용 여부, 기본값, 제약조건 등을 결정하는 것도 논리적 설계 단게에서 수행하는 작업이다. 이처럼 릴레이션 스키마에 대한 설계 정보를 기술한 문서를 테이블 명세서라고 한다.

 

회원 릴레이션 스키마의 테이블 명세서

'데이터베이스 > 데이터베이스 설계' 카테고리의 다른 글

물리적 설계와 구현  (0) 2024.06.08
개념적 설계  (0) 2024.06.08
요구 사항 분석  (0) 2024.06.07
데이터베이스 설계 단계  (0) 2024.06.07