DB

22.05.17

가로선 2022. 5. 17. 18:13

 

   목차   

 

1. 데이터베이스

 - 데이터베이스 정의

 - 데이터베이스 특징

 - 데이터베이스 시스템, 구성요소

 - SQL(DDL, DML, DCL)

 - 테이블 구성요소

2. DB 설치(MySQL로 설치 진행)

 - 서버별 역할 분배

 - MySQL 서버 설치

 - MySQL 클라이언트 설치

 - 원격 접속

 - DB 명령어

 - DB 조건문

3. PHP 설치방법

4. PHP 파일을 통해 DB에 저장

 - 설정 방법

 - 테스트


 

   데이터베이스   

 

   데이터베이스 정의   

 - 특정 조직의 업무를 수행하는데 필요한 상호 관련된 데이터들의 모임

    - 통합된 데이터 : 자료의 중복을 배제한 데이터의 모임

    - 저장된 데이터 : 컴퓨터가 접근할 수 있는 저장 매체에 저장된 자료

    - 운영 데이터 : 조직의 고유 업무를 수행하는데 반드시 필요한 자료

    - 공용 데이터 : 여러 응용 시스템들이 공동으로 소유하고 유지하는 자료

 

   데이터베이스 특징   

 - 실시간 접근성 : 수시적이고 비정형적인 조회에 대해 실시간 처리에 의한 응답이 가능

 - 계속적인 변화 : DB의 상태는 동적이므로, 새로운 데이터의 삽입, 삭제, 갱신으로

                                 항상 최신의 데이터를 유지

 - 동시공용 : DB는 서로 다른 목적을 가진 여러 사용자들을 위한 것이므로

                       다수의 사용자가 동시에 같은 내용의 데이터를 이용가능해야함

 - 내용에 의한 참조 : DB에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에

                                      의해서가 아닌 사용자가 요구하는 데이터 내용으로 데이터를 검색

 

   데이터베이스 시스템   

 - DB를 이용하여 자료를 저장, 관리하여 정보를 얻어내는데 필요한 컴퓨터 중심 시스템

 

   데이터베이스 시스템 구성요소   

 - 데이터베이스 : 물리적인 기억 장치에 저장된 데이터의 집합체

 - 스키마 : DB내의 데이터의 구조, 관계, 제약조건에 대한 명세

    - 속성이라고 생각하자!

 - DB 관리 시스템(DBMS) : 사용자가 DB를 생성하여 안정적이고 효율적으로

                                                  운영하는데 필요한 모든 기능들을 제공하는 SW

 - DB Language : 널리 사용되는 관계형 DB에서는 SQL이 모든 기능을 담당

    - DDL, DML, DCL 포함

 - 사용자 : 데이터베이스 관리자(DBA), 응용프로그래머, 최종사용자

 - H/W : DB가 저장되는 기억장치

 

   SQL(Structured Query Language)   

 - 구조적 질의 언어

 - 해당 질의 언어를 통해 DB를 제어, 관리

 

 - DDL(Data Definition Language) : 데이터 정의어

    - DB를 정의하는 언어

    - Data를 생성, 수정, 삭제

    - 데이터의 전체의 골격을 결정하는 역할

    - DB 관리자, 설계가자 주로 사용

        - 스키마, Domain, Table, INDEX 등을 정의하거나 변경, 삭제할 때 사용

 

종류 역할
CREATE 데이터베이스, 테이블 등을 생성
ALTER 테이블 수정
DROP 데이터베이스 테이블을 삭제
TRUNCATE 테이블을 초기화

 

 - DML(Data Manipulation Language) : 데이터 조작어

    - 정의된 DB에 입력된 레코드를 조회하거나 수정, 삭제

    - DB 사용자가 질의어를 통해 저장된 데이터를 실직적으로 처리하는데 사용되는 언어

    - DB 사용자와 DBMS 간 인터페이스 제공

 

종류 역할
SELECT 데이터를 조회
INSERT 데이터를 삽입
UPDATE 데이터를 수정
DELETE 데이터를 삭제

 

 - DCL(Data Control Language) : 데이터 제어어

    - DB에 접근하거나 객체에 권한 부여시 사용

    - 데이터의 보안, 무결성, 회복, 병행 수행제어 등을 정의

 

종류 역할
GRANT 특정 DB 사용자에게 특정 작업에 대한 수행권한 부여
REVOKE 특정 DB 사용자에게 특정 작업에 대한 수행권한 박탈
COMMIT 트랜잭션의 작업을 원래대로 처리
ROLLBACK 트랜잭션의 작업을 취소 및 원래대로 복구

 

   테이블 구성요소   

 - 릴레이션(= 테이블) : 관계형 DB에서 정보를 저장하는 기본단위(행과열, 고유 이름)

    - Excel의 Sheet 생각하자!

 - 속성(Attribute) : 하나의 열은 여러개의 속성 정보 표시

    - 동일 이름의 속성 존재 불가

 - 차수(Degree) : 하나의 릴레이션에 들어있는 속성의 수

 - 튜플(Tuple, 레코드) : 엔티티의 특정 인스턴스에 관한 값들의 모임

 - 카디날리티 : 릴레이션의 튜플의 갯수

 - 도메인 : 속성들이 가질 수 있는 값

 

속성, 차수, 튜플, 카디널리티 정리(출처 : https://mangkyu.tistory.com/21)

 

슈퍼키, 후보키, 기본키 정리

    - 슈퍼키 : 특정튜플식별을 하는 유일성을 만족

    - 후보키 : 각 행을 유일하게 식별할 수 있는 최소한의 속성 집합

        - 기본키의 후보들

        - 최소성 만족

    - 기본키 : 후보키들 중 하나를 선택한 키

        - 최소성, 유일성 모두 만족

        - NULL값을 절대 못가지며, 중복값 x

    - 대체키 : 기본키로 지정하고 남은 후보키

 

 

   DB 설치   

 - MySQL, MariaDB 중 MySQL로 설치 진행

 

   MySQL 서버 설치   

 

MySQL 설치를 위해 Repository 구성

 

MySQL 서버 설치

 

GPG-KEY 문제로 인해 설치가 되지 않는 것을 확인

 

mysql-community Repoisotry 파일 수정

 

MySQL 5.7버전 관련 설정쪽에서 gpgcheck을 1에서 0으로 변경(설정을 꺼주는 역할)

    - 설정 이후, 문제 없이 설치되는 것을 확인

 

mysqld 서비스 시작

 

초기 비밀번호 기억

    - 비밀번호를 필히 변경해야하는데 초기 비밀번호가 로그파일에 존재하므로, 확인이 필수다

 

해당 위치에서 비밀번호 초기화 및 보안강화

 

비밀번호 설정

    - 초기 비밀번호를 찾아 들어온 후, 처음 작성하는 비밀번호는 비밀번호 강도 체크이며

      그 다음 작성하는 비밀번호가 MySQL의 비밀번호가 된다

 

보안관련 질문에 대한 대답

    - anonymous 사용자 삭제나, 원격에서 루트 로그인 불허 등을 묻는다

    - anonymous 사용자 삭제를 하게 되면 로그인시 -u 옵션이 필요

 

보안관련 질문에 대한 대답

    - test DB 생성, 변경 권한을 테이블에 적용에 대한 질문

 

MySQL 접속

    - p옵션 뒤에 바로 '비밀번호'로 접속이 가능하지만, 보안상 좋지 않다

 

   MySQL 클라이언트 설치   

 - Reposiotry 구성 이후, gpgcheck 해제 후 설치 진행

 

client 설치 진행

 

   MYSQL 원격접속   

 

MySQL 서버에 root 사용자는 존재하나 원격 접속 권한은 없는 것을 확인

 

root 사용자에게 모든 권한 부여

    - db이름.테이블 이름 순으로 설정

    - DB에서는 %가 모든 원격지를 뜻한다

 

새로운 설정 적용

 

원격 접속을 위해 방화벽 포트 개방

    - MySQL의 포트는 3306 포트이다

 

원격지인 CentOS7-1에서 접속

 

   DB 명령어   

 

show databases를 통해 DB 확인 가능

 

DB 접속 및 table 확인

 

mysql DB의 user 테이블에 대해 모든 정보를 가져올 수 있다

 

desc 명령어를 통해 user 테이블에 어떤 칼럼이 있는지 구조가 무엇인지 조회

 

DB이름.table이름으로도 조회 가능

    - mysql DB에 접속하여 user 테이블을 조회하는 것과 똑같은 결과값을 도출

 

원하는 칼럼만 조회가 가능

    - *은 모든 칼럼을 조회하는 것이지만, 원하는 칼럼만 입력하여 조회도 가능

 

testdb라는 이름의 DB 생성

 

DB 사용을 위해 use를 사용하여 접근

 

테이블 생성

    - no, name, id, pass 총 4가지의 칼럼을 추가

    - not null은 빈칸을 허용하지 않는다는 의미

 

생성한 testtb 조회

 

table에 레코드 추가

    - insert를 사용하여 각각 칼럼에 맞게 레코드를 추가한다

 

select을 통해 작성한 데이터 조회

 

새로운 값을 추가한 후 조회

 

마찬가지로 원하는 칼럼만 조회 가능

 

조회하는 칼럼의 위치는 바뀌어도 상관 없다

 

여러 레코드를 삽입 후, 확인

 

uniontb라는 새로운 table 생성 후, 확인

 

uniontb에 레코드들 삽입

 

삽입된 레코드 조회

 

   DB 조건문   

 

where 조건문을 사용하여 3번의 레코드만 불러올 수 있다

    - 원래의 select * from testtb라면 삽입된 모든 값을 불러오나, where 조건문을 통해

      원하는 레코드만 불러오게 되는 것이다

    - ;을 뒤에 빼먹었다면 다음줄로 넘어가서 작성할 수도 있다

 

1번 또는 4번 레코드만 조회

    - 현재 레코드에는 1, 4번 둘다 존재하므로 2개가 다 조회된다

 

3번에서 6번 사이의 레코드만 조회

    - between A and B를 사용하여 조회 가능

 

kim이라는 이름으로 조회

    - where in 조건절을 사용하여 조회 가능

        - where 원하는 컬럼 in 조건

 

kang이라는 이름으로 조회

 

like을 사용하여 조회

    - like는 특정문자나 문자열을 포함하고 있는 값을 검색하고 싶을 때 사용

        - k%는 k로 시작하는 모든 문자열을 검색

 

no가 3보다 큰 레코드 조회

 

limit을 사용하여 조회

    - limit을 통해 검색하는 구문의 갯수를 제한할 수 있다

    - 레코드 값은 0부터 시작한다

        - 즉, no=1의 LEE 칼럼의 레코드 값은 0이다

 

레코드 값 0부터 시작해서 총 4개를 조회

 

레코드 값 2부터 시작해서 총 5개를 조회

 

union을 통해 2개의 table의 select 값을 합칠 수도 있다

    - union을 통해 조회할 때 중복되는 값은 1개만 표시해준다

    - 뒤의 칼럼 내용을 잘 모를 때 쓰기 좋은 방법이다

 

testtb와 union의 select 값을 합쳤을 때, no=8 조회

    - testtb는 7까지만 존재, uniontb와 합쳐지면서 uniontb의 값이 조회

        - 즉, 칼럼은 유효하나 testtb에선 만족하는게 없어 uniontb에서만 나온다

 

SQL Injection

    - SQL Injection : 악의적인 사용자가 보안상의 취약점을 이용하여임의의 SQL 문을 주입하고

                                     실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위

    - 1=1은 true이므로, no=8이 testtb에 없는데도 불구하고 모든 레코드가 조회 가능

 

SQL Injection

    - ID에는 test1을 넣고 1=1을 password에 넣게 되는 것

        - 원래라면 값을 가져와서 비교를 해야하는데 1=1을 사용함으로써 논리식으로 만든 것

        - 연산자라 어떻게 되는 참이되므로 다 출력되게 되는 것이다

 

 

   PHP 설치방법   

 - 사전 설정 없이 그냥 설치하게 되면 5.4버전이 설치되어 MySQL과 호환이

    안되는 문제가 발생할 수 있으므로 꼭 5.7버전으로 설치하는 것을 추천

 

epel-release, yum-utils 설치

    - epel-release : 저장소

    - yum-utils : yum-config manager 관리툴이 들어가 있다

 

Repository 구성

 

yum-config manager을 통해 php73 활성화

 

php 관련 패키지 설치

    - CLI 방식 설치 및 MySQL과 연동을 위한 php-mysql 설치

 

php 접속 부분에서 오류가 발생하여 php 관련 모든 패키지 설치 진행

    - 설치 완료 후, 7.3버전이 설치되었는지 꼭 확인

 

 

   PHP 파일을 통해 DB에 저장   

 

   설정 방법   

 - index.php, person1.php, insert1.php, table1.php을 통해 테스트 

 

다운받은 파일들의 인코딩 방식을 UTF-8로 바꿔 다시 저장

 

다시 열어봤을 때 UTF-8로 바뀌어 있는지 확인

 

SCP를 통해 CentOS7-1의 /var/www/html/로 php파일들 복사

 

복사가 잘 되었는지 확인

 

httpd.conf 수정

 

메인 화면 index.html이 아닌 index.php로 수정

 

WEB서비스 시작 및 포트 개방

 

HOST-PC에서 접속했을 때 아직 DB가 없어 해당 화면이 출력되는 것을 확인

 

index.php 파일 수정

 

DB 서버 위치와 접속 PW 입력

 

inser1.php 파일 수정

 

DB 서버 위치 및 접속을 위한 PW 입력

 

person1.php 파일 수정

 

각각의 파일들이 CentOS7-1에 존재하므로 CentOS7-1의 IP로 수정

 

table1.php 파일 수정

 

DB 서버 수정 및 접속 PW 수정

    - DB의 이름이 member로 설정되어 있으므로, member라는 이름의 DB 생성 필수

 

접속 성공 확인

 

table1.php에서 작성되어야할 칼럼 확인

 

member라는 이름의 DB 생성

 

member DB 접속

 

table1.php에 작성된 대로 칼럼 작성

 

   테스트   

 

10.0.0.11/person1.php에 접속

    - 해당 값들 입력 후, 회원가입 클릭

    - 테이블 조회를 통해 table1.php로 이동

 

입력한 값들이 조회되는 것을 확인

 

다른 값을 입력했을 때도 조회되는 것을 확인