2. 소개
• 옥찬호 (Chris Ohk)
• Nexon Korea Game Programmer
• Microsoft Development Technologies MVP
• 페이스북 그룹 C++ Korea 대표
• IT 전문서 집필 및 번역 다수
• 게임샐러드로 코드 한 줄 없이 게임 만들기 (2013)
• 유니티 Shader와 Effect 제작 (2014)
• 2D 게임 프로그래밍 (2014)
• 러스트 핵심 노트 (2017)
• 모던 C++ 입문 (2017)
3. 시작하기 전에…
• 프로젝트의 완성도를 높일 수 있는 방법을 설명합니다.
• 주 내용은 프로그래머에 초점이 맞춰져 있지만,
다른 직군분들도 들으면 도움이 되는 내용도 포함되어 있습니다.
• 모던 C++로 만드는 프로젝트를 기준으로 설명합니다.
(Hearthstone++ : 모던 C++로 만드는 하스스톤 시뮬레이터)
• 프로젝트의 성격에 따라 설정 방법이 다를 수 있습니다.
혹시 나중에 프로젝트를 구성하다가 막히는 부분이 있다면 질문해 주세요!
청강대 특강
프로젝트 제대로 해보기
4. 목차
• 회사에서는 어떻게 프로젝트를 진행할까요?
• 우리들의 현실
• 프로젝트 제대로 해보기
• 소스 코드 관리 / 이슈 관리 / 코드 스타일
• 지속적인 통합 / 테스트 / 코드 커버리지
• 코드 리뷰 / 코드 품질 / 문서화
• 마치며
청강대 특강
프로젝트 제대로 해보기
8. 우리는…
• 소스 코드를 USB나 이메일로 주고 받습니다.
• 회의한 내용을 기록해두지 않습니다.
• 코드에 버그가 있는지 없는지 알 수가 없습니다.
• 코드가 정상적으로 컴파일 및 빌드되지 않습니다.
• 구현한 코드가 올바르게 수행되는지 확인해보지 않습니다.
• 서로 작성한 코드에 문제가 없는지 살펴보지 않습니다.
• 서로 작성한 코드로 인해 충돌이 생겨 엉망진창이 됩니다.
청강대 특강
프로젝트 제대로 해보기
10. 소스 코드 관리
• 이메일 / USB / 구글 드라이브로 코드 공유는 이제 그만!
• 서로 다른 코드로 작업할 가능성이 매우 높습니다.
• 이로 인해 코드가 충돌할 수 있으며 해결하기 매우 어렵습니다.
• 갱신한 코드에 버그가 생겨 이전 버전으로 되돌려야 할 때 고치기 어렵습니다.
• 분산 버전 관리 시스템을 사용합시다.
• Git : https://git-scm.com/
• Git을 배울 수 있는 사이트들
• https://try.github.io/
• https://rogerdudler.github.io/git-guide/index.ko.html
• https://opentutorials.org/course/1492
청강대 특강
프로젝트 제대로 해보기
11. 소스 코드 관리
• Git을 사용하면 무엇이 좋을까요?
청강대 특강
프로젝트 제대로 해보기
12. 소스 코드 관리
• 프로젝트를 관리하려면 Git을 사용해 명령을 내려야 합니다.
• Git 저장소 만들기 : git init
• 기존 저장소를 Clone하기 : git clone
• 파일의 상태 확인하기 : git status
• 파일을 새로 추적하기 : git add
• 변경 사항 커밋하기 : git commit
• 파일을 삭제하기 : git rm
• 변경된 내용 푸시하기 : git push
• 커밋 수정하기 : git commit --amend
• ...
청강대 특강
프로젝트 제대로 해보기
13. 소스 코드 관리
• 명령어를 사용하는게 어렵다면 간편한 GUI 프로그램을 사용해도 됩니다.
• GitHub Desktop
• Sourcetree
• TortoiseGit
• GitKraken
• Tower
청강대 특강
프로젝트 제대로 해보기
14. 소스 코드 관리
• Git을 사용하는 프로젝트를 지원하는 협업 플랫폼 3대장
• GitHub
• Bitbucket
• GitLab
• 여기서는 GitHub를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
15. 소스 코드 관리
• GitHub : https://github.com/
청강대 특강
프로젝트 제대로 해보기
16. 소스 코드 관리
• 프로젝트의 소스 코드를 저장하기 위한 저장소를 만들어 봅시다.
청강대 특강
프로젝트 제대로 해보기
17. 소스 코드 관리
• 짜잔~ 우리만의 소스 코드 저장소가 생겼습니다. 짝짝!
청강대 특강
프로젝트 제대로 해보기
18. 이슈 관리
• 새로 개발하는 기능과 버그 수정 등 모든 사항들은 반드시 기록해야 합니다.
• 나중에 새로 구현한 기능에서 버그가 발생했을 때 개발 과정을 추적할 수 있습니다.
• 버그를 수정했는데 다른 버그가 발생했을 때 이전 버그 수정 과정을 추적할 수 있습니다.
• 기능을 개선하는 작업을 맡았을 때 기능을 개발한 사람이 없을 수도 있습니다.
• 이슈를 관리할 수 있는 서비스들이 있습니다.
• JIRA
• Redmine
• Trac
• Mantis
청강대 특강
프로젝트 제대로 해보기
19. 이슈 관리
• GitHub의 Issues를 사용해 관리할 수도 있습니다.
청강대 특강
프로젝트 제대로 해보기
20. 이슈 관리
• 이슈를 작성할 때는 어떤 작업인지 자세히 기록합니다.
청강대 특강
프로젝트 제대로 해보기
21. 이슈 관리
• 이슈 진행 상황은 댓글을 통해 작성합니다.
청강대 특강
프로젝트 제대로 해보기
22. 코드 스타일
• 프로그래머들의 영원한 난제
청강대 특강
프로젝트 제대로 해보기
if (showHelp) {
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
if (showHelp)
{
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
vs
23. 코드 스타일
• 코드 스타일에 정답이란 없습니다.
(물론 언어 차원에서 스타일을 정하는 경우도 있습니다.)
• 회사에서는 팀마다 코드 스타일을 정해두고 사용합니다.
• 들여쓰기를 할 때 탭을 쓸 것이냐 공백 문자를 쓸 것이냐
• 중괄호는 같은 줄에서 열 것이냐 다음 줄에서 열 것이냐
• if 문 뒤에 공백 문자를 넣을 것이냐 말 것이냐
• 코드 스타일을 정하는 이유
• 프로그래머마다 선호하는 코드 스타일이 다릅니다.
• 따라서 통일된 코드 스타일을 사용하지 않으면 가독성이 떨어집니다.
청강대 특강
프로젝트 제대로 해보기
24. 코드 스타일
• 큰 회사들은 나름대로의 코드 스타일 가이드 문서를 정립합니다.
• Google C++ Style Guide
• C++ Core Guidelines
• CMU C++ Coding Standard
• ROS C++ Style Guide
• LLVM Coding Standards
• 위 코드 스타일 문서를 참고해서 팀에 적용해도 됩니다.
하지만 우리만의 코드 스타일을 만들고 싶다면 어떻게 해야 할까요?
청강대 특강
프로젝트 제대로 해보기
25. 코드 스타일
• C++에서는 clang-format을 사용해 코드 스타일을 지정할 수 있습니다.
(자세한 내용은 https://clang.llvm.org/docs/ClangFormatStyleOptions.html 참고)
청강대 특강
프로젝트 제대로 해보기
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -3
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: true
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
...
26. 코드 스타일
• C++에서는 clang-format을 사용해 코드 스타일을 지정할 수 있습니다
(자세한 내용은 https://clang.llvm.org/docs/ClangFormatStyleOptions.html 참고)
청강대 특강
프로젝트 제대로 해보기
if (showHelp) {
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
if (showHelp)
{
std::cout << ToString(parser) << 'n';
exit(EXIT_SUCCESS);
}
AfterControlStatement: true
AfterControlStatement: false
27. 지속적인 통합
• 이런 일 겪어본 적 없나요?
• 정상적으로 빌드되는 프로젝트에 팀원 A가 작업을 하기 시작합니다.
• 팀원 A는 작업을 완료하지 않은 상태에서 프로젝트에 코드를 커밋합니다.
• 프로젝트는 컴파일 오류로 인해 빌드되지 않습니다.
• 이 상태에서 팀원 B가 작업을 하기 위해 프로젝트 코드를 갱신합니다.
• 팀원 B는 프로젝트가 빌드되지 않아 당황합니다.
• 팀원 A가 작업을 완료하기 전까지 팀원 B는 작업을 할 수 없습니다.
청강대 특강
프로젝트 제대로 해보기
28. 지속적인 통합
• 지속적인 통합(Continuous Integration)은 이전과 같은 문제점을
해결하기 위해 개발 팀원들이 작성한 코드를 최대한 자주 통합하는
소프트웨어 개발 실천법입니다.
• 지속적인 통합의 장점
• 자동화를 통해 수시로 통합할 수 있으며, 문제를 조기에 발견하고 조치할 수 있습니다.
• 코드와 테스트를 개인 환경과 독립적으로 구성할 수 있습니다. 즉, 개발자가 코드를 수정하고
커밋하지 않아 개인 환경에서만 빌드되는 문제를 조기에 수정할 수 있습니다.
• 다른 개발자가 수정한 내용을 자동으로 빌드하고 통합 테스트를 진행할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
http://12bme.tistory.com/151
29. 지속적인 통합
• 플랫폼에 따라 지속적인 통합을 지원하는 서비스들이 있습니다.
• App Center
• Travis CI
• CircleCI
• AppVeyor
• Jenkins
• Bamboo
• 여기서는 Travis CI와 AppVeyor를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
30. 지속적인 통합
• Travis CI : https://travis-ci.org/ (Linux와 macOS 지원)
청강대 특강
프로젝트 제대로 해보기
32. 지속적인 통합
• 최상위 경로에 .travis.yml 파일을 만들고 다음과 같이 작성합니다.
(자세한 내용은 https://docs.travis-ci.com/user/customizing-the-build/ 참고)
청강대 특강
프로젝트 제대로 해보기
language: cpp
matrix:
include:
# Test Docker based on Ubuntu 18.04 LTS + gcc
- os: linux
dist: trusty
sudo: required
services: docker
script:
- sh Scripts/travis_build_docker.sh
# Test OS X 10.12 + Xcode 9 + clang
- os: osx
osx_image: xcode9
compiler: clang
script:
- sh Scripts/travis_build.sh
33. 지속적인 통합 청강대 특강
프로젝트 제대로 해보기
before_install:
- eval "${MATRIX_EVAL}"
- if [ $TRAVIS_OS_NAME == linux ]; then
sudo apt-get update -qq;
sudo apt-get install -y --no-install-recommends xorg-dev libglu1-mesa-dev;
sudo apt-get install -y --no-install-recommends libxrandr-dev libxi-dev libxxf86vm-dev libxinerama-dev libxcursor-dev lcov;
sudo apt-get install -y --no-install-recommends libopenal-dev libvorbis-dev libflac-dev;
wget https://github.com/glfw/glfw/releases/download/3.2.1/glfw-3.2.1.zip;
unzip glfw-3.2.1.zip && cd glfw-3.2.1;
cmake -DBUILD_SHARED_LIBS=true -DGLFW_BUILD_EXAMPLES=false -DGLFW_BUILD_TESTS=false -DGLFW_BUILD_DOCS=false .;
sudo make -j $CPU_NUM install && cd ..;
fi
- if [ $TRAVIS_OS_NAME == osx ]; then
brew update;
brew install openal-soft;
brew install glfw3;
brew install lcov;
wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz;
tar xvf release-1.8.0.tar.gz;
cd googletest-release-1.8.0;
cmake .;
sudo make -j $CPU_NUM install && cd ..;
fi
after_success:
- bash <(curl -s https://codecov.io/bash)
34. 지속적인 통합
• 이제 코드를 커밋하거나 풀 리퀘스트를 할 때마다 프로젝트가 자동 빌드됩니다.
청강대 특강
프로젝트 제대로 해보기
35. 지속적인 통합
• AppVeyor : https://www.appveyor.com/ (Windows와 Linux 지원)
청강대 특강
프로젝트 제대로 해보기
37. 지속적인 통합
• 최상위 경로에 appveyor.yml 파일을 만들고 다음과 같이 작성합니다.
(자세한 내용은 https://www.appveyor.com/docs/build-configuration/ 참고)
청강대 특강
프로젝트 제대로 해보기
version: 0.3 ({build})
skip_branch_with_pr: true
os:
- Visual Studio 2017
platform:
- x64
configuration:
- Release
clone_folder: C:Hearthstonepp
install:
- git submodule update --init
- ps: $env:CMAKE_GENERATOR = "Visual Studio 15 2017 Win64"
before_build:
- md C:Hearthstoneppbuild
- cd C:Hearthstoneppbuild
- cmake .. -G "%CMAKE_GENERATOR%"
build:
project: C:HearthstoneppbuildHearthstonepp.sln
parallel: true
verbosity: normal
after_build:
- C:HearthstoneppbuildbinReleaseUnitTests.exe
38. 지속적인 통합
• 이제 코드를 커밋하거나 풀 리퀘스트를 할 때마다 프로젝트가 자동 빌드됩니다.
청강대 특강
프로젝트 제대로 해보기
39. 테스트
• 새로 작성하거나 수정한 코드가 성공적으로 빌드되었나요?
빌드만 된다고 해서 끝난 게 아닙니다. 반드시 테스트를 해야 합니다.
• 테스트를 하는 이유
• 내가 원했던 동작과 실제 동작이 일치하는 지 확인할 수 있습니다.
• 나중에 코드가 수정되었을 때 나머지 동작에 영향이 없는지를 확인할 수 있습니다.
• 비정상적인 데이터가 입력되었을 때 어떻게 처리할 지 고려할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
40. 테스트
• 테스트의 분류
• 단위 테스트 (Unit Test) : 분리된 기능에 대한 검증으로 단위 테스트 프레임워크를
이용해 개발자가 테스트합니다.
• 통합 테스트 (Integration Test) : 컴포넌트간의 상호 작용에 대한 검증으로
테스트 입력 값을 만들어 실행한 후 결과를 확인합니다.
• 시스템 테스트 (System Test) : 전체 시스템 동작에 대한 검증으로 시스템 속도 측정,
정확한 데이터 처리 확인, 성공률과 실패율 확인 등이 있습니다.
• 인수 테스트 (Acceptance Test) : 사용자 요구 사항 처리에 대한 검증으로 사용자가
요구 기능을 입력하고 기능이 정확하게 수행하는지 확인합니다.
• 여기서는 단위 테스트를 해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
https://www.oss.kr/info_test/show/2ca348d0-d597-4606-971e-4bdc91bed442
41. 테스트
• C++에서 많이 사용하는 단위 테스트 프레임워크는 다음과 같습니다.
• Boost.Test
• googletest
• Catch
• 여기서는 googletest를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
42. 테스트
• googletest : https://github.com/google/googletest
청강대 특강
프로젝트 제대로 해보기
43. 테스트
• Github 프로젝트에 googletest 프레임워크를 추가하는 방법
• git submodule add <저장소 주소> <저장할 위치>
예) git submodule add https://github.com/google/googletest
Librariesgoogletest
청강대 특강
프로젝트 제대로 해보기
44. 테스트
• 먼저 프로젝트 설정을 위해 CMakeLists.txt를 만듭니다.
청강대 특강
프로젝트 제대로 해보기
# Target name
set(target UnitTests)
# Includes
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# Sources
file(GLOB_RECURSE sources
${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# Build executable
add_executable(${target}
${sources})
# Project options
target_compile_definitions(${target}
PRIVATE
RESOURCES_DIR="${CMAKE_CURRENT_SOURCE_DIR}/../../Resources/"
)
# Link libraries
target_link_libraries(${target}
PRIVATE
${DEFAULT_LINKER_OPTIONS}
Hearthstonepp
gtest)
45. 테스트
• 단위 테스트 코드를 만들 차례입니다. main() 함수부터 만들어 봅시다.
청강대 특강
프로젝트 제대로 해보기
#include "gtest/gtest.h"
int main(int argc, char* argv[])
{
::testing::InitGoogleTest(&argc, argv);
int ret = RUN_ALL_TESTS();
return ret;
}
46. 테스트
• 기능별로 정상 동작하는지 확인하기 위해 단위 테스트 코드를 작성해 봅시다.
청강대 특강
프로젝트 제대로 해보기
TEST(TestCards, GetAllCards)
{
const std::vector<Card*> cards1 = Cards::GetInstance()->GetAllCards();
ASSERT_FALSE(cards1.empty());
EXPECT_EQ(5216, (int)cards1.size());
}
TEST(TestCards, FindCardByID)
{
const Card* card1 = Cards::GetInstance()->FindCardByID("AT_001");
const Card* card2 = Cards::GetInstance()->FindCardByID("");
EXPECT_EQ("AT_001", card1->id);
EXPECT_EQ(nullptr, card2);
}
47. 테스트
• 테스트 코드를 모두 작성했다면, 모두 통과하는지 확인해 봅시다.
만약 통과하지 못했다면 테스트 코드나 작성한 코드에 문제가 있다는 겁니다.
청강대 특강
프로젝트 제대로 해보기
48. 코드 커버리지
• 여러분이 작성한 코드 중에서 얼마나 많은 부분을 단위 테스트하고 있을까요?
테스트를 진행할 때 코드가 얼마나 실행되었는지를 나타내는 지표를
코드 커버리지(Code Coverage)라고 합니다.
청강대 특강
프로젝트 제대로 해보기
int foo(int x, int y)
{
int z = 0;
if ((x > 0) && (y > 0))
{
z = x;
}
return z;
}
foo(1, 1)을 호출할 때와
foo(0, 1)을 호출할 때 다른 점이 무엇일까요?
https://en.wikipedia.org/wiki/Code_coverage
49. 코드 커버리지
• 언어에 따라 코드 커버리지를 검사하는 툴들이 있습니다.
• Cobertura
• CppUnit
• lcov/gcov
• Coverage.py
• pytest
• 여기서는 lcov를 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
50. 코드 커버리지
• lcov : http://ltp.sourceforge.net/coverage/lcov.php
청강대 특강
프로젝트 제대로 해보기
51. 코드 커버리지
• lcov 사용 방법
청강대 특강
프로젝트 제대로 해보기
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j 8
lcov -c -i -d Tests/UnitTests -o base.info
bin/UnitTests
lcov -c -d Tests/UnitTests -o test.info
lcov -a base.info -a test.info -o coverage.info
lcov -r coverage.info '/usr/*' -o coverage.info
lcov -r coverage.info '*/Libraries/*' -o coverage.info
lcov -r coverage.info '*/Programs/*' -o coverage.info
lcov -r coverage.info '*/Tests/*' -o coverage.info
lcov -r coverage.info '*/Tools/*' -o coverage.info
lcov -l coverage.info
genhtml coverage.info -o out
52. 코드 커버리지
• 페이지를 확인해 보면 폴더별로 커버리지 결과를 볼 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
53. 코드 커버리지
• 좀 더 시각화된 결과를 보고 싶다면 Codecov와 같은 툴과 연동하면 됩니다.
• Codecov : https://codecov.io/
청강대 특강
프로젝트 제대로 해보기
54.
55. 코드 리뷰
• 테스트까지 잘 통과하니, 이제 끝!? => 코드 리뷰를 해야 합니다.
• 코드 리뷰를 하는 이유
• 게임은 여러 시스템과 컨텐츠가 서로 상호 작용하는 프로그램입니다.
• 내가 새로 구현하거나 변경한 코드로 인해 다른 곳에 영향을 줄 수 있습니다.
• 내가 작성한 코드로 인해 발생할 수 있는 버그나 오류를 미리 막을 수 있습니다.
• 내가 코드를 바라보는 시각과 다른 사람이 바라보는 시각은 다를 수 있습니다.
• 다른 사람의 피드백을 통해 프로그래밍 실력을 발전시킬 수 있는 좋은 기회이기도 합니다.
청강대 특강
프로젝트 제대로 해보기
56. 코드 리뷰
• 내가 작성한 코드를 머지하기 전에 무엇을 추가하거나 변경했는지 작성합니다.
이 때 어떤 작업을 했는지 자세하게 적어주면 좋습니다.
청강대 특강
프로젝트 제대로 해보기
57. 코드 리뷰
• 작성을 완료했다면 코드 리뷰할 담당자를 지정합니다.
청강대 특강
프로젝트 제대로 해보기
58. 코드 리뷰
• 코드 리뷰 담당자가 내가 작성한 코드를 살펴보고 피드백을 해줍니다.
이를 통해 미래에 발생할 수 있는 버그나 오류를 미리 막을 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
59. 코드 리뷰
• 피드백을 모두 반영했다면 코드 리뷰 담당자가 다시 한 번 살펴봅니다.
수정 내역을 확인하고 문제가 없으면 코드 리뷰를 통과했다고 처리합니다.
청강대 특강
프로젝트 제대로 해보기
60. 코드 품질
• 코드 리뷰를 하더라도 세부 사항을 모두 보기에는 한계가 있습니다.
• 보통 크래시가 날 수 있는 부분이나 NULL 포인터 체크 위주로 살펴봅니다.
• 새로운 컨텐츠를 만드는 경우 구현 로직은 보통 담당자가 책임지는 경우가 많습니다.
(모든 컨텐츠 기획을 이해하면서 코드를 살펴보기에는 시간이 너무 많이 듭니다.)
• 내가 짠 코드는 잘 짠 코드일까요?
• 대학생이던 시절에도, 지금도 항상 하고 있는 생각입니다.
• 누군가 확인해줬으면 좋겠는데 부탁할 사람이 없습니다.
• 그렇다면 어떻게 해야 할까요?
청강대 특강
프로젝트 제대로 해보기
61. 코드 품질
• 세상에는 코드 품질을 측정해주는 좋은 툴들이 많이 있습니다.
• ReSharper Ultimate
• CodeClimate
• Codebeat
• Codacy
• Scrutinizer
• LGTM
• 여기서는 Codacy와 LGTM을 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
62. 코드 품질
• Codacy : https://www.codacy.com/
청강대 특강
프로젝트 제대로 해보기
63. 코드 품질
• Github 계정으로 로그인한 뒤 프로젝트를 추가하면 빌드를 진행합니다.
(설정 파일을 따로 추가할 필요가 없다는 게 장점!)
빌드가 되면 코드 품질을 측정해 등급과 이슈 개수를 보여줍니다.
청강대 특강
프로젝트 제대로 해보기
64. 코드 품질
• 프로젝트를 클릭해서 들어가면 이슈를 몇 가지 항목으로 분류합니다.
(보안, 코드 스타일, 호환성, 사용하지 않는 코드, 성능 등)
청강대 특강
프로젝트 제대로 해보기
65. 코드 품질
• 이슈를 하나씩 살펴보고 싶다면 각 항목을 클릭하면 됩니다.
이제 내 코드에 어떤 성능 문제가 있는지 확인할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
66. 코드 품질
• LGTM : https://lgtm.com/
청강대 특강
프로젝트 제대로 해보기
67. 코드 품질
• Github 계정으로 로그인한 뒤 프로젝트를 추가하면 빌드를 진행합니다.
Hearthstone++의 경우 빌드하기 위해 별도의 설정 파일을 추가해야 합니다.
(별도의 설정 파일 없이 빌드가 되는 경우도 있습니다.)
청강대 특강
프로젝트 제대로 해보기
68. 코드 품질
• 최상위 경로에 .lgtm.yml 파일을 만들고 다음과 같이 작성합니다.
(자세한 내용은 https://lgtm.com/help/lgtm/lgtm.yml-configuration-file 참고)
청강대 특강
프로젝트 제대로 해보기
69. 코드 품질
• 이제 LGTM이 빌드를 하고 나서 프로젝트의 코드 품질을 분석합니다.
분석이 끝나면 언어별로 등급이 나오고 프로젝트의 상대적 위치를 보여줍니다.
청강대 특강
프로젝트 제대로 해보기
70. 코드 품질
• 파일별로 코드의 어느 부분이 어떤 문제를 갖고 있는지를 확인할 수 있습니다.
청강대 특강
프로젝트 제대로 해보기
71. 코드 품질
• 툴마다 지원하는 언어가 서로 다르므로 확인한 뒤 선택하는 게 좋습니다.
• 툴마다 기능이 다르기 때문에 두 가지 이상의 툴을 사용하기를 권장합니다.
• 프로젝트에 따라 설정 파일을 따로 만들어야 할 수도 있습니다.
설정 파일을 만드는 방법은 각 툴의 도움말을 참고하기 바랍니다.
청강대 특강
프로젝트 제대로 해보기
72. 문서화
• 내가 새로 만든 기능을 나중에 다른 사람이 사용하거나 수정할 수 있습니다.
내가 새로 만든 컨텐츠를 나중에 다른 사람이 유지보수 할 수 있습니다.
• 다른 사람이 만들어 놓은 기능이나 컨텐츠의 구현 코드를 파악하기 위해서는
꽤 많은 시간이 걸립니다. (몇 달 전에 내가 짠 코드도 다시 보면 기억이…)
• 따라서 다음에 작업할 사람을 위해 단서, 힌트를 남겨두면 좋습니다.
• 작업 내용을 정리한 문서
• 가독성 있는 코드
• 구현 코드의 이해를 돕기 위한 주석
청강대 특강
프로젝트 제대로 해보기
73. 문서화
• 언어에 따라 주석문을 모아 문서로 만들어 주는 툴들이 있습니다.
• Doxygen
• Sphinx
• Javadoc
• pydoc
• 여기서는 Doxygen을 사용해보도록 하겠습니다.
청강대 특강
프로젝트 제대로 해보기
76. 문서화
• 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다.
• 주석 스타일을 다음 중 하나를 선택해 사용해야 합니다.
• JavaDoc 스타일
/**
* ... text ...
*/
• Qt 스타일
/*!
* ... text ...
*/
청강대 특강
프로젝트 제대로 해보기
77. 문서화
• 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다.
• 주석 스타일을 다음 중 하나를 선택해 사용해야 합니다.
• C++ 주석 뒤에 /나 !를 붙임
///
/// ... text ...
///
또는
//!
//! ... text ...
//!
청강대 특강
프로젝트 제대로 해보기
78. 문서화
• 주석을 기반으로 문서를 만들려면 몇 가지 문법을 지켜야 합니다.
• 몇 가지 특별한 명령을 사용해 클래스, 함수의 매개 변수, 반환 값 등을 지정해줘야 합니다.
(자세한 내용은 http://www.stack.nl/~dimitri/doxygen/manual/index.html 참고)
• class Test : 클래스 Test
• struct Test : C 구조체 Test
• enum Test : 열거체 Test
• fn Test : 함수 Test
• param Test : 매개 변수 Test
• return Test : 반환 값 Test
• namespace Test : 네임스페이스 Test
청강대 특강
프로젝트 제대로 해보기
79. 문서화
• 문서화를 위한 코드 예시
청강대 특강
프로젝트 제대로 해보기
//!
//! brief Account class.
//!
//! This class stores user information such as e-mail address and nickname.
//! Also, it stores a list of decks. A user can construct several decks.
//!
class Account
{
public:
//! Constructs anonymous account.
Account();
//! Constructs account with given p email and p nickname.
//! param email E-mail address of user.
//! param nickname Nickname of user.
Account(std::string&& email, std::string&& nickname);
80. 문서화
• 문서를 만들 준비가 끝났다면 Doxywizard로 doxyfile을 만들어 봅시다.
청강대 특강
프로젝트 제대로 해보기
81. 문서화
• 문서를 만들 준비가 끝났다면 Doxywizard로 doxyfile을 만들어 봅시다.
• Project name : 프로젝트 이름
• Project version or id : 프로젝트 버전
• Source code directory : 소스 코드가 있는 위치
• Destination directory : 문서를 출력할 위치
청강대 특강
프로젝트 제대로 해보기
82. 문서화
• 모든 정보를 입력했다면 Run 탭에서 Run doxygen 버튼을 누르면 됩니다.
청강대 특강
프로젝트 제대로 해보기