SonarQube 와 Jenkins 서버를 가지고 있다는 전제 하에 시작되는 이야기입니다.

개인이 아닌 팀 규모의 개발팀에서는 보통 CI 관련하여 Jenkins 등을 많이 사용하고 있습니다.

JenkinsSonarQube 를 활용하여 사용하는 이야기 입니다.

 

먼저 시나리오를 써봅니다. 어떤 시나리오냐?

Jenkins 와 SonarQube 를 언제 어떤 용도로 사용하느냐에 대한 시나리오 입니다.

 

보통은 소스 관리를 하기 위해 GitHub, GitLab 등을 사용을 합니다.

그러면 보통은 아래와 같은 구성들이 나오겠죠

 

  • GitHub - Jenkins - SonarQube
  • GitLab - Jenkins - SonarQube

제가 사용하던 동작 흐름은 아래와 같습니다.

 

  • 소스 작업 commit 후 push
  • GitLab 에서 변화 감지후 Jenkins로 WebHook 발생
  • Jenkins에서 WebHook 인지 후 소스 pull 후 build
  • build 완료 후 deploy

이 중에 build 전후로 SonarQube 를 추가해보기로 합니다.

그러기 위해서 Jenkins에서 SonarQube 를 연동하는 법을 정리해봅니다.

제가 알아본 방법은 크게 2가지가 있었습니다.

 

  1. Jenkins Plugin 으로 사용하는 방법
  2. gradle Task 추가 후 사용하는 방법

1. Jenkins Plugin 사용하는 방법

먼저 Jenkins 에 SonarQube Scanner 플러그인을 설치합니다.

 

SonarQube Scanner for Jenkins

Jenkins 관리 - 플러그인 관리 - SonarQube Scanner for Jenkins 설치

(https://plugins.jenkins.io/sonar)

 

그리고 적용하려는 프로젝트 구성에 SonarQube 연동하는 스텝을 추가합니다.

Jenkins - 프로젝트 - 구성 - Add build step - Execute SonarQube Scanner 추가

Analysis properties 작성

 

아래 이미지와 같이 작성하며, 아래 요소들을 주의하여 작성합니다.

  • sonar.host_url : SonarQube 서버 url 및 port
  • sonar.login : SonarQube ID 혹은 token
  • sonar.password : SonarQube Password (ID에서 token 사용시는 공백)
  • sonar.projectKey : SonarQube 프로젝트 값 참조
  • sonar.projectName : SonarQube 프로젝트 값 참조
  • sonar.java.binaries : Jenkins workspace 내에서 컴파일 후 생성된 class binary 경로
  • sonar.profile : SonarQube 프로젝트 값 참조
  • sonar.coverage.jacoco.xmlReportPaths : Jenkins workspace 내에서 JaCoCo Report 생성 경로 (JaCoCo 미사용시 skip)

위 Step을 추가 후 빌드를 돌려봅니다.

빌드가 잘 되었으면 콘솔 로그도 한번 구경해봅니다.

+) Coverage Report를 작성해주는 JaCoCo 플러그인도 있습니다.

 

JaCoCo plugin

Jenkins 관리 - 플러그인 관리 - JaCoCo plugin 설치

(https://plugins.jenkins.io/jacoco)

 

적용하려는 프로젝트 구성에 Coverage Report를 작성하는 스텝을 추가합니다.

Jenkins - 프로젝트 - 구성 - Add build step - Record JaCoCo coverage report 추가

아래의 항목들을 추가 작성합니다.

 

  • Inclusions (e.g.: **/*.class) : **/*.class

  • Exclusions (e.g.: **/*Test*.class) : **/R.class, **/R$*.class, **/BuildConfig.*, **/Manifest*.*, com/android/**/*.class

변경한 구성을 저장 후 빌드를 진행해 봅니다.

빌드가 성공하였다면 역시나 콘솔 로그를 확인해봅니다.

2. gradle Task 추가 후 사용하는 방법

먼저 Android 앱 소스에 gradle Task 추가하는 방법은 아래 링크를 참고하시면 됩니다.

그리고 Jenkins 프로젝트 구성에서 아래와 같이 gradlew 명령을 직접 써주시면 됩니다.

Jenkins - 프로젝트 - 구성 - Add build step - Execute shell 추가

 

chmod +x gradlew

# JaCoCo 커버리지 리포트 작성
./gradlew coverageReport

# SonarQube 분석
./gradlew sonarqube

빌드 후 확인을 해봅니다.

3. 2가지 방법의 차이?

먼저 플러그인을 사용하면 프로젝트 소스 레벨에서 추가할 부분이 없습니다.

그리고 Jenkins 프로젝트 상태 화면에 관련 UI도 이쁘게 생긴답니다.

하지만 JaCoCo플러그인 은 빌드 후 조치 구성에서만 추가가 가능하였고, Build 구성에는 추가가 불가하였습니다. SonarQube 플러그인은 Build 구성에서만 추가가 가능하였고요.

(Jenkins 프로젝트가 Maven 프로젝트였다면 다 가능한 걸로 보였습니다.)

 

gradle Task 방식으로 진행하면 Excute shell 항목에서 SonarQube, JaCoCo 사용이 자유롭게 가능합니다.

 

하지만 프로젝트 소스 레벨에서 gradle Task를 추가해야 했으며, Jenkins 프로젝트 상태 화면도 다시 평범해졌습니다.

두 방식을 사용시 장단점들이 있는 상태였습니다.

그 후...

저 이 후로 GitLab MergeRequest 시 Jenkins가 위 동작들을 처리 후 SonarQube 결과를 GitLab에 MR 메세지로 남길 수 있지 않을까 했습니다만...

특히나 검색해보니 GitHub 플러그인 사용시 아래와 같이도 사용이 가능해 보였습니다.

하지만 제가 써야 하는 건 GitLab 이었고, GitLab 플러그인은 지원이 중단되었습니다...

정확히는 기존에 있던 개인 개발자가 만들던 플러그인이 SonarQube 7.7 버전부터 중단되었습니다.

https://github.com/gabrie-allaigre/sonar-gitlab-plugin/issues/222

위 링크의 코멘트나 아래 링크를 보면 GitLab과 콜라보레이션을 위해 SonarQube 에서 플러그인 지원을 중단한 것으로 보입니다...

https://www.sonarqube.org/sonarqube-8-1/

아쉬운 대로 Jenkins에서 빌드 후 조치에 GitLab 관련된 플러그인 기능을 사용해 보았지만.... 이렇네요..

네 그래서 일단은 접었습니다.

추후에 여유가 생긴다면 다른 방법들을 생각해보던지 해야겠습니다.

'IT > ETC' 카테고리의 다른 글

[SonarQube] SonarQube 도입기?  (0) 2020.02.07
[Docker] Docker란?  (0) 2018.03.23
Expert Beginner란...  (0) 2018.03.12
[Cloud9][Ruby on Rails] C9 생성 후 간단한 Ruby on Rails 페이지 만들기  (0) 2017.12.29

SonarQube(소나큐브) 도입 및 적용에 대한 내용입니다.

먼저 소나큐브란 무엇인가?

위키에서는 아래와 같이 소나큐브를 설명하고 있습니다.

소나큐브(SonarQube, 이전 이름: 소나/Sonar)[2]는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 소나소스(SonarSource)가 개발하였다. 소나큐브는 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공한다.

개발자에게 좋은 정적분석 툴이라는 내용 같네요.

https://www.sonarqube.org/ 에 적혀있는 대문 문구입니다.

Your teammate forCode Quality and Security

SonarQube empowers all developers to write cleaner and safer code.

역시 소나큐브가 모든 개발자(가)보다 깨끗하고 안전한 코드를...

뭐 아무튼 코드 품질과 보안에 대한 도움을 준다는 내용 같네요.

슬라이드쉐어에 소나큐브에 대해 잘 정리된 슬라이드가 있어 달아봅니다~

https://www.slideshare.net/curvc/sonarqube-sonarqube

저는 어떤 타이밍에 어떻게 소나큐브를 활용할지에 대한 부분에 앞서 실제로 써보는 시간을 가져보았습니다.

소나큐브를 설치할 서버를 만들 능력은 없어 제 Windows 10 PC에 Docker 설치 후 SonarQube Image를 받은 후 돌려보았습니다.

Docker Image는 SonarQube Community Edition을 기본 지원하는 것 같네요.

Docker 설치 및 설정 등은 아래 링크들을 참고하면 됩니다.

참고로 포스팅 글에서 sonar-scanner 부분은 스킵하였습니다.

그냥 설치시는 아래 링크 참조하시면 될 것 같네요.

https://docs.sonarqube.org/latest/setup/get-started-2-minutes/

Docker에 소나큐브 서버는 아래와 같이 돌렸습니다.

> docker pull sonarqube > docker run -d --name sonarqube_com -p 9000:9000 sonarqube

잘 돌아가는지 소나큐브 페이지에 들어가봅니다.

http://localhost:9000/

Android 개발자다 보니 Android 개발 환경에서 설정하였고, Android Studio에서 포스팅 글을 참고하여 설정하니 잘 되었습니다.

Android Studio의 Terminal에서 아래와 같이 실행하면 로컬 Docker에 설치된 소나큐브 서버에 결과가 잘 올라가더랍니다.

> gradlew sonarqube

진행하다보니 같이 일하는 iOS 개발자의 소스도 돌려보려 하니 안되더군요.

Docker로 돌린 소나큐브는 Community Edition 이었고, Objective-C나 Swift는 과금해야 사용할 수 있는 Developer Edition 부터 사용이 가능한 문제가 있었습니다.

 

어떻게 활용할지보다 일단 써보자는 취지로 접근한 지라 Trial 로 써보기로 합니다.

https://www.sonarsource.com/plans-and-pricing/

How are the plans licensed?

Community Edition is free.

Developer Edition, Enterprise Edition and Data Center Edition are priced per instance per year and based on your lines of code. You pay per instance for a maximum number of lines of code to be analyzed.

Determine your max number of LOCs on your edition of choice and see what it will cost you.

Can I get an evaluation license?

It is possible to get a free, 14 day evaluation license of any commercial edition by filling in the form you see once you select your edition.

마침 소나큐브 Docker Image도 Developer Edition을 지원을 하고는 있네요.

> docker run -d --name sonarqube_dev -p 9001:9000 sonarqube:developer-beta

Community Edition과 동시에 돌려보려 포트 설정을 요리조리 바꿔봤지만... 워낙 Docker 및 서버 문외한이라 결국 실패하였고.. 필요시마다 하나씩만 돌려보기로 합니다;;

Docker로 설치한 소나큐브 Developer Edition도 서버가 잘 돌아감을 확인하고 역시나 Andorid 소스 환경에서 자연스럽게 gradlew sonarqube를 쳐보았습니다.

잘 분석을 하고 잘 올린거 같습니다.

한번 소나큐브 페이지에 들어가서 확인해봅니다.

http://localhost:9001/

이런.. 프로젝트 Overview부터 결과들이 안나옵니다.

몇 군데를 들락거리니 라이센스 키를 입력하라는 페이지가 뜨네요.

알고보니 Developer Edition 을 Trial 버전으로 사용하려고 해도 키를 발급받아야 했습니다.

키를 발급받기 위해 소나소스에서 시키는 대로 고분고분 폼을 작성하여 제출해봅니다.

https://www.sonarsource.com/plans-and-pricing/developer/

성심성의 껏 작성하면 고맙다고 하네요.

https://www.sonarqube.org/forms/success-developer-edition/

하지만 라이센스 키가 바로 안옵니다.

단순하게 폼 작성 후 제출하면 자동 생성해서 키를 줄거라 생각했는데, 그게 아니었습니다.

어느 정도 시간이 흐른뒤 정말 담당자에게서 메일이 왔습니다.

또 고맙다면서 이것저것 묻더군요.

  • 이전에 소나큐브를 쓰고 있었냐?
  • 소나큐브 어떤 기능에 관심이 있고 어떤 프로그래밍 언어를 스캔할거냐?
  • 사용하려는 서버가 Developer Edition이냐? Community Edition 이냐?

대략 저에게는 저 정도를 궁금해 하셨습니다. 스위스 분께서요..

암튼 구글의 도움으로 더듬더듬 영작해서 회신을 해봅니다.

Hello

I'm not...

I blabla..

I would be grateful if you could provide license.

...

구글의 힘으로 14일 후 만료되는 Developer Edition Trial 라이센스 키를 발급 받게 되었습니다.

다시 소나큐브 페이지에 들어가서 라이센스 입력화면에서 입력해봅니다.

http://localhost:9001/

잘 됩니다.

하지만 라이센스 등록 전 돌렸던 분석결과는 볼 수가 없습니다;;

새 출발하는 마음으로 새로 돌려봅니다.

gradlew sonarqube

...

잘 됩니다.

이젠 Overview도 잘 나오고 소나큐브에서 지원하는 다양한 기능을 써볼 수 있었습니다.

Community Edition 대비 Developer Edition 사용시 느낀 차이점은 가장 큰 건 지원하는 언어의 차이도 있겠지만, branch 관리도 차이가 있더군요.

gradle에 branch 속성을 설정해서 올리면 소나큐브 내에서 한 프로젝트에서 다른 brach로 관리가 가능하였습니다.

앞으로 소나큐브로 어떤 타이밍에 어떤 수준까지 고려하여 사용할지를 고민해보아야 할 것 같네요.

+) 소나큐브 가격표입니다. (2020.02.07 기준) 

Docker 정리

Docker 란?

2013년에 등장한 새로운 컨테이너 기반 가상화 도구

계층화된 파일 시스템을 사용해 가상화된 컨테이너의 변경사항을 추적 및 관리

컨테이너 특정 상태를 항상 보존해두고, 필요할 때 언제 어디서나 실행할 수 있도록 도와주는 도구


기존 가상머신

가상 머신은 격리된 환경을 구축해준다는 데서 매력적

실제 배포용으로 쓰기에는 성능 면에서 불리한 도구

운영체제 위에서 또 다른 운영체제를 통째로 돌리는 구조라 리소스를 비효율적으로 활용하게 됨

Docker

어느 플랫폼에서나 재현가능한 어플리케이션 컨테이너를 만들어주는 것을 목표함

LXC(리눅스 컨테이너)라는 개념에서 출발함으로써 특정 리눅스 배포판에서 사용 가능

가상 머신이라고 하기보다는 격리된 환경을 만들어주는 도구

컨테이너와 이미지의 차이와 Dockerfile 만든 법 등을 익히는게 중요함

Docker에서 말하는 장점들

  • 유연성 (Flexible) : 가장 복잡한 애플리케이션조차도 컨테이너화할 수 있습니다.
  • 경량 (Lightweight) : 컨테이너는 호스트 커널을 활용하고 공유합니다.
  • 교환 가능 (Interchangeable) : 업데이트 및 업그레이드를 즉시 배포 할 수 있습니다.
  • 휴대성 (Portable) : 로컬로 구축하고, 클라우드에 배치하고, 어디서나 실행할 수 있습니다.
  • 확장성 (Scalable) : 컨테이너 복제본을 늘리고 자동으로 배포 할 수 있습니다.
  • 스태킹 (Stackable) : 서비스를 세로 및 가로로 쌓을 수 있습니다.


Docker 제품군

Community Edition (CE)

Docker를 시작하고 컨테이너 기반 앱을 실험하려는 개발자 및 소규모 팀에 이상적 (무료)

두 가지 업데이트 채널을 가짐

  • Stable : 분기마다 안정적인 업데이트 제공
  • Edge : 매월 새 기능 제공

Enterprise Edition (EE)

업무용 응용 프로그램 제작, 배송 및 실행하는 엔터프라이즈 개발 및 IT팀을 위한 설계 (유료)

Docker CE와 EE 간 비교 이미지 (출처: Docker Docs, https://docs.docker.com/install/)

지원 플랫폼

Desktop

Cloud

Server

Docker EE

Docker CE

Docker 설치하기

Ubuntu의 경우 Docker CE설치시

OS requirements (18년 3월 22일 기준)

Docker CE는 아래 버전 중 하나의 64비트 버전이 필요함

  • Artful 17.10 (Docker CE 17.11 Edge and higher only)
  • Xenial 16.04 (LTS)
  • Trusty 14.04 (LTS)

Docker CE는 Ubuntu에서 x86_64armhfs390x (IBM Z), and ppc64le (IBM Power) 아키텍쳐를 지원함

(ppc64le and s390x limitations: IBM Z 및 Power 아키텍쳐 패키지는 Ubuntu Xenial 이상만 사용 가능)

Docker CE 설치

  • Docker repositories를 설정 후 설치
  • DEB 패키지 다운로드 후 수동 설치
  • 스크립트를 사용하여 설치

Docker Storage를 설정 후 설치 방법

## 패키지 업데이트
    $ sudo apt-get update
    ...
    ## HTTPS를 통해 repository를 사용할 수 있도록 패키지 설치
    $ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
    ...
    ## Docker 공식 GPG 키 추가
    ## Key fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 확인
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    $ sudo apt-key fingerprint 0EBFCD88
    pub   4096R/0EBFCD88 2017-02-22
    Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid                  Docker Release (CE deb) <docker@docker.com>
    sub   4096R/F273FCD8 2017-02-22
    ...
    ## stable repository 사용시 아래 커맨드 추가
    ## arch 값을 amd64, armhf, ppc64el, s390x 등으로 맞춰서 사용
    $ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"
    ...
    ## 패키지 업데이트
    $ sudo apt-get update
    ...
    ## 옵션 1. Docker CE 최신 버전 설치
    $ sudo apt-get install docker-ce
    ...
    ## 옵션 2. Docker CE 특정 버전 설치
    $ apt-cache madison docker-ce
    docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
    $ sudo apt-get install docker-ce=<VERSION>
    ...
    ## hello-world 이미지를 실행하여 Docker CE가 올바르게 설치되었는지 확인
    $ sudo docker run hello-world

다른 OS에서 Docker 설치

Docker 제거

Docker CE 제거

Docker CE 패키지 제거

$ sudo apt-get purge docker-ce

Image, Container, Volume, 사용자 정의 구성파일 등은 자동으로 제거 안됨.

모든 데이터를 삭제하려면 아래처럼 실행

$ sudo rm -rf /var/lib/docker

Docker Image

이미지는 추상적인 개념이며, 이미지를 기반으로 생성된 컨테이너가 실행됨

이미지는 코드, 런타임, 도서관, 환경 변수 및 구성 파일 등 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 실행 가능한 패키지

Docker Image 관련 명령어

docker images

현재 시스템에서 사용 가능한 이미지 리스트

$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    hello-world         latest              f2a91732366c        4 months ago        1.85kB

docker pull 

이 명령어를 사용하면 docker.io의 공식 저장소에서 이미지를 다운로드

공식 저장소에 있는 이미지 정보들은 https://hub.docker.com/explore/에서 확인 가능

$ docker pull ubuntu
    Pulling repository ubuntu
    04180f9bd8a6: Download complete
    1e548c932d40: Download complete
    ...

Docker Container

컨테이너는 기본적으로 리눅스에서 실행되며, 다른 컨테이너와 호스트 시스템의 커널을 공유

더 많은 메모리를 사용하지 않고 개별 프로세스를 실행하여 가볍게 만듬

Docker Container 관련 명령어

docker run

특정 이미지로 컨테이너 생성 및 실행

$ docker run -i -t ubuntu:12.04 /bin/bash
    root@8bfd70fe7392:/#

docker ps

실행 중인 컨테이너들을 출력 (전체 볼때는 docker ps -a)

$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
    0fae5858c9c0        ubuntu:12.04        /bin/bash           8 seconds ago       Up 7 seconds

    PORTS               NAMES
    sleepy_nobel

docker start <Container name/id>

생성되어 있는 컨테이너를 실행

$ docker start a37f1348c4c4
    a37f1348c4c4
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
    a37f1348c4c4        hello-world         "/hello"            25 minutes ago      Up 7 seconds

    PORTS               NAMES
    sleepy_nobel

docker stop <Container name/id>

실행 중인 컨테이너를 정지

$ docker stop a37f1348c4c4
    a37f1348c4c4
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS
    a37f1348c4c4        hello-world         "/hello"            25 minutes ago      Exited(0) 25 minutes ago

    PORTS               NAMES
    sleepy_nobel

docker exec -it <Container name/id>

실행 중인 컨테이너에 진입시

쉘이 안떠있는 컨테이너일 경우 : docker exec -it <Container name/id> /bin/bash

$ docker attach e2af613
    root@e2af61348652:/#

docker stop $(docker ps -a -q)

실행 중인 컨테이너들 전체 정지시

$ docker stop $(docker ps -a -q)
    a37f1348c4c4
    e2af6134a1s2
    ...

참고 자료

Docker 공식 문서 : https://docs.docker.com/

nacyout님의 "도커(Docker) 튜토리얼:깐 김에 배포까지" : http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/

(18년 3월 22일 기준 정리)


지인의 추천으로 아래 링크들을 보게 되었고, 공감되는 바가 많아 링크 및 개인적인 요약내용을 올려봅니다.


이 글에서 지적하는 Expert Beginner의 문제점들이 저에게서도 보이는 걸 많이 느꼈답니다.


나태해지고 정적으로 머물러 있었던 저에게 필요한 글이었던 것 같습니다.


https://medium.com/@jwyeom63/더-이상-배우려-하지-않는-개발자-expert-beginner의-등장-dd40c40aeedf


https://medium.com/@jwyeom63/소프트웨어-집단의-부패-expert-beginner의-유산-9d226b6ebde2


Novice(*역:초심자)

Advanced Beginner(*역:숙련된 초심자)

Competent(*역:실력을 갖춤)

Proficient(*역:능숙함)

Expert(*역:전문가).


무언가를 배울 때 사람은 “큰 그림을 보지 못하고 정해진 규칙만 따라가기” 에서 시작해서 “직감적으로 규칙 전반을 넘어선 큰 그림을 볼 수 있는 상태”에 도달하게 된다는 것


Advanced Beginner ----------> Competent

                                └-> Expert Beginner



10년의 경험인가 아니면 같은 경험을 10년동안 한것인가


이들이 Expert Beginner 단계로 자연스럽게 입장하는 것을 막을 수 있는 유일한 방법은 피어리뷰(peer review)와 개발자 커뮤니티와의 교류 뿐이다.


“Expert Beginner”라는 용어를 자신의 테두리가 곧 전체의 테두리라고 굳게 믿고, 지역적 최고점에 도달한 후 배움을 멈춘 개발자들을 표현하기 위해 사용했다.

자신들이 여태까지 노출되었던 환경이 곧 전체이자 유일한 방법이라고 생각할 정도로 시야가 좁다는 뜻이다.

그는 장님들만 있는 거리의 외눈박이이며, 굉장히 현실적이고 동시에 불운하게도, 지역적(local) 전문가이다. 

쉽게 성공할 수 있고, 요구되는 기준이 낮으며, 진짜 전문가들은 존재하지 않고, 경쟁도 없으며, 외부와의 교류도 없다.


Expert Beginner는 자신의 행동과 본보기로 새로운 Expert Beginner들을 만들어내고 이는 곧 Expert Beginnerism의 문화를 생성하는 것이다.


Expert Beginner들은 사실은 인격적인 문제가 없을 수도 있다. 나는 이것이 외부와 격리된 환경, 낮은 기대치, 그리고 실제로 효율성 산출이 불가능한 그저 그런 수행능력에 대한 꾸준한 보상이 만들어낸 자연스러운 결과라고 생각한다.


건강한 겸손함과 지속적으로 성장하기 위한 노력을 겸비하고, 객관적 수치들을 주관적인 고려사항들보다 우선순위에 둔다면 Expert Beginner로부터 충분히 거리를 둘 수 있을 것이다.


이 리스트는 우선적으로는 매니저와 팀 리더들을 위한 것이지만, 팀 멤버들도 충분히 이러한 변화를 일으킬 수 있다. 차이점은 한쪽은 바로 실행에 옮길 수 있고, 다른 쪽은 관리자들을 설득해야 한다는 점이다.

가능하다면, 몸소 실천해서 보여줌으로써 주도 해보라. 만약 이것이 모두 소용이 없다면, 내 개인적인 생각으로는 이미 가망이 없는 것이니 가능성이 있는 곳으로 떠나기 바란다. 


Expert Beginner는 절대로 “모르겠다”라는 답을 하지 않는다. 이는 곧 기술을 배우고 있는 사람과 자신이 이미 알건 다 안다고 생각하는 사람 사이의 중요한 차이이다.


루비앤레일즈는 기본적으로 MVC 패턴을 따르며, 이에 맞춰 웹 서비스가 가능합니다.


Cloud9 에서 프로젝트를 생성 후 간단한 페이지를 작성해 보겠습니다.


작업은 1. 프로젝트 생성 -> 2. 라우트 설정 -> 3. 컴포넌트 생성 -> 4. 컨트롤러 작성 -> 5. 뷰 작성 등으로 진행됩니다.


1. C9 프로젝트 생성


1.1 C9 로그인 후 Workspaces 에서 Create a new workspace 를 선택합니다.



1.2 Workspace 정보 입력 후 Ruby on Rails 템플릿을 선택합니다.



1.3 C9 프로젝트 생성 완료 화면입니다.



2. 환경설정


라우트에 주소규칙을 설정할 수 있습니다. config/routes.rb 파일에 아래를 참고하여 주소규칙을 작성해봅니다.

Rails.application.routes.draw do
  # get "/" => "<<컨트롤러>>#<<액션명>>" # "/" 로 접속시 <<컨트롤러>>의 <<액션명>> 실행
  # get "/" => "member#login" # "/" 로 접속시 member 컨트롤러의 login 액션 실행
  get "/member/login" => "member#login" # "/" 로 접속시 member 컨트롤러의 login 액션 실행
end


3. 컴포넌트 생성


Cloud9 bash 창에서 아래 커맨드로 컴포넌트 생성할 수 있습니다.

rails generate controller <<컴포넌트명>>  #<<컴포넌트명>> 컴포넌트 생성
rails g controller <<컴포넌트명>>  # 위와 동일
rails g controller Member   # Memeber 컴포넌트 생성


실제 컴포넌트 생성 결과입니다.

$ rails g controller Member   # Memeber 컴포넌트 생성
Running via Spring preloader in process 2371
      create  app/controllers/member_controller.rb     # 컨트롤러
      invoke  erb
      create    app/views/member                            # 뷰 경로
      invoke  test_unit
      create    test/controllers/member_controller_test.rb  # 컨트롤러 테스트
      invoke  helper
      create    app/helpers/member_helper.rb           # 헬퍼
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/member.coffee  #자바스크립트
      invoke    scss
      create      app/assets/stylesheets/member.scss   # 스타일시트


4. 컨트롤러 작성


config/routes.rb 에 작성하였던 컨트롤러에 액션을 추가해 보겠습니다.


app/controllers/member_controller.rb 에 아래과 같이 작성해 봅니다.

class MemberController < ApplicationController
  def login
  end
end


5. 뷰 작성


이제 컨트롤러의 액션에 해당하는 뷰를 작성해 보겠습니다.


app/views/member/login.html.erb 파일을 생성 후 아래와 같이 작성해 봅니다. (파일명을 액션명과 맞춰줘야 합니다.)

<h1>Log In@@@</h1>



6. 결과 보기 및 다양한 출력 방법


지금까지 프로젝트 생성 후 라우트 설정을 하였고, 컴포넌트를 생성하여 컨트롤러와 뷰를 작성하였습니다.


이제 그 결과를 확인해 볼 차례입니다.


아래 C9 Workspace에서 Run Project 를 통해 서버를 구동시켜봅니다.



그리고 서버 구동 후 아래 링크들을 열어 결과를 확인해 볼 수 있습니다.



6.1 그 결과는 아래와 같습니다.



6.2 이번에는 컨트롤러에서 직접 내용을 출력해보겠습니다.


app/controllers/member_controller.rb 에 아래과 같이 작성해 봅니다.


class MemberController < ApplicationController
  def login
    render text: "Log In!!!"  # 뷰에서 "Log In!!!" 문구 출력
  end
end

그 결과를 확인해봅니다.



6.3 이번에는 뷰 파일명을 달리하여 컨트롤러 액션에서 직접 지정하여 출력해보겠습니다.


app/views/member/test_login.html.erb 파일을 생성 후 아래와 같이 작성해 봅니다.

<h1>Log In Test@@@</h1>


그리고 app/controllers/member_controller.rb 에 아래과 같이 작성해 봅니다.

class MemberController < ApplicationController
  def login
    render "test_login" # test_login 뷰 지정
  end
end


그 결과를 확인해봅니다.



이렇게 Cloud9 과 Ruby on Rails를 통해 간단하게 페이지를 작성해 보았습니다.


MVC 패턴 중 View 와 Controll 만을 사용하여 만들어 보았습니다. 


생각보다 어렵지 않게 페이지가 만들어 지는 것을 확인할 수가 있네요.


이상 간단 시식을 마칩니다.










'IT > ETC' 카테고리의 다른 글

[SonarQube] SonarQube & Jenkins 이야기  (0) 2020.02.14
[SonarQube] SonarQube 도입기?  (0) 2020.02.07
[Docker] Docker란?  (0) 2018.03.23
Expert Beginner란...  (0) 2018.03.12

+ Recent posts