# git linux 설치
# GIT 설치 확인
$ git --version
# 설치가 안되어있다면 설치
$ sudo apt update
$ sudo apt install git
$ Y
# git 이름과 이메일 정보 저장
$ git config --global user.name '[유저이름]'
$ git config --global user.email '[GIT 이메일]'
$ git config --list
# 기존 키 삭제하고 새로운 키 생성
$ rm ~/.ssh/id_rsa
$ ssh-keygen 0t ed25519 -C '[GIT 이메일]'
GIT 정보 저장key 생성생성된 key 확인
2. KEY 다운로드
SSH 폴더id_ed25519.pub 윈도우로 다운로드다운로드 받은 KEY를 삭제
3. KEY GIT 설정
Settingsssh Key 생성다운로드 받은 id_ed25519.pub를 복사해서 key에 입력하고 Add SSH keyKey 생성 완료
4. linux에 git clone
ssh 복사
# linux에 git clone
$ cd develop
$ git clone [Git에서 복사한 ssh]
$ yes
# clone 되었는지 확인
$ls
linux에 git clone
4. linux에서 README.md 생성
$ cd gittest
#README.MD 파일 생성
$ ehco "GIT TEST > README.md
$ ls
Git은 Commit을 시간 순으로 저장하며 이전 Commit 상태부터 현재 Commit 상태까지 만들어 보관한다.
Commit 내용을 통해 변경 이력과 변경 내용을 확인할 수 있다.
3.4. Branch
저장소 내에서 다른 작업에 영향을 받지 않는 독립된 단위의 저장소를Branch
즉, Branch는 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어 주는 기능
3.5. Checkout
현재 Branch를 다른 Branch로 전환하는 것을Checkout
3.6. Merge
특정 브랜치의 작업 내용을 다른 브랜치에 병합하는 것을Merge라고 한다.
- 원격 Branch 추가
relaese 더블 클릭확인원격 브랜치 추가
- source tree에서 브랜치 추가
브랜치 클릭notice 브랜치 생성원격지에 notice 브랜치 pushnotice 선택 하고 push
3.7. Clone
원격 저장소의 내용을 로컬 저장소에 복제하는 것Clone
기본 브라우저여야만 함clone 생성인증clone 생성 완료
3.8. Push
로컬 저장소에서 변경된 이력을 원격 저장소에 업로드하는 것Push
3.8. Pull
원격 저장소에서 최신 변경 이력을 다운로드하여 로컬 저장소에 적용하는 것Pull
4. .gitignore 파일
Git에서 관리하지 않는 파일들의 목록을 작성하는 파일을.gitignore 파일
.gitignore 파일은 저장소 최상위에 저장되어야 정상적으로 동작
### Java ###
# Compiled class file
*.class
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
### Windows ###
# Windows thumbnail cache files
Thumbs.db
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
5. GIT FLOW
GIT FLOW 전략
5.1 local 저장소 생성
local 저장소 gitflowtest 생성
5.2 README.md 파일 생성후 커
README.md 파일 생성
README.md 파일 commit
5.3 브랜치 이름 변경
master 브랜치 이름 변경main으로 변경깃플로우 선택Git Flow 저장소 초기화브랜치 구조가 변경됨
5.4 Git Flow 기능 생성
Git Flow 기능 시작board 기능 추가feature 브랜치가 생성됨게시판 페이지.txt 파일 생게시판 페이지.txt 파일 commitGit flow 다른동작 후 새기능notice 기능 추가notice 기능 생성됨공지사항 페이지.txt 파일 생성공지사항 페이지.txt commit게시판 기능 구현 완료한 후 commit
SELECT e.emp_id AS '사번',
e.emp_name AS '직원명',
d.dept_title AS '부서명',
l.local_name AS '지역명'
FROM employee e
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
ORDER BY emp_name
;
-- 부서가 있는 사원만
SELECT e.emp_id AS '사번',
e.emp_name AS '직원명',
d.dept_title AS '부서명',
l.local_name AS '지역명',
n.national_name AS '국가명'
FROM employee e
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
INNER JOIN national n ON l.national_code = n.national_code
;
-- 부서가 없는 사원도
SELECT e.emp_id AS '사번',
e.emp_name AS '직원명',
d.dept_title AS '부서명',
l.local_name AS '지역명',
n.national_name AS '국가명'
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
LEFT OUTER JOIN national n ON l.national_code = n.national_code
;
부서가 존재하는 사원만부서가 존재하지 않는 사원
3. 테이블을 다중 JOIN 하여 사번, 직원명, 부서명, 지역명, 국가명, 급여 등급 조회하시오.
SELECT e.emp_id AS '사번',
e.emp_name AS '직원명',
d.dept_title AS '부서명',
l.local_name AS '지역명',
n.national_name AS '국가명',
g.sal_level AS '급여 등급'
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
LEFT OUTER JOIN national n ON l.national_code = n.national_code
INNER JOIN sal_grade g ON e.salary BETWEEN g.min_sal AND g.max_sal
;
SELECT e.emp_name AS '직원명',
j.job_name AS '직급명',
d.dept_title AS '부서명',
l.local_name AS '근무 지역'
FROM employee e
LEFT OUTER JOIN job j ON e.job_code = j.job_code
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
;
5. 직급이 대리이면서 ASIA 지역에서 근무하는 직원들의 사번, 직원명, 직급명, 부서명, 근무지역, 급여를 조회하시오.
SELECT e.emp_id AS '사번',
e.emp_name AS '직원명',
j.job_name AS '직급명',
d.dept_title AS '부서명',
l.local_name AS '근무 지역',
e.salary AS '급여'
FROM employee e
INNER JOIN job j ON e.job_code = j.job_code
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
WHERE l.local_name LIKE 'ASIA%' AND
j.job_name = '대리'
;
6. 보너스를 받는 직원들의 직원명, 보너스, 연봉, 부서명, 근무지역을 조회하시오. (단, 부서 코드가 없는 사원도 출력될 수 있게 OUTER JOIN 사용)
SELECT e.emp_name AS '직원명',
e.bonus AS '보너스',
e.salary * 12 AS '연봉',
d.dept_title AS '부서명',
l.local_name AS '근무 지역'
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN location l ON d.location_id = l.local_code
WHERE bonus IS NOT NULL
;
7. 한국과 일본에서 근무하는 직원들의 직원명, 부서명, 근무지역, 근무 국가를 조회하시오.
SELECT e.emp_name AS '직원명',
d.dept_title AS '부서명',
l.local_name AS '근무 지역',
n.national_name AS '근무 국가'
FROM employee e
INNER JOIN department d ON e.dept_code = d.dept_id
INNER JOIN location l ON d.location_id = l.local_code
INNER JOIN national n ON l.national_code = n.national_code
WHERE n.national_name IN ('한국', '일본')
;
다른 JOIN은 같은 지를 비교하지만 NON EQUAL JOIN은 조인 조건에 등호(=)를 사용하지 않는 조인
-- NON EQUAL JOIN 실습
-- 조인 조건에 등호(=)를 사용하지 않는 조인문을 비등가 조인이라고 한다.
-- employee 테이블과 sal_grade 테이블을 비등가 조인하여 직원명, 급여, 급여 등급 조회
-- INNER JOIN이기 때문에 조인 조건을 만족하는 경우가 아니면 출력이 안됨
SELECT e.emp_name,
e.salary,
s.sal_level
FROM employee e
INNER JOIN sal_grade s ON e.salary >= s.min_sal AND e.salary <= s.max_sal
# INNER JOIN sal_grade s ON e.salary between s.min_sal AND s.mas_sal과 결과 동일
;
-- 트리거 실습
-- 상품 입/출고 관련 예시
-- 1. 상품에 대한 데이터를 보관할 테이블 생성
CREATE TABLE tb_product(
pcode INT AUTO_INCREMENT PRIMARY KEY, -- 상품 코드
pname VARCHAR(100), -- 상품 이름
brand VARCHAR(100), -- 상품의 브랜드 이름
price INT, -- 상품의 가격
stock INT DEFAULT 0 -- 상품의 재고
);
-- 상품 데이터 삽입
INSERT INTO tb_product(pname, brand, price)VALUES('아이폰12미니', '애플', 950000);
INSERT INTO tb_product(pname, brand, price)VALUES('갤럭시23', '삼성', 950000);
##########################################################################################
-- 2. 상품 입/출고 상세 이력 테이블 생성
CREATE TABLE tb_prodetail(
dcode INT AUTO_INCREMENT PRIMARY KEY, -- 입출고 이력 코드
pcode INT REFERENCES tb_product(pcode), -- 상품 코드(외래키)
STATUS VARCHAR(2) CHECK(STATUS IN('입고', '출고')), -- 상태
amount INT, -- 수량
ddate DATE DEFAULT CURDATE() -- 상품 입/출고 일자
);
-- 상품 데이터 삽입
-- 1번 상품이 2024-05-01 날짜로 10개 입고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(1, '입고', 10, '2024-05-01');
## 트리거가 사용되지 않았을때의 입출고 관리
-- 1번 상품이 2024-05-02 날짜로 5개가 출고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(1, '출고', 5, '2024-05-02');
-- 1번 상품의 재고 수량도 변경해야 한다.
UPDATE tb_product
SET stock = stock - 5
WHERE pcode = 1
;
-- 2번 상품이 2024-05-06 날짜로 20개 입고
INSERT INTO tb_prodetail(pcode, STATUS, amount, ddate)
VALUES(2, '출고', 20, '2024-05-06');
-- 2번 상품의 재고 수량도 변경해야 한다.
UPDATE tb_product
SET stock = stock + 20
WHERE pcode = 2
;
## 트리거 생성시에 는 insert 작업만 해주면 됨
DELIMITER $$
CREATE OR REPLACE TRIGGER trg_pro_stock
AFTER INSERT ON tb_prodetail
FOR EACH ROW
BEGIN
-- 상품이 입고된 경우 (재고 증가)
IF NEW.status = '입고' THEN
UPDATE tb_product
SET stock = stock + NEW.amount
WHERE pcode = NEW.pcode;
END IF;
-- 상품이 출고된 경우 (재고 감소)
IF NEW.status = '출고' THEN
UPDATE tb_product
SET stock = stock - NEW.amount
WHERE pcode = NEW.pcode;
END IF;
END;
DELIMITER;
CREATE [OR REPLACE] VIEW 뷰 이름
AS 서브 쿼리
[WITH CHECK OPTION];
-- VIEW 실습
#1 뷰 생성
CREATE VIEW v_employee
AS SELECT e.emp_id,
e.emp_name,
d.dept_title,
j.job_name,
e.hire_date
FROM employee e
LEFT OUTER JOIN department d ON e.dept_code = d.dept_id
LEFT OUTER JOIN job j ON e.job_code = j.job_code;
#1
-- 사원의 사번, 직원명, 성별, 급여를 조회할 수 있는 뷰를 생성
#2
# OR REPLACE : 같은 이름의 뷰가 존재한다면 해당 뷰의 내용을 해당 쿼리문으로 덮어씀
# SELECT 쿼리에 함수나, 산술연산이 기술되어 있는 경우 별칭을 지정해야 한다.
CREATE OR REPLACE VIEW v_employee
AS SELECT emp_id,
emp_name,
if(SUBSTRING(emp_no, 8, 1)='1', '남자', '여자') AS gender,
salary
FROM employee;
SELECT * FROM v_employee;
3. 뷰의 수정
뷰를 수정할 때는 ALTER VIEW 구문을 사용
ALTER VIEW 뷰 이름 AS 서브 쿼리;
-- 뷰 수정
ALTER VIEW v_userbuy
AS SELECT u.userid,
u.NAME,
b.prodName,
u.addr,
CONCAT(u.mobile1, u.mobile2) AS 'mobile'
FROM usertbl u
INNER JOIN buytbl b ON u.userId = b.userID
;
4. 뷰의 삭제
뷰를 삭제할 때는 DROP VIEW구문을 사용
DROP VIEW 뷰 이름;
5. 뷰의 DML 작업
DML 작업이 가능한 경우
-- 뷰를 이용해서 DML(INSERT, UPDATE, DELETE) 사용
#1 v_job 생성
CREATE OR REPLACE VIEW v_job
AS SELECT *
FROM job
;
#1 v_job 뷰 생
#2 VIEW INSERT (job_code = 'J8', job_name = '알바' 데이터 삽입)
INSERT INTO v_job VALUES('J8', '알바');
SELECT * FROM v_job;
SELECT * FROM job
#2 view에 데이터가 삽입됨
#3 원본 테이블에도 데이터가 삽입
#3 VIEW UPDATE (J8 직급명을 인턴으로 변경)
UPDATE v_job
SET job_name = '인턴'
WHERE job_code = 'J8'
;
#3 데이터의 내용이 변경됨#3 원본 테이블 값도 함께 변경
#4 VIEW DELETE (J8 직급명인 데이터를 삭제)
DELETE
FROM v_job
WHERE job_code = 'J8'
;
#4 데이터가 삭제됨#4 원본 테이블의 데이터도 함께 삭제
DML 조작이 불가능한 경우
1. 뷰 정의에 포함되지 않는 열을 조작하는 경우
#1 v_job 뷰 생성
CREATE OR REPLACE VIEW v_job
AS SELECT job_code
FROM job
;
-- 1.INSERT
#1 VIEW에 정의된 열에 값을 삽입하는 것은 불가
# 제약 조건에 위배되는 값을 넣어도 에러 발생
INSERT INTO v_job VALUES('J8', '인턴');
#2 데이터 삽입이 가능
INSERT INTO v_job VALUES('J8');
-- 2.UPDATE
#1 v_job 뷰는 job_code만 접근할 수 있기 때문에 에러발생
UPDATE v_job
SET job_name = '인턴'
WHERE job_code = 'J8'
;
#2 데이터 수정이 가능
UPDATE v_job
SET job_code = 'J0'
WHERE job_code = 'J8'
;
-- 3.DELETE
#1 v_job 뷰는 job_code만 접근할 수 있기 때문에 에러발생
DELETE
FROM v_job
WHERE job_name IS NULL
;
#2
DELETE
FROM v_job
WHERE job_code = 'J0'
;
2. 산술 표현법으로 정의 된 경우
#1 v_emp_salary 뷰 생성
-- 사원의 연봉 정보를 조회하는 뷰
CREATE VIEW v_emp_salary
AS SELECT emp_id,
emp_name,
emp_no,
salary * 12 AS 'salary'
FROM employee
;
-- 1.INSERT
#1 산술 연산으로 정의된 컬럼은 데이터 삽입이 불가능
INSERT INTO v_emp_salary
VALUES ('100', '홍길동', '940523-1111111', '30000000');
#2 산술 연산과 무관한 컬럼은 데이터 삽입 가능
INSERT INTO v_emp_salary(emp_id, emp_name, emp_no)
VALUES ('100', '홍길동', '940523-1111111');
-- 2.UPDATE
#1. 산술 연산으로 정의된 열은 데이터 변경 불가능
UPDATE v_emp_salary
SET salary = 30000000
WHERE emp_id = '100'
;
#2. 산술 연산과 무관한 열은 데이터 변경 가능
UPDATE v_emp_salary
SET emp_name = '고길동'
WHERE emp_id = '100'
;
-- 3.DELETE
# 가상으로 설정된 값을 입력하고 변경하는 것이 아닌
# 조회해서 삭제하는 것은 가능
DELETE
FROM v_emp_salary
WHERE salary = 36000000;
3. 그룹 함수나 GROUP BY 절을 포함한 경우(DISTINCT도 동일)
#1 v_emp_salary 뷰 생성
CREATE OR REPLACE VIEW v_emp_salary
AS SELECT dept_code,
FLOOR(SUM(salary)) AS 'sum',
floor(AVG(salary)) AS 'avg'
FROM employee
GROUP BY dept_code
;
-- 1.INSERT
#1 그룹 함수로 생성된 열은 가상의 열이기때문에 삽입이 불가능
INSERT INTO v_emp_salary VALUES('D7', 8000000, 4000000);
#2 GROUP BY로 생성된 테이블의 dept_code열에는 삽입이 불가능
INSERT INTO v_emp_salary(dept_code) VALUES('D7');
-- 2.UPDATE
#1 그룹 함수로 생성된 열은 가상의 열이기때문에 수정이 불가능
UPDATE v_emp_salary
SET SUM = 6000000
WHERE dept_code = 'D2'
;
#2 GROUP BY로 생성된 테이블의 dept_code 열은 수정이 불가능
# 원본 테이블의 해당 dept_code인 열이 모두 수정 되기 때문
UPDATE v_emp_salary
SET dept_code = 'D7'
WHERE dept_code = 'D2'
;
-- 3.DELETE
#1 GROUP BY로 생성된 테이블의 dept_code 열은 삭제가 불가능
# 원본 테이블의 해당 dept_code인 열이 모두 삭제 되기 때문
DELETE
FROM v_emp_salary
WHERE dept_code = 'D2'
;
-- 2.UPDATE
#1 실행 가능
UPDATE v_emp_dept
SET dept_title = '총무1팀'
WHERE emp_id = '200'
;
#2 실행 가능
UPDATE v_emp_dept
SET emp_name = '서동일'
WHERE emp_id = '200'
;
-- 3.DELETE
#1 오류 발생
DELETE
FROM v_emp_dept
WHERE emp_id = '202'
;