일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 생명주기
- struct
- 주간 달력
- AnyObject
- 코드스니펫
- avaliable
- 내_삶
- SWIFT
- 제어전송문
- uikit
- IOS
- Switch
- class
- 연관값
- 회고
- unrecognized selector sent to class
- weekly calendar
- error해결
- MyLife
- Git
- 파스칼표기법
- On branch is up to date with ' '
- ios 개발 강의
- 다짐글
- K디지털기초역량훈련
- copy-on-write
- actionSheet
- 바이트디그리
- 글또
- 글또9기
- Today
- Total
seong_hye, the developer
iOS) SwiftLint는 무엇일까? 본문
협업을 진행하다보면 개발자마다 코딩 스타일이 다르고 성향이 다르다는 것을 알 수 있다.
이런 경우 서로의 코드를 이해하는 데에도 많은 시간이 걸리고 후에 유지보수에도 어려움을 느낄 수 있다.
이런 경우 코딩 컨벤션을 정해주면 협업에 큰 도움이 될 수 있다.
코딩 컨벤션이란?
일종의 코딩 스탕일 규약으로 모든 구성원들이 읽고, 관리하기 쉬운 코드를 작성하는 것을 의미한다.
이를 통해 잠재적인 오류를 줄일 수 있고, 가독성이 높아지게 되어
다른 개발자가 작성한 코드를 이해하는 데에 도움을 주어 유지보수에도 도움이 된다.
코딩 컨벤션 가이드 중에는 린터(Linter)가 존재한다.
린터는 스타일 가이드를 따르지 않은 코드를 찾아서 알려주는 도구로 사용하는 언어에 따라 다르다.
이외에도 오류가 발생하거나 알려지지 않은 잘못 작성된 코드에 대한 경고를 하여 코드를 개선할 수 있도록 도와준다.
SwiftLint란?
Realm에서 제공해주는 기능으로 스위프트 스타일 및 컨벤션을 강제하기 위한 라이브러리로,
빌드할 때, 설정된 컨벤션에 맞춰 경고나 에러를 표시해주고 옵션에 따라 자동으로 수정해주는 기능을 갖추고 있다.
Kodeco 스위프트 스타일 가이드에 대략적인 기반을 두고 있으며
좀 더 정확한 결과를 위해 Clang과 SourceKit에 연결하여 소스 파일의 AST 표현을 사용한다.
SwiftLint 설치 방법은?
SwiftLint를 설치하는 방법은 CocoaPods, Homebrew, Mint, 빌드된 패키지 총 4가지 방법으로 이용할 수 있다.
Homebrew를 활용한 방법이 별도로 pod install을 할 필요가 없고,
코드리뷰를 할 때 리뷰어도 추가 작업 없이 코드를 확인할 수 있기에 이를 활용한 방법대해 설명할 것이다.
1) brew 설치
Homebrew는 오픈소스 소프트웨어 패키지 관리 시스템으로
깃허브를 이용해서 여러 패키지들을 관리한다.
Homebrew 설치방법은 링크를 참고하면 된다.
2) brew를 통해 SwiftLint 설치
터미널에 아래 코드를 작성하여 실행한다.
brew install swiftlint
3) Xcode 프로젝트에 적용하여 Xcode Scheme에 통합
아래 경로로 이동하여 Run Script Phase를 새로 만들어준다.
Target > Build Phases > + > New Run Script Phase
버튼 클릭과 동시에 Run Script가 생성되고 아래 코드를 복붙하면 된다.
brew path에 위치한 SwiftLint를 찾아가도록 하는 명령어이다.
if test -d "/opt/homebrew/bin/"; then
PATH="/opt/homebrew/bin/:${PATH}"
fi
export PATH
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
4) .swiftlint.yml 파일 생성
맞춤법을 검사할 때 적용할 규칙을 정하는 파일이다.
새 파일 > iOS > Other 항목의 Empty 파일을 선택하고 파일명을 .swiftlint.yml 로 입력한다.
주의) Documentation 항목의 Empty 파일을 하면 안 된다.
그럼 아래처럼 경고창이 뜨는데, Use "."을 클릭하면 된다.
5) 원하는 Rule 관리
.swiftlint.yml 파일에 따로 옵션을 작성하지 않으면, swiftLint에서 작성한 Default Lint가 적용된다.
아래는 SwiftLint 공식문서에서 예시로 제공한 룰 설정 파일이다.
disabled_rules: # 실행에서 제외할 룰 식별자들
- colon
- comma
- control_statement
opt_in_rules: # 일부 룰은 옵트 인 형태로 제공
- empty_count
- missing_docs
# 사용 가능한 모든 룰은 swiftlint rules 명령으로 확인 가능
included: # 린트 과정에 포함할 파일 경로. 이 항목이 존재하면 `--path`는 무시됨
- Source
excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
- Carthage
- Pods
- Source/ExcludedFolder
- Source/ExcludedFile.swift
# 설정 가능한 룰은 이 설정 파일에서 커스터마이징 가능
# 경고나 에러 중 하나를 발생시키는 룰은 위반 수준을 설정 가능
force_cast: warning # 암시적으로 지정
force_try:
severity: warning # 명시적으로 지정
# 경고 및 에러 둘 다 존재하는 룰의 경우 값을 하나만 지정하면 암시적으로 경고 수준에 설정됨
line_length: 110
# 값을 나열해서 암시적으로 양쪽 다 지정할 수 있음
type_body_length:
- 300 # 경고
- 400 # 에러
# 둘 다 명시적으로 지정할 수도 있음
file_length:
warning: 500
error: 1200
# 네이밍 룰은 경고/에러에 min_length와 max_length를 각각 설정 가능
# 제외할 이름을 설정할 수 있음
type_name:
min_length: 4 # 경고에만 적용됨
max_length: # 경고와 에러 둘 다 적용
warning: 40
error: 50
excluded: iPhone # 제외할 문자열 값 사용
identifier_name:
min_length: # min_length에서
error: 4 # 에러만 적용
excluded: # 제외할 문자열 목록 사용
- id
- URL
- GlobalAPIKey
reporter: "xcode" # 보고 유형 (xcode, json, csv, checkstyle, junit, html, emoji, markdown)
커스텀 룰 또한 다음과 같이 정의할 수 있기 때문에 자유로운 코딩 컨벤션이 가능하다.
custom_rules:
pirates_beat_ninjas: # 룰 식별자
included: ".*.swift" # 린트 실행시 포함할 경로를 정의하는 정규표현식. 선택 가능.
name: "Pirates Beat Ninjas" # 룰 이름. 선택 가능.
regex: "([n,N]inja)" # 패턴 매칭
match_kinds: # 매칭할 SyntaxKinds. 선택 가능.
- comment
- identifier
message: "Pirates are better than ninjas." # 위반 메시지. 선택 가능.
severity: error # 위반 수준. 선택 가능.
no_hiding_in_strings:
regex: "([n,N]inja)"
match_kinds: string
현재 SwiftLint에는 75개가 넘는 룰들이 있고, 이는 지속적인 Pull Request를 통해 수정 보안되고 있다.
전체 Rule은 다음의 링크에서 확인해 볼 수 있습니다.
https://realm.github.io/SwiftLint/rule-directory.html
Rule 공식문서에는 다양한 규칙들의 식별자(rule 설정에 있어서 필요합니다), default 설정 여부, 자동수정 여부, 최소 Swift Compiler 버전 등등 다양한 사항이 명시가 되어있다.
Rule 적용 여부를 설정하는 파라미터에는 크게 세가지가 있다.
- disabled_rules: 기본 활성화된 룰 중에 비활성화할 룰들을 지정한다.
- opt_in_rules: 기본 룰이 아닌 룰들을 활성화한다.
- whitelist_rules: 지정한 룰들만 활성화되도록 화이트리스트로 지정한다. (위의 파라미터들과는 같이 사용할 수는 없음)
6) 개인적으로 사용하는 rule 정리
# 라인 뒤에 공백이 없어야 합니다. https://realm.github.io/SwiftLint/trailing_whitespace.html
- trailing_whitespace
# 강제 캐스팅은 피해야합니다. https://realm.github.io/SwiftLint/force_cast.html
- force_cast
# 강제 언래핑은 피해야합니다. https://realm.github.io/SwiftLint/force_unwrapping.html
- force_unwrapping
# .count==0 보다는 .isEmpty를 사용하는 것이 좋습니다. https://realm.github.io/SwiftLint/empty_count.html
- empty_count
# 빈 String 문자열과 비교하는 것 보다는 .isEmpty를 사용하는 것이 좋습니다. https://realm.github.io/SwiftLint/empty_string.html
- empty_string
# operation 사용시 양옆에 공백이 있어야 합니다. https://realm.github.io/SwiftLint/operator_whitespace.html
- operator_usage_whitespace
# {}사용시 앞에 공백이 있어야 합니다. https://realm.github.io/SwiftLint/opening_brace.html
- opening_brace
# comma 앞에는 여백이 없고 뒤에는 공백이 있어야합니다. https://realm.github.io/SwiftLint/comma.html
- comma
# 주석 // 다음에 공백이 있어야 합니다.
- comment_spacing
협업을 진행하면서 알게 된 라이브러리를 좀 더 정리해서 알아보고 사용하고 싶은 마음에
이렇게 관련 글을 작성하게 되었네요 ㅎㅎ
잘 사용한다면 코드 컨벤션 관리를 확실히 편하게 할 수 있어서
안 사용해보신 분들은 사용해보는 경험을 가지는 것도 좋을 것 같아요!
참고)
https://github.com/realm/SwiftLint/blob/main/README_KR.md
https://yagom.net/forums/topic/swift-lint-%EC%8D%A8%EB%B3%B4%EA%B8%B0/
'IOS' 카테고리의 다른 글
iOS) 클래스(Class) vs 구조체(Struct) 제대로 알아보기 (0) | 2024.03.27 |
---|---|
Design) MVVM으로 넘어가는 이유가 뭘까?( vs MVC) (0) | 2024.01.21 |
8/23 프로젝트 회고 (0) | 2023.08.24 |
swift 내용 정리 (0) | 2022.12.13 |
동기 비동기 차이에 대하여 (0) | 2022.11.10 |