반응형

 

Intellij에서 프로젝트를 열면, 항상 궁금했던 것이 하나 있는데, 도대체 이 TODO 기능은 도대체 어떻게 쓰는가? 에 대한 것이었다. 도대체 어떤식으로 작동하는 건데..라며 생각했던적이 있었다.

 

얼마전에 //TODO 주석이 포함된 복사하다가 오잉? 하이라이트가 되는 것을 보고, TODO기능의 쓰임에 대해서 찾아보았다. 

 

TODO는 어떻게 쓰는가?

의외로 간단했다. 주석달고 //TODO나 //FIXME를 통해서 색반전이 되면서 더 가독성이 높아진다. 그리고 또한 멀티라인을 사용하고 싶은경우 -를 앞에 붙혀주면 멀티라인도 가능하다.

그리고 TODO 탭에서 그 코드가 TODO와 FIXME가 몇번째 줄인지도 알려준다.

 

TODO도 커스텀하게 사용가능함!

FIXME는 빨간색으로 강조를 하면 더 좋을텐데... 기본설정은 저 약간 누리끼리한색으로 고정이다. 그래서 설정을 변경하려면, 다음처럼 Settings나 Preferences를 통해서 TODO에서 설정을 변경할 수 있다. 

특정 패턴도 수정할 수 있고, Use Color scheme TODO default colors를 체크아웃하면 나만의 특정 색으로 변경도 가능하다.  다음처럼 빨간색을 변경시키면, 

 

이렇게 색이 변경된다.

 

이런식으로 내가 수정할 혹은 추가해야할 코드의 위치를 TODO를 통해서 빠르게 확인하는 방법을 알아보았다.

 

출처:www.jetbrains.com/help/idea/using-todo.html



출처: https://sundries-in-myidea.tistory.com/116 [얇고 넓은 개발 블로그]

반응형
반응형

SQL의 종류 DDL, DML, DCL 이란?


 

 

 

SQL(Structured Query Language) - 구조적 질의 언어 이란? 해당 질의 언어를 통해 데이터베이스를 제어하고 관리할 수 있습니다

 

 

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

 

 

DDL(Data Definition Language)  - 데이터 정의어 란? 데이터베이스를 정의하는 언어이며, 데이터리를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 하는 언어 입니다.

 

 

종류 역할
 CREATE  데이터베이스, 테이블등을 생성하는 역할을 합니다.
 ALTER  테이블을 수정하는 역할을 합니다.
 DROP  데이터베이스, 테이블을 삭제하는 역할을 합니다.
 TRUNCATE  테이블을 초기화 시키는 역할을 합니다.

 

 

* SCHEMA, DOMAIN, TABLE, VIEW, INDEX를 정의하거나 변경 또는 삭제할 때 사용하는 언어입니다.

 

* 데이터 베이스 관리자나 데이터베이스 설계자가 사용 합니다.

 

 

 

 

 

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

 

 

DML(Data Manipulation Language) - 데이터 조작어란? 정의된 데이터베이스에 입력된 레코드를 조회하거나 수정하거나 삭제하는 등의 역할을 하는 언어를 말합니다.

 

 

 

종류 역할
 SELECT  데이터를 조회하는 역할을 합니다.
 INSERT  데이터를 삽입하는 역할을 합니다.
 UPDATE  데이터를 수정하는 역할을 합니다.
 DELETE  데이터를 삭제하는 역할을 합니다.

 

 

 

* 데이터베이스 사용자가 응용 프로그램이나 질의어를 통하여 저장된 데이터를 실질적으로 처리하는데 사용하는 언어 입니다.

 

* 데이터베이스 사용자와 데이터베이스 관리 시스템 간의 인터페이스를 제공합니다.

 

 

 

 

 

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

 

 

DCL(Data Control Language) - 데이터베이스에 접근하거나 객체에 권한을 주는등의 역할을 하는 언어를 입니다.

 

 

 

종류 역할
 GRANT  특정 데이터베이스 사용자에게 특정 작업에 대한 수행권한 부여 합니다.
 REVOKE  특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한을 박탈, 회수 합니다.
 COMMIT
 트랜잭션의 작업을 취소 및 원래래 복구하는 역할을 합니다.
 ROLLBACK
 트랜잭션의 작업을 취소 및 원래대로 복구하는 역할을 합니다.

 

 

 

종류 역할
 GRANT  특정 데이터베이스 사용자에게 특정 작업에 대한 수행권한 부여 합니다.
 REVOKE  특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한을 박탈, 회수 합니다.

 

 

 

* 데이터를 제어하는 언어 입니다.

 

* 데이터의 보안, 무결성, 회복, 병행 수행제어 등을 정의하는데 사용합니다.

 

 

출처: https://server-talk.tistory.com/159

반응형

'DB > SQL' 카테고리의 다른 글

sql Join & Where개요  (0) 2020.05.06
Foreign Key 제약 설정 Delete Rule  (0) 2020.04.21
WHERE 절의 조합(AND / OR / NOT / IN)  (0) 2020.04.21
[SQL] join의 on절과 where절 차이  (0) 2020.04.10
반응형

 


git에서 두 개의 브랜치를 병합할 때 사용하는 두 가지 방법이 있습니다.

1. git merge
2. git rebase


 


1. git merge


//1. master 브랜치로 이동
$git checkout master
//2. 병합할 브랜치를 master브랜치에 merge
$git merge [master에 병합할 브랜치 명]

//위 1,2를 한번에 표현 가능
$git merge [master에 병합할 브랜치 명] master
  • 병합을 하면 합쳐진 브랜치의 커밋 메시지가 중복으로 쌓이게 됩니다.
  • 커밋 순서를 바꾸지 않습니다.
  • 존재하는 브랜치가 변경되지 않습니다.
  • 새로운 merge commit을 생성합니다.
  • git merge --abort : 병합을 취소하는 명령어

 

 

  • 위 이미지는 Main 브랜치에 Feature 브랜치를 병합하는 과정을 나타냅니다.
  • 커밋 순서가 변경되지 않고, 기존 분기는 유지되는 모습을 확인할 수 있습니다.

 

 


1-2. git conflict

충돌 상황 발생


 

//merge 실행
$git merge [master에 병합할 브랜치 명]

//conflict 발생
CONFLICT (content): Merge conflict in [수정한 파일]
Automatic merge failed; fix conflicts and then commit the results.
  • 자동 merge가 실패했으니, 충돌 부분을 수정하고 결과를 다시 커밋 하라는 경고문이 노출됩니다.
  • 충돌이 발생한 이유는 두 브랜치에서 [수정한 파일]의 내용이 서로 다르기 때문입니다.
  • 이와 같이 같은 부분에 서로 다른 부분이 있을 경우, merge conflict가 발생할 수 있습니다.
  • 이를 해결하기 위해 충돌이 발생한 부분을 수정이 필요합니다.

 

//[수정한 파일] 내용 출력
//사용하는 툴이 있다면 툴을 사용하여 conflict가 발생한 부분 수정하여도 됨
//ex : intelliJ, eclipse, vscode 등

$ cat [수정한 파일]
1. 안녕하세요.
2. git merge 중
3. conflict 상황 입니다.
<<<<<<< HEAD
4. 오전에 작성하였습니다.
=======
4. 오후에 작성하였습니다.
>>>>>>>> [병합할 브랜치 명]
  • 위처럼 충돌이 일어난 부분은 <<<<<<<<  ======= 혹은, =======  <<<<<<<< 사이에 표시됩니다.
  • <<<<<<<< 과 ======= 사이에 표시된 내용은 merge를 실행한 브랜치에 있는 내용을 나타냅니다.(HEAD가 가리키고 있는 내용)
  • 반대로 ======= 과 <<<<<<<< 사이에 표시된 내용은 merge 하고자 하는 브랜치(즉, 병합할 브랜치 명)의 내용을 나타냅니다.
  • 이 표시들을 기반으로 원하는 것을 선택하여 수정을 마친 후 충돌이 일어난 파일을 커밋 해주면 merge가 완성됩니다.(위에 표시된 기호들을 없앤 후 커밋)

 

$ cat [수정한 파일]
1. 안녕하세요.
2. git merge 중
3. conflict 상황 입니다.
4. 오후에 작성하였습니다.

- 위와 같이 수정 완료 후

 

$git add [수정한 파일]
$git commit
[master 7bj1583] Merge branch '[병합할 브랜치 명]'

- 성공적으로 수정하였을 경우의 출력 메시지입니다.

 

$git branch -d [병합 완료 된 브랜치 명]

- 병합이 끝난 브랜치를 삭제 처리합니다.

 

 

 


2. git rebase


 

  • Feature 브랜치를 Main 브랜치에 병합을 나타내는 이미지 입니다.
  • 위 그림처럼 Feature 브랜치의 커밋은 Main 브랜치가 가지고 있던 기존의 커밋 뒤에 위치하게 됩니다.

 

//master에 rebase 할 브랜치로 이동
$git checkout [rebase 할 브랜치]
$git rebase master

//rebase 할 브랜치를 master 브랜치에 merge
$git checkout master
$git merge [rebase한 브랜치]
  • 병합을 하면 브랜치의 커밋 메시지가 시간 순서대로 합쳐집니다.
  • 히스토리를 깔끔하게 유지하기 위해 사용합니다.
  • 전체 브랜치를 마스터 브랜치 끝에 위치 시킵니다, 그렇기 때문에 master 브랜치의 기존의 마지막 커밋 뒤에 병합할 브랜치의 커밋들이 합쳐지게 하여 master 브랜치에 재배치(rebase) 하는 것을 말합니다.

 

rebase 하기 전

 

rebase 된 후

 

  • 즉, 위 그림처럼 master 브랜치의 m2 상태에서 다른 브랜치의 f1, f2 커밋을 재배치(rebase) 하면, 두 번째 사진과 같이 m2 이후에 f1, f2 이 재배치됩니다.

 

 


2-1. rebase 진행 과정


 

//feature 브랜치로 체크아웃한 상태
$git checkout feature

 

feature 브랜치로 체크아웃한 상태, head는 feature를 가리키고 있음

 

 

$git rebase master

 

master와 feature의 공통 조상이 되는 base 커밋부터 현재 브랜치까지의 변경 사항(▵1, ▵2)을 구해서 patch로 저장해 둠

 

 

head를 master로 변경

 

 

Applying f1 : head가 현재 가리키고 있는 m2에 변경사항 ▵1 을 적용하여 새로운 커밋 f1'을 생성

 

Applying f2 : f1'에 변경사항 ▵2 을 적용하여 새로운 커밋 f2'을 생성

 

feature가 f2'를 가리키도록 함

 

 

$git merge feature

 

feature를 master로 fast-forward merge 하여 완료

 

 


2-2. rebase 사용법


 

//수정할 커밋들의 리스트 출력
//git rebase -i [수정을 시작할 커밋의 이전 커밋] 형식으로 입력
$git rebase -i HEAD~4

//4개의 커밋 리스트 노출
hint: Waiting for your editor to close the file...
pick 907c451 commit1
pick 1a7c765 commit2
pick v07c952 commit3
pick 40jc438 commit4

//사용할수있는 명령어 리스트
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.

 

pick

-커밋을 사용하겠다는 의미, 이를 이용해 커밋의 순서를 바꿀 수 있고, 커밋의 해시값을 이용해 특정 커밋을 가져올 수 있습니다.

- rebase 명령어를 실행하면 기본적으로 pick으로 설정돼있기 때문에 아무것도 변경하지 않고 종료한다면, 커밋에 대하여 어떠한 변경도 일어나지 않게 됩니다.

- 위 코드에서 commit2와 commit3의 순서를 바꾼다면, 커밋 순서와 커밋 해시값까지 변경됩니다.

reword

- 커밋 메시지를 변경하는 명령어

- 커밋 메시지를 변경할 커밋 앞에 reword 명령으로 수정하고, 저장하면 해당 커밋의 메시지를 다시 작성하는 에디터 창이 열리게 됩니다.

- 커밋 메시지와 커밋의 해시값 또한 변경됩니다.

edit

- reword 명령어는 커밋 메시지만 변경하는 명령이라면, edit 명령어는 커밋 메시지뿐만 아니라 커밋의 작업 내용까지 변경할 수 있습니다.

- commit4라는 커밋을 edit으로 바꾸고 저장 후 종료하면, 변경할 커밋으로 checkout됨, 그 상태에서 변경 작업을 수행하면 됩니다.

- 그 후 변경사항을 저장하기 위해 아래와 같은 명령어 입력

//staged 상태 변경
$git add . 

//변경할 커밋메시지 입력
$git commit --amend -m "commit4-amend"

//rebase처리
$git rebase --continue

- 커밋 내용과 메시지 모두 변경됩니다.

 

squash

- squash 명령어는 해당 커밋을 이전 커밋과 합치는 명령어입니다.

pick 907c451 commit1
pick 1a7c765 commit2
squash v07c952 commit3
pick 40jc438 commit4

- commit3 커밋을 직전 커밋인 commit2 커밋과 합치기 위해 squash로 변경합니다.

- 저장 후 종료하면 커밋 메시지를 수정할 수 있는 에디터 창이 뜹니다.

- 합쳐질 커밋들의 메시지를 확인한 후 그대로 종료하면 아래와 같이 이전 커밋과 하나로 합쳐진 것을 볼 수 있습니다.

pick 907c451 commit1
pick 73dc735 commit2
pick 40jc438 commit4

 

 

fixup

- fixup 명령어는 squash와 동일하게 해당 커밋을 이전 커밋과 합치는 명령어이지만, 커밋 메시지는 합쳐지지 않습니다.

- 결과적으로 이전 커밋의 커밋 메시지만 남게 됩니다.

exec

- exec 명령어를 이용하면, 각각의 커밋이 적용된 후 실행할 shell 명령어를 지정할 수 있습니다.

- 각각의 커밋이 실행된다는 것을 확인하기 위해 중간중간에 메시지를 넣는 행위입니다.

drop

- drop 명령어는 커밋 히스토리에서 커밋을 삭제합니다.

- drop으로 변경 후 저장하면, 해당 커밋이 drop 되는 것을 확인 가능합니다.

pick 907c451 commit1
drop 73dc735 commit2
pick 40jc438 commit4

 

 


2-3. rebase 시 유의사항


- 이전의 커밋 히스토리를 변경하기 때문에 항상 주의가 필요합니다.

- 만약 이미 Github과 같은 원격 저장소에 push까지 한 커밋이라면, 변경한 커밋들은 원격 저장소에 push 되지 않을 것입니다.

- 이때 $git push --force, $git push -f 명령으로 강제로 원격 저장소에 커밋 히스토리를 덮어쓸 수 있습니다.

- 만약 이전에 push 한 커밋들을 다른 개발자들과 공유하고 있었다면, 커밋 히스토리의 불일치가 발생해 git이 꼬이는 현상이 발생할 수 있습니다.

 

 

출처: https://hajoung56.tistory.com/5

반응형
반응형

들어가기 전에

최근에 git clone 후 npm install을 했을 때 package-lock.json가 변경되는 문제를 겪었고 npm ci 명령어를 통해 해결하게 되었던 일이 있었다.

이 문제를 통해 package-lock.json이 존재한다고 하더라고 npm 버전에 따라 npm install이 다르게 구동되어 package-lock.json을 기존과 다른 내용으로 덮어쓸 수 있게 된다는 것을 알게 되었다.

그럼 npm ci는 무엇이기에 이런 문제를 해결해 준 걸까?
그리고 모듈을 설치할 때 무조건 npm ci를 사용하면 되는 걸까?

위의 궁금증 해결을 위해 npm install과 npm ci가 무엇이고, 둘의 차이는 어떤 것인지 그리고 언제 사용하면 좋을지에 대해 정리를 해봤다.

npm install

소개

먼저 npm install은 패키지와 패키지가 의존하는 모듈을 설치하는 명령어이며, npm i 혹은 npm add로 쓰기도 한다.

사용 방법

npm install는 다음과 같이 명령어를 이용할 수 있다.

  • 개별적으로 패키지를 설치할 때위와 같은 방법으로 사용하면 package.json과 package-lock.json이 없는 경우에는 이 2개의 파일이 생성되고, package.json과 package-lock.json이 존재한다면 dependencies에 패키지가 추가된다.
  • npm install 패키지_이름
  • pacakge.json의 dependencies에 나열되어 있는 패키지를 설치할 때이때 package.json의 요구 사항(dependencies)을 만족해야 package-lock.json을 적용된다. 만약 요구 사항을 만족하지 않는다면 pacakge를 업데이트하고 package-lock.json 파일의 내용이 변경된다.
  • npm install

이 외에도 npm install 사용 방법은 다양하다. 이 글에서는 npm install과 npm ci 차이 설명이 주목적이기 때문에 가볍게 정리하고 넘어가지만 더 자세히 알고 싶다면 여기(npm-install 공식 문서)를 참고하면 된다.

npm ci

소개

npm ci는 npm install 과 유사하지만, npm install과 달리 같은 개발 환경을 구축해 줄 수 있기 때문에 테스트 플랫폼, 지속적인 통합 및 배포(CI와 CD)와 같은 자동화된 환경이나 dependencies를 새로 설치해야 하는 모든 상황에서 사용할 수 있는 명령어이다.

참고로 5.7.0 버전부터 지원한 명령어이며, npm 공식 블로그에 따르면, 이름에서 알 수 있듯이 CI(Continuous Integration) 환경에 큰 이점이 될 것이라고 생각하고 있다.​

사용 방법

사용 방법은 단순히 npm ci 명령어를 입력만 해주면 된다.

npm ci

주의 사항

  1. npm ci는 pacakge-lock.json 기반으로 설치가 진행되기 때문에 package-lock.json이나 npm-shrinkwrap.json 파일이 꼭 존재해야 한다.
    만약 package-lock.json이 없다면 아래와 같은 결과를 출력하고 패키지 설치가 진행되지 않는다.
  2. added 1 packages in 4.892s
  3. npm ci는 아래와 같이 사용할 수 없다.npm ci는 한 번에 전체 프로젝트만 설치할 수 있기 때문에 개별적으로 패키지를 설치하는 것이 불가능하다.
  4. npm ci 패키지_이름
  5. 이미 node_modules 폴더가 존재하는 경우에 npm ci를 실행시키면 기존 node_modules 폴더를 삭제하고 다시 설치한다.
  6. package-lock.json의 dependencies가 package.json의 dependecies와 일치하지 않는다면, npm ci는 package-lock.json을 업데이트 하는 대신에 오류와 함께 종료한다.

npm install 과 npm ci의 속도 비교

  • npm install로 설치했을 때
    added 1032 packages from 651 contributors and audited 1039 packages in 236.795s
    
  • npm ci로 설치했을 때
    added 1033 packages in 135.108s
    

npm install을 사용해서 1032개의 패키지를 설치했을 때 236.795초가 걸렸고, npm ci를 사용해서 1033개의 패키지를 설치했을 때 135.108초가 걸렸다.

위의 결과를 통해 npm ci가 npm install 보다 더 빠르다는 것을 알 수 있다.

npm ci가 npm install 보다 빠른 이유는 지정된 버전의 패키지만 설치하면 돼서 최신 호환 버전을 확인하는 과정이 필요 없기 때문이다.

참고로, npm ci는 다음과 같은 경우에 훨씬 더 빠를 것이다.

  • package-lock.json 혹은 npm-shrinkwrap.json 파일이 있을 때
  • node_modules 폴더가 없거나 비었을 때

참고 - npm-shrinkwrap.json 이란? dependencies에 설치된 패키지의 버전을 고정시키는 명령어인 npm shrinkwrap를 실행시켰을 때 생성되는 파일로서, 패키지가 의존하고 있는 모듈의 버전과 정보를 갖고 있다.

반응형

+ Recent posts