티스토리 뷰
배경
팀 프로젝트를 하면서 비지니스 로직 이외에 code formatting 과 같이 다른 부분에서 리뷰를 남기거나 신경을 써야하는 것이 또 다른 낭비라고 생각했다. 모두가 좀 더 깔끔한 코드 형태를 보면서 비지니스 로직에 집중했으면 하는 마음에서 린트 설정을 알아보게 되었다. 실제로 근로에서는 kotlin을 사용하는데, ktlint를 사용하여 코드 컨벤션이 맞지 않으면 커밋 자체가 되지 않도록 설정되어 있다.
- 비지니스 로직에 집중
- 깔끔한 코드 스타일을 유지
- intelliJ 자동정렬에서 개행이라던지, 메소드 간 2줄이 띄워지는 형식들은 잡아주지 못함
정적 분석도구 찾기
ktlint와 같은 것들을 찾다보니, sonarlint, checkstyle 등이 나왔다. 확실히 모르지만 sonarlint는 개인이 설정파일에서 설정해주어야 하는 것 같아 보였다. 팀 간에 형식을 협의하고 같은 파일 내용으로 사용하면 되는 듯 해 보였다. 해당 내용이 누락되었을때, 강제하거나 자동화하여 알려줄 수 있는 방식은 아니라고 느껴졌다. checkstyle이 내가 원하던 분석도구에 다 가깝다고 생각하여 checkstyle을 도입하게 되었다. 또한, checkstyle은 java file에 한해서만 동작한다.
- checkstyle 선택
- 강제성, 자동화
- java
설정하기
gradle 설정
plugins {
id 'checkstyle'
}
checkstyle {
maxWarnings = 0 // 규칙이 어긋나는 코드가 하나라도 있을 경우 빌드 fail
configFile = file("${rootDir}/config/gpu-im-checkstyle.xml") // 설정 파일 경로 지정
toolVersion = "8.39" // 처음에 낮은 버전을 사용했더니 깨지는 현상이 있었다. 설정파일의 내용에 맞는 버전을 선택
}
파일 설정
- config 디렉토리에 xml 파일을 추가
- 우아한테크코스 컨벤션은 구글 가이드였기 때문에 구글 스타일 가이드를 거의 유지했다. (indent는 4로 변경)
체크스타일 구글 컨벤션 적용
- 체크스타일에서 구글 컨벤션 체크스타일을 제공한다.
- 체크스타일 google-check.xml
- 메소드명, 클래스명, import 순서 등등 더 많은 내용을 컨벤션으로 지정되어 있었다.
- checkstyle의 파일을 그대로 유지하면 테스트 상의 한글 메소드명, 라인길이, import 순서 등등에서 컨벤션이 깨지는 부분들이 많았다.
- 이런 부분까지 강제해야할 필요성을 느끼지 못해 (서로 충분히 잘 하고 있다고 판단) 현 코드에 맞게 불필요한 부분들은 제거했다.
- 파일 끝의 개행, 2줄이상 공백라인 금지 등 몇가지 추가사항을 넣어주었다.
설정 변경 내용
- 파일 마지막 개행(lf, eof)
- 1줄 이상 띄우는 multi empty 라인 제거
- 한 라인의 최대길이 120 (line-max-length: 120)
- import, javadocs, method name 과 관련된 내용은 삭제함(테스트 코드를 한글로 만들기 때문에 해당 내용이 들어가면 깨지는 내용이 다수)
- indent: 4
인텔리제이에 구글 컨벤션 적용
- intelliJ에서 코드 포맷팅 자체를 해주진 않기 때문에 구글 자바 스타일가이드 xml 공통 설정 파일로 설정예정이다.
- 구글 자바 스타일 가이드 xml
- 해당 파일에서 일부 인덴트 등을 변경하였다.
- xml 파일 다운로드하여 원하는 위치에 저장
- (깃허브 파일을 raw 보기로 해서 저장하거나, 내용을 복붙하여 xml 파일 형식으로 저장하면 된다.)
- preferences>codestyle>java 에서 default 대신 해당 xml 파일로 설정
실행하기
cli 로 실행
- 컨벤션에 맞는다면 BUILD SUCCESSFUL 확인가능
cd back-end // gragle 을 실행할 수 있는 디렉토리로 들어가서 ./gradlew -q checkstyleMain // main 에 대한 컨벤션 체크 ./gradlew -q checkstyleTest // test 에 대한 컨벤션 체크
gradle 사이드바에서 실행
- 인텔리제이 오른쪽 사이드바에서 실행가능하다.
- 실행하면 테스트까지 진행이 된다.
- 실패하면 html 파일로 리포트가 제공이 되어 확인이 가능하다.
- 어떤 클래스의 몇 번째 줄에서 어떤 내용으로 컨벤션이 지켜지지 않았는지 확인이 가능하다.
자동화
- pre-commit의 git hooks으로 적용하려고 했으나 스크립트 작성에 어려움이 있었다. 또한, 너무 빡빡한 강제는 서로간의 스트레스가 될 수도 있을 것 같았다.
- github action 으로 PR시 지켜지지 않으면 merge 되지 않도록 설정할 수 있을 듯 하다.
정리
- 코드 컨벤션 결과를 자동화 해서 확인이 가능했고, 강제할 수 있는 툴을 사용하여 팀 컨벤션을 유지하는데 도움이 될 듯 하다.
'우아한테크코스 > 레벨3' 카테고리의 다른 글
서브모듈 적용하기 (0) | 2021.08.12 |
---|---|
팀 프로젝트가 나에게 남긴 것 (0) | 2021.08.05 |
JobQueue 처리 기술 도입기 (4) | 2021.07.14 |
Jpa OneToMany 단방향 연관관계 (0) | 2021.07.09 |
JPA 기초: 연관관계매핑 (0) | 2021.07.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코드스쿼드
- 우아한테크코스
- 우테코수업
- CS
- 인증
- 마스터즈코스
- TCP/IP
- javascript
- JS
- React
- java
- DB
- TIL
- 글쓰기미션
- 회고
- 알고리즘
- Transaction
- 월간회고
- 객체지향
- 모의면접준비
- OS
- JPA
- 내부코드
- 카카오
- python
- 개발공부일지
- Spring
- 학습로그
- 네트워크
- 운영체제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함