초기에는 데이터를 파일 시스템에 저장하고 관리했다. 하지만 파일 시스템은 데이터를 일관성 있게 관리하기 어려웠으며, 데이터가 중복 저장되고, 응용 프로그램이 데이터 파일에 종속적인 단점들이 있었고, 이와 같은 데이터 관리의 문제를 해결하기 위해 관계형 데이터베이스가 개발되었다.
DBMS는 데이터를 구조화하고 저장하여, 조직이나 개인이 데이터를 효율적으로 관리할 수 있도록 한다. 데이터베이스를 활용하면 데이터를 중복 저장하지 않아도 되므로, 데이터 일관성과 무결성을 보장할 수 있다. 또한 데이터를 빠르게 검색하고 업데이트하며, 보안적인 측면에서도 더욱 안전하게 데이터를 보호할 수 있다.
RDBMS는 데이터를 테이블 형태로 표현한다. 테이블에 데이터를 행(row)으로 저장되며, 각 열(column)은 해당 데이터의 속성(attribute)를 나타낸다.
데이터베이스나 검색 엔진에서 정보를 요청하거나 검색하는 동작을 나타내는 용어이다.
우리가 구글에 검색어를 입력하면 쿼리가 사용되어 데이터베이스에서 필요한 데이터를 필터링하여 결과창에 가져오는 것이다.
트랜잭션(Transaction)은 데이터베이스에서 데이터를 읽거나 쓰는 작업의 논리적 단위를 말한다.
데이터베이스는 여러 사용자가 동시에 접근하여 데이터를 수정하거나 삭제하는 경우가 많기 때문에, 이러한 작업들이 정확하게 수행되어야 한다. 따라서 트랜잭션으로 여러 작업을 묶어서 모두 완료되었을때만 작업을 실행하고, 작업 중 하나라도 실패할 경우에는 전체 작업이 롤백되어 이전 상태로 복원된다. 트랜잭션은 ACID 원칙을 따른다.
ACID 원칙은 은행예시를 들어서 이해하면 쉽다.
원자성(Atomicity) : 작업들은 모두 성공해야하거나 모두 실패해야 한다.
A가 B에게 10원을 이체한다면
작업1 : A통장은 10원이 줄어든다
작업2 : B통장은 10원이 늘어난다.
만약 B통장에 입금하는 작업이 안된다면 롤백되어 A통장에 줄어든 돈을 다시 돌려주어야 한다.
(더 정확히는 작업이 수행되지 않은 상태가 된다.)
일관성(Consistency) : 트랜잭션 전후에 데이터베이스의 일관된 상태가 유지되어야 한다.
이체 금액이 수신 계좌의 잔액을 초과하지 않아야 한다는 규칙은 일관성을 유지한다.
격리성(Isolation) : 트랜잭션은 독립적이고, 서로의 연산을 확인하거나 영향을 줄 수 없다.
A통장에 1000원이 있는데 B,C통장에 동시에 1000원씩 이체하려고 해도, 한번의 이체당 하나의 트랜잭션이 작동하므로 동시에 이체할 수 없다.
지속성(Durability) : 성공시 로그가 기록되고 영구적으로 남는다.
이체가 끝나고 은행에 정전이 일어나도 반영된 부분은 남아있다.
테이블에 적재될 데이터의 구조와 형식을 정의 하는 것으로 데이터의 설계도이다.
테이블간의 관계를 파악해서 스키마를 만드는데 RDBMS는 구조를 변경하면 데이터를 전부 변경해야하는 번거로움이 있기 때문에 초기에 잘 만드는 것이 좋다.
일대일 관계는 한 테이블의 레코드가 다른 테이블의 레코드와 하나의 관계를 가지는 경우이다. 예를 들어, 학생 테이블과 연락처 테이블이 있다고 가정하면, 학생은 한명의 연락처 정보만 가지므로 이들은 일대일 관계를 가진다.
일대다 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 관계를 가지는 경우이다.
예를 들어, 학생 테이블과 학급 테이블이 있다고 가정하면, 하나의 반에는 여러 명의 학생이 속하므로 학급와 학생 간에는 일대다 관계가 있다.
다대다 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 관계를 가지며, 그 반대도 성
립하는 경우이다. 예를 들어, 대학생과 과목에 대한 정보를 담은 두 개의 테이블이 있다고 가
정하면, 한 명의 학생은 여러 개의 과목을 수강할 수 있으며, 한 과목은 여러 명의 학생에게서 수강할 수 있으므로 학생과 과목 간에는 다대다 관계가 있다.
SQL은 영어문법과 비슷하고, 20개정도의 명령어로 대부분의 조작을 할 수 있기 때문에 익히기 쉽다. 많은 개발자들이 SQL을 자동으로 생성하는 프로그램인 ORM을 이용하는데 Spring에서는 JPA라는 ORM 기술을 사용한다.
ORM은 객체와 관계형 데이터베이스를 자동으로 매핑(연결)해주는 기능으로 DB와 관련된 기술을 객체 지향적인 코드로 사용하여 직관적이고 비즈니스 로직에 더 집중 할 수 있게 도와주는 기술이다. 백엔드 개발자라면 DB와 관련된 작업을 하기 위해 사용되는 SQL문을 작성할 줄 알아야 한다.
CREATE DATABASE `DB명` CHARACTER SET utf8 COLLATE utf8_general_ci;
DROP DATABASE `데이터베이스명`;
SHOW DATABASES;
USE `데이터베이스명`;
⭐ 작업전에는 데이터베이스를 꼭 선택해야 한다.
데이터베이스 스키마를 정의하며, 데이터 타입, 제약 조건, 테이블 관계 등을 정의할 수 있다.
대표적인 명령어 : CREATE, ALTER, DROP
CREATE TABLE table_name (
칼럼명1 data_type,
칼럼명2 data_type
)
EX)
CREATE TABLE `student` (
`id` tinyint NOT NULL ,
`name` char(4) NOT NULL ,
`sex` enum('남자','여자') NOT NULL ,
`address` varchar(50) NOT NULL ,
`birthday` datetime NOT NULL ,
PRIMARY KEY (`id`)
);
// 테이블에 새로운 열 추가하기
ALTER TABLE customers
ADD email VARCHAR(255);
// 기존의 열의 데이터 타입 변경하기
ALTER TABLE customers
MODIFY COLUMN email TEXT;
// 열 이름 변경하기
ALTER TABLE customers
CHANGE COLUMN email email_address VARCHAR(255);
// 테이블 이름 변경하기
ALTER TABLE customers
RENAME TO clients;
DESC `테이블명`;
DROP TABLE 테이블명;
데이터를 조회, 삽입, 수정, 삭제하는 명령어를 의미한다.
대표적인 명령어 : SELECT, INSERT, UPDATE, DELETE
1. INSERT INTO table_name VALUES (value1, value2, value3,...)
2. INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
// 구조를 지정하여 추가하는 두번째 방식이 더 바람직하다.
EX1) INSERT INTO `student` VALUES ('2', 'leez', '여자', '서울', '2000-10-26');
EX2) INSERT INTO `student` (`id`, `name`, `sex`, `address`, `birthday`) VALUES ('1', 'egoi', '남자', 'seoul', '2000-11-16');
UPDATE 테이블명 SET 컬럼1=컬럼1의 값, 컬럼2=컬럼2의 값 WHERE 대상이 될 컬럼명=컬럼의 값
EX) UPDATE `student` SET name='이고잉', birthday='2001-4-1' WHERE id=3;
DELETE FROM 테이블명 [WHERE 삭제하려는 칼럼 명=값];
// []를 추가하지 않으면 테이블안의 모든 내용이 삭제된다.
EX) DELETE FROM student WHERE id = 2;
TRUNCATE 테이블명;
// 테이블의 전체 데이터를 삭제
// 테이블에 외부키(foreign key)가 없다면 DELETE보다 훨씬 빠르게 삭제된다.
DROP TABLE 테이블명;
// 테이블을 삭제한다.
데이터는 SELECT를 사용하여 조회할 수 있는데,
테이블 관련 작업시에는 FROM으로 테이블을 명시해야하고,
다양한 필터링기능과 함께 사용하는 경우가 많다.
1) FROM : 결과를 도출할 테이블 명시
2) WHERE : 필터 역할
3) LIMIT : 출력할 데이터의 갯수 지정
4) DISTINCT : 유니크한 값을 받고 싶을때 사용
SELECT name, birthday FROM student;
SELECT * FROM student WHERE id=3;
SELECT * FROM student WHERE sex='여자' OR address='서울';
SELECT * FROM student LIMIT 3,1;
SELECT * FROM student WHERE sex='남자' LIMIT 2;
5) GROUP BY : 특정 칼럼을 기준으로 그룹핑 함
select sex from student group by sex;
select sex,sum(distance), avg(distance) from student group by sex;
6) ORDER BY : 지정한 칼럼을 기준으로 행을 정렬
elect * from student order by distance desc;
select * from student order by distance desc, address asc;
// distance기준으로 정렬후 동일한 값은 address기준으로 정렬함
7) JOIN : 여러개의 테이블을 연결, 조건에 맞는 레코드들을 연결
보안 관리, 권한 부여 등 데이터베이스에 접근하는 사용자를 관리하는 데 사용된다.
대표적인 명령어 : GRANT, REVOKE
// 권한 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON employees TO user1;
// 권한 취소
REVOKE SELECT, INSERT, UPDATE, DELETE ON employees FROM user1;
트랜잭션을 커밋, 롤백, 저장 등을 수행할 수 있다.
대표적인 명령어 : COMMIT, ROLLBACK, SAVEPOINT
// 트랜잭션 시작
START TRANSACTION;
// 커밋
COMMIT;
// 롤백
ROLLBACK;
// 저장
SAVEPOINT sp1;
키는 데이터를 구별하거나 찾기 위한 수단이다.
데이터를 조작하거나 검색할 때 식별할 수 있는 유일한 값으로 사용된다.
데이터베이스의 성능에 영향을 미치기 때문에 키의 선택과 사용은 매우 중요하다.
테이블 내에서 각 레코드를 고유하게 식별하는 데 사용되는 키
NULL 값을 가질 수 없으며, 테이블 당 하나만 존재
테이블에서 PK가 아닌 다른 유일한 값을 사용하여 레코드를 식별하는 데 사용되는 키
다른 테이블의 PK를 참조하는 키
관계형 데이터베이스에서 테이블 간의 관계를 표현하는 데 사용
각 레코드를 고유하게 식별할 수 있는 키로서 PK가 될 수 있는 후보가 되는 키
둘 이상의 열을 결합하여 레코드를 고유하게 식별하는 키
게시물의 본문은 TEXT, 제목은 VARCHAR, 아이디처럼 길이 제한이 있을땐 CHAR처럼 상황에 따라 적절한 타입을 사용하는 것이 좋다.