본문 바로가기

항해 99

Git Commit Convension, gitignore, application.properties 암호화

Git Commit Message Convension

필요한 이유

  • 사용하지 않은 경우 Commit Message가 누적될수록 가독성이 매우 떨어짐
  • 협업 시에 유지, 보수성이 떨어짐
  1. 제목과 본문을 빈 행으로 구분
  2. 제목은 50글자 이내로 제한
  3. 제목의 첫 글자는 대문자로 작성
  4. 제목 끝에는 마침표를 넣지 않는다
  5. 제목은 명령문으로 사용하며 과거형을 사용하지 않는다
  6. 본문의 각 행은 72글자 내로 제한
  7. 어떻게 보다는 무엇과 왜를 설명

Commit Message 구조

제목/본문/꼬리말로 구성

type(옵션): [#issueNumber-]Subject // 제목
body(옵션)                         // 본문
footer(옵션)                       // 꼬리말
  • type : 어떤 의도로 커밋했는지를 type에 명시 (ex. feat, fix, docs)
  • Subject : 제목. 코드 변경사항에 대한 짧은 요약을 나타냄
  • body : 긴 설명이 필요한 경우에만 본문 내용으로써 작성(무엇을 왜 했는지를 작성)
    • 부연 설명이 필요하거나 커밋의 이유를 설명할 경우 작성
  • footer : issue tracker ID를 명시하고 싶은 경우에 작성

1. 타입(Commit Type)

규칙

  1. 타입은 " 태그(tag) + 제목(subject) " 으로 구성되며, 태그는 영어로 쓰되, 첫 문자는 대문자 로 합니다.
  2. "태그: 제목" 의 형태이며, ":" 뒤에 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)

규칙

  1. 선택사항입니다. (본문은 꼭 작성 안해도 됨)
  2. 부연설명이 필요하거나 커밋의 이유를 설명할 경우 작성해주면 됩니다.
  3. 본문 내용은 어떻게 변경했는지 보다, 무엇을 변경했는지 또는 왜 변경했는지 를 설명하도록 합시다.
  4. 제목과 구분되기 위해 공백 한 줄을 띄워서 작성해줍시다.

 

3. 꼬리말(footer)

규칙

  1. 선택사항 (꼭 작성할 필요x)
  2. issue tracker id 를 작성할 때 사용합니다.
  3. 형식 : 꼬리말은 "유형: #이슈 번호" 형식으로 사용합니다.

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/

 

gitmoji

:truck: Move or rename resources (e.g.: files, paths, routes).

gitmoji.dev

 

 

 

gitignore

  • 프로젝트 작업 시 로컬 환경의 정보나 빌드 정보 등 원격 저장소에 관리하지 말아야되는 파일들에 대해서 지정하여 원격 저장소에 실수로 올라가지 않도록 관리하는 파일
  • 정의한 정보들에 해당하는 파일들에 대하여 git track하지 않도록 설정하는 역할

샘플 gitignore https://github.com/github/gitignore

 

GitHub - github/gitignore: A collection of useful .gitignore templates

A collection of useful .gitignore templates. Contribute to github/gitignore development by creating an account on GitHub.

github.com

 

사용하는 이유

  • 프로젝트 생성 후 생성한 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, 서버주소까지 노출되면 위험하기 때문

암호화 방법

  1. Jasypt
    • Jasypt(Java Simplified Encryption) : 자신의 프로젝트(Java Application)에서 설정 파일의 속성 값들을 암호화, 복호화할 수 있는 라이브러리
    • 참고 http://www.jasypt.org/
 

Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main

Jasypt 1.9.3 RELEASED! (May 25th, 2019) [DOWNLOAD and ChangeLogs] [WHAT'S NEW IN JASYPT 1.9] Java Simplified Encryption Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and wi

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