Search

반응형

'COMMIT'에 해당되는 글 2건

  1. 2024.01.14 [Git]Git Bash 간단 명령어 정리. (init, config, status, add, commit) 1
  2. 2020.07.29 [데이터베이스]TCL(Transaction Control Language) - commit, rollback, savepoint - SQL, 오라클(ORACLE)
반응형

옛날 옛적 프로젝트에서는 소스관리나 형상 관리를 거의 사용하지 않고 각자 컴퓨터에서 개발하고 개발 서버에 반영했던 기억이 있습니다. 충돌도 자주 나고 엉뚱한 소스를 삭제해서 문제가 되기도 했답니다.

물류창고 자동화 프로젝트에 투입되어 저 아랫동네로 간 적이 있었습니다. 비주얼베이직으로 개발했는데 당시 해당 업체는 소스관리를 사용하고 있었습니다. 체크아웃, 체크인 등등 첨 듣는 용어를 사용하면서 우리도 이제 개발에 투입되었으니 소스관리를 해야 한다고 하더군요.

그 뒤로 프로젝트에 투입하면 CVS로 버전 관리를 하면서 commit, update 등을 사용하고 SVN으로 이동하더니 요즘은 git을 사용하더군요. 반면 최근 OO금융권 사이트에 갔는데 SVN과 Git을 혼용해서 사용하는 거 보면 SVN이 사장된 건 아닌가 봅니다.

개발자이지만 보통 중대형급 프로젝트에 투입되니 Git을 설정하고 구성하는 일을 해본적은 없고 보통 갖춰진 환경에서 push, pull 등의 명령어로 작업해 왔습니다. 그러나 개발자 사이트나 유튜브를 보면 git을 많이 활용하고 있더군요. 블로그에서 github에 기술 문서나 소스를 올리고 개인 영역을 만들어 홍보도 하고 예제 소스도 받을 수 있더군요.

그래서 늦었지만 ? git 책을 보면서 실습을 해봤습니다.

간단하게 로컬에서 git환경을 만들어봤고 명령어를 사용해 봤습니다.

까먹지 않게 몇 가지 정리해 봤습니다.

  1. git bash 실행하기

git으로 소스 관리하기 원하는 위치에 폴더를 만듭니다.

폴더로 들어가서 마우스 우클릭을 합니다. (git이 설치되어 있어야 합니다.) 

git bash가 안보임

만약 위 이미지처럼 git bash here가 안 보이면 추가 옵션 표시를 클릭합니다.

이제 Git Bash Here를 클릭합니다. 그러면 cmd 창이 열립니다.

 

2. git 생성하기

새로 만든 폴더에서 소스 관리를 위해 git 생성을 해보겠습니다. 엄청 쉽습니다. 현재 폴더는 텅텅 비어있겠죠?

이제 마법을 시작합니다. git bash에 다음 명령어를 입력합니다. 그전에 위 이미지의 우측 노란색 경로가 내가 위치한 곳이 맞는지 반드시 확인해야 합니다.

$git init를 실행하면 위 이미지처럼 생성이 됩니다.

그리고 이렇게 숨겨진 .git 폴더가 보입니다. 만약 안 보인다면 숨겨진 폴더 보기 옵션에서 설정하면 보입니다.

윈도우즈 11인 경우는 아래와 같이 설정을 체크하면 숨겨진 폴더가 보입니다.

 숨긴 항목 표시에 체크를 하면 .git 폴더가 보일 것이고 성공적으로 git 설정이 되었습니다.

이제 git config --list를 실행해 봅니다.

현재 위치 뒤로 (master)가 보이는데 현재 master 브랜치임을 의미합니다.

git config --list 실행해서 결과가 잘 나오면 설정이 잘 된 겁니다.

이제 다음 명령어를 입력합니다.

git status를 입력하면 현재 작업 진행 내역을 확인할 수 있습니다.

On branch master는 현재 master 브랜치에 위치하고 있다는 의미입니다.

No commits yet은 아직 commit 할 소스가 없다는 의미입니다.

 

3. 신규파일 추가하기.

이제 새로운 파일을 만들고 git으로 관리해 보겠습니다.

먼저 해당 폴더에 새로운 파일 하나를 만듭니다. 여러 가지 방법으로 만들 수 있지만 우클릭으로 텍스트파일을 하나 만들겠습니다. 아래 이미지와 같이 텍스트파일을 선택하고 파일이름을 first.txt로 만듭니다.

이제 이 파일을 열어서 내용을 입력합니다. 원하는 글자 아무거나 넣어도 됩니다.

사과를 입력해 보겠습니다. 그리고 저장합니다.

이제 다시 git bash창으로 이동해서 다음 명령어를 입력합니다.

git status를 입력하고 엔터를 치면 위 이미지처럼 결과가 나옵니다. 빨간색 first.txt 글자가 보입니다.

git add를 해서 commit를 하라는 의미입니다. 

git add first.txt라고 입력하고 엔터를 치면 빈 줄 하나 나옵니다. 정상으로 add가 되었다는 의미입니다.

다시 git status 명령어를 실행해 보겠습니다.

git add를 하고 난 후는 빨간색 first.txt가 초록색으로 변했습니다.

new file이라는 표시도 보입니다.

git add는 git 영역의 스테이지 공간에 옮기는 의미입니다.

git폴더에서 first.txt를 만들면 아직 git에 등록은 안되었지만 git 영역에서 새로 만들었기에 빨간색으로 추가하라는 메시지를 보여줍니다. git add를 하면 commit 전 git stage(스테이지) 공간에 목록이 생성됩니다. commit 대상이라는 의미입니다. 

즉, 새로 만든 파일이나 수정된 파일을 git 버전관리에 등록하기 위해서는 대기자 명단에 올려야 하는데 바로 git add가 그 역할을 합니다.

 

 4. git에 파일 등록하는 commit.

이제 다음 명령어를 사용해서 파일을 git에 올리고 버전관리를 해보겠습니다.

git commit -m "first filegit commit"라는 명령어로 파일을 등록했습니다.

-m은 해당 커밋에 대한 메시지를 등록하는 것으로 필수항목입니다. 빈 값이라도 넣어야 한다는 의미입니다.

-m "메시지" 부분에는 해당 커밋을 왜 하는지 관련 내용을 상세히 기록하면 나중에 확인하기 편하답니다.

만약 git commit만 입력한다면 전혀 새로운 메시지 입력 화면을 만나게 될 것입니다. 그럴 땐 당황하지 마세요.

아래 간단한 사용법을 보여드립니다.

first.txt에 배라는 글자를 추가하고 저장합니다.

그리고 git status 명령어를 입력하면 위 이미지처럼 수정된 파일이 있다고 해당 파일이 빨간색으로 표시됩니다.

git add를 사용해서 스테이지에 등록합니다.

그리고 git commit만 치면 아래와 같은 화면이 나옵니다.

바로 -m을 사용해서 commit 메시지를 입력하지 않았기에 강제로 이 화면으로 이동해서 메시지를 입력하게 만듭니다.

사용법은 i 나 a를 누르면 입력모드로 변신합니다.

그리고 원하는 내용을 입력합니다. -m과는 다르게 줄 바꿈 해서 다양한 내용을 입력할 수 있다는 겁니다.

3줄로 내용을 입력했습니다. 이제 이 내용을 저장해야 합니다.

저장하는 방법 : 키보드 좌측 상단 esc버튼을 누릅니다. 그리고 키보드 우측 중간쯤의 콜론(:)을 누릅니다. 

w!를 입력하면 저장이 됩니다. q!를 입력하면 빠져나옵니다. wq!를 같이 입력하면 저장하면서 빠져나옵니다. 

하단에 입력한 명령어가 보입니다. wq!로 저장 후 종료하겠습니다.

commit 메시지를 포함해서 정상 처리가 되었습니다.

 

5. git log로 이력 조회하기.

git log를 사용해서 어떤 히스토리가 생겼는지 그간 작업 내역을 조회합니다.

제일 하단에 first filegit commit가 17시 19분 51초에 처리되었다는 기록이 보입니다.

그 위로는 2줄로 입력한 commit 메시지가 보입니다. 

잘 처리되었습니다.

근데 3줄 입력한 메시지가 왜 2줄이냐면 중간에 한 줄 지우고 commit 했거든요. ^^

새로운 파일을 생성해서 git add와 git commit을 사용해 등록하고 수정 파일도 git에 등록하는 방법을 살펴봤습니다.

이 외에도 git 관련 명령어가 많이 있습니다.

다음 포스팅에 설명해 보겠습니다.

감기 조심하세요~

 

반응형
반응형

안녕하세요. 신기한 연구소입니다.

DML(Data Manipulation language)의 범주에 속한다는 TCL(Transaction Control Language)에 대해 알아봅니다.

DML의 범주에 속하지 않는다는 의견도 있지만 그보다 TCL에 대해 잘 정리하는 게 중요한 듯합니다.

오라클 기반에서 설명하겠습니다.

기업에서 내부 이체를 하는 경우를 생각해봅니다.

A라는 계좌의 돈을 B 계좌로 이체하는 경우입니다.

A에서 출금한 뒤 B로 입금이 완료되었습니다.

기업의 자금 시스템에서 해당 이체에 대한 결과를 수신했는데..

A 계좌에서 출금된 기록을 입력한 뒤 시스템 장애나 또는 B 계좌에 입금 처리하는 프로그램 오류로 인해서 B 계좌의 입금내역을 처리하지 못하게 된다면 큰 문제가 발생할 수 있습니다.

A 계좌에서는 돈이 나갔다고 하는데 B 계좌에서는 입금내역이 없는 것이죠.

물론 기업 내 자금 시스템 문제라면 실물 금액은 잘 이체되고 통장에는 잘 정리가 되어 있기에 나중에 대사 하는 과정에서 잘 정리하고 오류를 수정 및 개선하면 됩니다.

그렇지만 은행 시스템이라면 정말 심각한 문제이지요.

그래서 이렇게 하나 이상의 프로세스가 서로 밀접하게 연결되어서 일괄 처리할 수 있도록 논리적 그룹 또는 집합을 구성하는데 이를 트랜잭션(Transaction)이라고 합니다.

위의 경우를 보면 A 계좌의 출금 내역 갱신과 B 계좌의 입금내역 갱신은 서로 밀접하게 연결된 프로세스로 하나만 잘 되면 안 되고 두 개의 프로세스가 같이 실행되거나 취소돼야 데이터의 일관성을 유지할 수 있기에 하나의 논리적 그룹으로 묶어서 처리해야 합니다.

트랜젝션은 데이터의 변화에 대한 처리를 지원하기에 Insert, Update, Delete가 대상이 됩니다.

트랜젝션(Transaction)은 commit, rollback, savepoint 세 가지로 구성됩니다.

세가지 구성에 대해 알아봅니다.

COMMIT;

먼저 위 예제를 확인했을 경우 

A 계좌에 출금 내역 입력, B계좌의 입금내역 입력으로 

두 개의 insert문이 일괄 실행됩니다.

commit문이 실행되기 전은 두 개의 insert문 실행으로 메모리에 임시로 데이터가 입력된 상태입니다.

모든 사용자가 볼 수 있는 실제 입력이 완료된 상황이 아니고 작업자만 확인할 수 있는 상태입니다.

또한 commit 전이기에 해당 행은 락이 걸린 상태라 다른 사용자가 접근해서 변경할 수 없는 상태입니다.

오류가 없거나 데이터 입력이 확신이 되면 commit;문을 실행해서 실제로 데이터베이스에 입력됩니다.

[예시]

UPDATE ACCOUNT

SET REMAIN = 50000

WHERE ACCOUNT_NO = '100-100-100000';

1건 수정완료...

COMMIT; 

커밋완료...

 

ROLLBACK;

두 개의 입력문을 실행했는데..

입력문을 보니 오류가 있습니다.

그래서 다시 작업을 해서 입력문을 실행해야 한다면 

현재 메모리에 임시 반영된 입력 데이터를 지우고 락을 제거해야 합니다.

그때 Rollback;을 사용합니다.

Rollback;를 실행하면 두 개의 insert을 실행하기 전 상태로 돌아갑니다.

단, commit;을 하고 rollback;을 하는 건 의미가 없습니다.

commit; 전에 사용할 수 있습니다.

commit; 전에 실행한 모든 insert, update, delete문에 대해 원복 한다는 점을 기억하세요.

[예시]

DELETE FROM ACCOUNT

WHERE ACCOUNT_NO = '100-100-100000';

1건 삭제완료...

ROLLBACK; 

롤백완료...

 

SAVEPOINT;

실전에서 사용한 적은 없습니다만..

한 번에 처리해야 할 프로세스가 많은 상황에서 중간 부분까지 취소를 하고 오류 수정 후 다시 실행할 필요가 있는 경우에 사용하면 편리하겠더군요.

어떤 경우가 있을지 생각해봤는데요.

하나의 테이블로 관리되던 재고 자료를 기본정보와 부가정보로 나눠서 입력하는 경우를 생각해봅니다.

데이터양이 많기에 한번 실행하면 

기본정보가 6시간 부가정보가 4시간 정도로 

총 10시간 정도 걸린다고 가정해봅니다.

일괄처리라 sql문을 쭉 실행했는데 부가정보 중간 부분에 오류가 발생합니다.

헉~

rollback 하고 다시 수정 후 진행하려면 엄청난 시간이 소요되겠지요.

그때 중간에 savepoint를 활용해서 rollback를 해당 savepoint까지만 진행하고 오류 수정 후 다시 진행할 수 있기에

효율적으로 업무를 진행할 수 있게 됩니다.

 

[예시]

--기본정보 입력

INSERT INTO EMP (EMP_ID, EMP_NM)

VALUES ("00001", "홍순이");

INSERT INTO EMP (EMP_ID, EMP_NM)

VALUES ("00002", "강돌이");

...

INSERT INTO EMP (EMP_ID, EMP_NM)

VALUES ("99985", "공이돌");  --99985건 입력

SAVEPOINT SV01;

--부가정보 입력

INSERT INTO EMP_SUB (EMP_ID, EMP_SEQ, BIRTH)

VALUES ("00001", 1, "20030202");

...

INSERT INTO EMP_SUB (EMP_ID, EMP_SEQ, BIRTH)

VALUES ("99985", 99985, "20100309"); --99985건 입력

 

COMMIT;를 하면 전체 입력 완료~

ROLLBACK;을 하면 전체 입력 초기화~

ROLLBACK TO SV01;을 하면 제일 마지막 INSERT문에서 위로 올라가 SAVEPOINT SV01; 바로 전까지 ROLLBACK를 실행합니다.

SAVEPOINT는 중간중간 필요한 부분에 추가해서 넣을 수 있으며 하단부터 위로 ROLLBACK TO SAVEPOINT를 진행하면서 데이터를 확인 및 처리할 수 있습니다.

 

잘못된 정보나 수정이 필요하면 댓글 주세요.

감사합니다.

반응형