22-10-17
안녕하세요, GitHub 한국 총판 단군소프트입니다. 오늘의 GitHub 소식, 'GitHub 코드 스캔으로 개발자 만족도 높이기'에 대한 주제로 찾아뵙게 되었습니다 :) 그럼 시작해 볼까요?
메모리 누수 방지 Go언어의 defer문은 주변 함수가 반환될 때까지 해당 함수의 실행을 지연시킵니다. 해당 구문은 예를 들어, 파일 핸들 등의 리소스를 종료하거나 데이터베이스 트랜잭션을 완료하는 등 정리하는 데 유용합니다.
무시할 수 없는 오류 일부 코드베이스에서는 Go Object Relational Mapper인 GORM을 사용합니다. GORM에서의 에러 처리는, 체인이 가능한 API를 가지고 있기 때문에, 일반적인 Go 코드와는 다릅니다. 다음은 예시 문입니다. if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil { // error handling... }
루프 구문 퍼포먼스 문제 위와 같은 누락된 오류 검사로부터의 보호 뿐만 아니라 데이터베이스 쿼리 코드 성능도 유지해야 하는데요, 일반적으로 "N+1 쿼리"는 성능 문제를 일으킬 수 있습니다. 집합의 모든 멤버에 대해 한 번씩 비용이 많이 드는 작업이 수행되기 때문에 항목 수가 증가할수록 코드가 느려집니다. 여기서는 대부분의 경우 루프 내의 데이터베이스 쿼리문이 원인입니다. 일반적으로 루프 외부의 배치 쿼리를 사용하면 퍼포먼스가 향상됩니다. 다음 링크는 저희가 작성한 CodeQL 쿼리입니다. 이 쿼리는 실제로 실행되는 GORM 메서드에 대한 콜을 검색합니다. 이 콜 리스트를, 루프내에서 발생하는 콜 리스트로 필터링 후, 필터에 포착된다면 CI를 실패합니다. CodeQL의 장점은 루프 본체 내에서 데이터베이스 콜에 한정되지 않고 루프에서 직접 또는 간접적으로 호출된 함수 내의 콜도 포착된다는 것입니다. 쿼리문 사용 아래 쿼리문들은 실험적인 것으로 CodeQL 데이터베이스에는 포함되어 있지 않습니다만, 저희가 생성한 특수 쿼리 데이터베이스를 참조하여 사용할 수 있습니다. 먼저 분석하려는 저장소에 .github/codeql/go-developer-happiness.qls 파일을 아래 내용으로 생성합니다. - import: codeql-suites/go-developer-happiness.qls from: codeql-go
- name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: go queries: ./.github/codeql/go-developer-happiness.qls
나만의 쿼리문 작성 코드베이스에 추가할 커스텀 CodeQL 쿼리문이 있다면 다음 문서와 커뮤니티에서 자세히 다루고 있습니다. 여러분의 의견을 기다리고 있습니다! |