Git Commit Message Convension
필요한 이유
- 사용하지 않은 경우 Commit Message가 누적될수록 가독성이 매우 떨어짐
- 협업 시에 유지, 보수성이 떨어짐
- 제목과 본문을 빈 행으로 구분
- 제목은 50글자 이내로 제한
- 제목의 첫 글자는 대문자로 작성
- 제목 끝에는 마침표를 넣지 않는다
- 제목은 명령문으로 사용하며 과거형을 사용하지 않는다
- 본문의 각 행은 72글자 내로 제한
- 어떻게 보다는 무엇과 왜를 설명
Commit Message 구조
제목/본문/꼬리말로 구성
type(옵션): [#issueNumber-]Subject // 제목
body(옵션) // 본문
footer(옵션) // 꼬리말
- type : 어떤 의도로 커밋했는지를 type에 명시 (ex. feat, fix, docs)
- Subject : 제목. 코드 변경사항에 대한 짧은 요약을 나타냄
- body : 긴 설명이 필요한 경우에만 본문 내용으로써 작성(무엇을 왜 했는지를 작성)
- 부연 설명이 필요하거나 커밋의 이유를 설명할 경우 작성
- footer : issue tracker ID를 명시하고 싶은 경우에 작성
1. 타입(Commit Type)
규칙
- 타입은 " 태그(tag) + 제목(subject) " 으로 구성되며, 태그는 영어로 쓰되, 첫 문자는 대문자 로 합니다.
- "태그: 제목" 의 형태이며, ":" 뒤에 space 가 있음에 유의합니다.
- ex. Feat: buy album api(Feat 가 태그이고, buy album api 가 제목)
자주 사용하는 태그 종류
- Feat : 새로운 기능을 추가하는 경우
- Fix : 버그를 고친 경우
- Docs : 문서를 수정한 경우
- Style : 코드 포맷 변경, 세미콜론 누락, 코드 수정이 없는 경우
- Refactor : 코드 리펙토링
- Test : 테스트 코드. 리펙토링 테스트 코드를 추가했을 때
- Chore : 빌드 업무 수정, 패키지 매니저 수정
- Design : CSS 등 사용자가 UI 디자인을 변경했을 때
- Rename : 파일명(or 폴더명) 을 수정한 경우
- Remove : 코드(파일) 의 삭제가 있을 때. "Clean", "Eliminate" 를 사용하기도 함
- !BREAKING CHANGE : 커다란 API 변경의 경우
- !HOTFIX : 급하게 치명적인 버그를 고쳐야하는 경우
기타 타입 태그들
- Add : 코드나 테스트, 예제, 문서등의 추가 생성이 있는경우- Improve : 향상이 있는 경우. 호환성, 검증 기능, 접근성 등이 될 수 있음
- Implement : 코드가 추가된 정도보다 더 주목할만한 구현체를 완성시켰을 때
- Move : 코드의 이동이 있는경우
- Update : 계정이나 버전 업데이트가 있을 때 사용. 주로 코드보다는 문서나, 리소스, 라이브러리등에 사용
- Comment : 필요한 주석 추가 및 변경
- Simplify : Refactor와 유사하지만 약한 수정, 코드 단순화
- Improve : 호환성, 테스트 커버리지, 성능, 검증 기능, 접근성 등의 향상
- Correct : 주로 문법의 오류나 타입의 변경, 이름 변경 등에 사용
제목(Subject)
코드의 짧은 변경 사항에 대해 짧은 요약을 나타냄규칙
- 영어로 제목을 작성하는 경우
- 제목은 50자를 넘기지 않고, 대문자로 작성하며 마침표를 붙이지 않는다
- 제목은 과거형을 사용하지 않고, 명령조로 시작
- 제목을 Fixed 가 아닌, Fix로 작성(Fix: "Modify album buy bug")
- 한글로 제목을 작성하는 경우
- "고침", "추가", "변경" 등의 명령조로 시작
- Feat: "추가 get data api 함수"
- "고침", "추가", "변경" 등의 명령조로 시작
2. 본문(Body)
규칙
- 선택사항입니다. (본문은 꼭 작성 안해도 됨)
- 부연설명이 필요하거나 커밋의 이유를 설명할 경우 작성해주면 됩니다.
- 본문 내용은 어떻게 변경했는지 보다, 무엇을 변경했는지 또는 왜 변경했는지 를 설명하도록 합시다.
- 제목과 구분되기 위해 공백 한 줄을 띄워서 작성해줍시다.
3. 꼬리말(footer)
규칙
- 선택사항 (꼭 작성할 필요x)
- issue tracker id 를 작성할 때 사용합니다.
- 형식 : 꼬리말은 "유형: #이슈 번호" 형식으로 사용합니다.
issue traker 유형
- Fixes : 이슈 수정중 (아직 해결되지 않은 경우)
- Resolves : 이슈를 해결했을 때 사용
- Ref : 참고할 이슈가 있을 때 사용
- Related to : 해당 커밋에 관련된 이슈번호 (아직 해결되지 않은 경우)
예시 - 로그인 API 개발 내용 커밋
Feat: "Add login API" // 타입: 제목
로그인 API 개발 // 본문
Resolves: #123 // 꼬리말 -> 이슈 123d을 해결했으며,
Ref: #456 이슈 456을 참고해야 하며,
Related to: #48, #45 현재 커밋에서 아직 이슈 48과 45가 해결되지 않았다.
Git Commit Emoji / https://gitmoji.dev/
gitignore
- 프로젝트 작업 시 로컬 환경의 정보나 빌드 정보 등 원격 저장소에 관리하지 말아야되는 파일들에 대해서 지정하여 원격 저장소에 실수로 올라가지 않도록 관리하는 파일
- 정의한 정보들에 해당하는 파일들에 대하여 git track하지 않도록 설정하는 역할
샘플 gitignore https://github.com/github/gitignore
사용하는 이유
- 프로젝트 생성 후 생성한 git repository에 push할 경우 관리하지 않아도 될 idea 관련 파일 및 gradle 관련 파일들이 함께 push 됨
- 프로젝트에서 관리가 필요하지 않은 파일에 대해서 git에서 추적하지 않게 제외시키기 위해 gitignore 파일을 이용
.gitignore 파일 생성
- .gitignore 파일은 프로젝트 최상위 위치에 존재해야 함
- git이 untracked할 파일 또는 디렉토리등을 정의
패턴
- '#'로 시작하는 라인은 무시
- 표준 Glob 패턴을 사용
- 슬래시(/)로 시작하면 하위 디렉토리에 적용되지(recursivity) 않는다
- 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현
- 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다
파일 하나만 무시
fileName.txt
특정 디렉토리의 특정 파일을 무시
fileDirectory/fileName.txt
특정 디렉토리의 모든 파일을 무시하고 싶을 때
fileDirectory/
특정 확장자를 가진 모든 파일을 무시하고 싶을 때
*.txt
현재 경로에 있는 fileName 무시
/fileName.txt
특정 경로 안에 있는 모든 fileName 무시
fileDirectory/**/fileName.txt
예외인 경우
!fileName.txt
.gitignore 파일 적용
- 작성한 .gitignore을 commit하여 원격 저장소에 push
- push후 gitignore적용이 되지 않을경우 아래의 명령어를 통해 원격 저장소 파일을 제거후 다시 push
git rm -r --cached .
git add .
git commit -m "커밋메세지"
git push origin {브랜치명}
- 적용 시 기존에 있던 불필요 파일 또는 디렉토리는 제거 됨
- 이후 추가되지 않아야되는 정보는 추가하여 실수로 잘못된 파일이 원격 저장소에 올라가는 것을 방지할 수 있음
간단하게 .gitignore 파일 생성
https://www.gitignore.io/ 를 이용하여 원하는 ignore 파일을 생성가능
- gitignore에 추가될 정보를 추가하여 생성을 클릭하면 자동으로 ignore 파일 생성 가능
Spring Boot 설정파일 암호화
필요성
- 실제 배포의 경우 외부 DB에 접근하기 때문에 id, pw, 서버주소까지 노출되면 위험하기 때문
암호화 방법
- Jasypt
- Jasypt(Java Simplified Encryption) : 자신의 프로젝트(Java Application)에서 설정 파일의 속성 값들을 암호화, 복호화할 수 있는 라이브러리
- 참고 http://www.jasypt.org/
-
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
사용 방법
- Dependency 추가(의존성 추가)
- gradle
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
- maven
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
- Encryptor Configuration
- 암호화 알고리즘
- 비공개 키, 인코딩, 타입, 솔트(salt) 값 생성기 등을 설정가능
https://github.com/ulisesbocchio/jasypt-spring-boot
config 예시
@Configuration
@EnableEncryptableProperties
public class JasyptConfigAES {
@Bean("jasyptEncryptorAES")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("gdh-password"); // 암호화키
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); // 알고리즘
config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
config.setPoolSize("1"); // 인스턴스 pool
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64"); //인코딩 방식
encryptor.setConfig(config);
return encryptor;
}
}
- PooledPBEStringEncryptor : 기본 jasypt의 String 암호화 객체
- SimpleStringPBEConfig :jasypt의 String config 객체
- config.setPassword : 정확히는 암호화 key이다. 진짜 암호가 아님
- PBEWITHHMACSHA512ANDAES_256 : 암호화 알고리즘
테스트
class JasyptConfigAESTest {
@Test
void stringEncryptor() {
String url = "db_url";
String username = "db_username";
String password = "db_password";
System.out.println(jasyptEncoding(url));
System.out.println(jasyptEncoding(username));
System.out.println(jasyptEncoding(password));
}
public String jasyptEncoding(String value) {
String key = "my_jasypt_key";
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
pbeEnc.setPassword(key);
pbeEnc.setIvGenerator(new RandomIvGenerator());
return pbeEnc.encrypt(value);
}
}
- 테스트 실시 후 결과물을 확인하여 설정 파일에 적용
적용하기 ( application.properties → application.yml)
jasypt:
encryptor:
bean: jasyptEncryptorAES
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: ENC(암호화된 url)
username: ENC(암호화된 username)
password: ENC(암호화된 password)
- 프로젝트 실행 시 정상적으로 db 접속되는지 확인
참고 https://goddaehee.tistory.com/321
'항해 99' 카테고리의 다른 글
WIL-7 (0) | 2024.03.24 |
---|---|
WIL-6 (0) | 2024.03.17 |
WIL-5 (0) | 2024.03.10 |
Postman API 테스트, Intellij Git Conflict 해결 (1) | 2024.02.28 |
항해 99 WIL - 0주차 (0) | 2024.02.04 |