본문 바로가기

부트캠프 일지

부트캠프 47일차 후기

오늘 CodeKata는 2문제를 풀었고, 오랜만에 CodeKata를 통해서 Kotlin 문법을 하나 배웠다.

발단은 이렇다. 문제를 푸는 와중에 String Array 중 하나의 원소 중 일부를 수정해야만 했다.

즉, arr이란 String Array를 arr[i][j] = 'c' 이런 식으로 바꿔야만 했다. 이전에 배웠다시피 Kotlin에서는 string이 immutable하기 때문에 일부를 바꿀 순 없기 때문에, stringbuilder의 힘을 빌려야했다. 그렇게 이렇게 코드를 구성하였다.

val builder = StringBuilder(now[i]).apply { this[j] = turn }
val nxt = now.apply {this[i] = builder.toString()}

하지만, 문제가 발생했다. 위의 코드는 for문 안에 있는 코드인데,  첫 루프의 영향을 다음 루프가 영향을 받은 것이다. 그러니까, 나는 now를 복사한 nxt만 수정을 하고 싶었는데, now도 수정을 해버리게 된 것이다. 물론 이것은 내가 apply를 잘못 사용한 거다. 그렇지만 여기서 나는 now의 깊은 복사를 하는 방법을 찾아봤다. 그리고, copyOf를 사용하면, 깊은 복사를 할 수 있다는 것을 알게 되었다.

 

그렇게 사용을 해본 결과, 

val builder = StringBuilder(now[i]).apply { this[j] = turn }
val nxt = now.copyOf().apply {this[i] = builder.toString()}

위의 코드로 수정을 하였고, 정답을 얻게 되었다.

 

이어서 강의를 듣게 되었는데, Github Action을 활용한 CI/CD 파이프라인을 배웠다. 자동화된 CI/CD를 하기 위해선 .github에 YAML 파일을 저장해야한다. YAML 파일은 YAML Ain't Markup Language의 준말로, 설정을 관리하기 위해 사용하는 언어이다. 키와 값으로 이루어졌고, 사람이 이해 가능한 텍스트 언어로써, 자주 사용된다.

 

이런 설정파일을 통해 Git에서 branch를 Pull Request를 하거나 push를 하는 event가 trigger가 되었을 때, 자동적으로 해당 코드를 테스팅하고, 이 코드를 받아들일지를 결정한다. 실패하면 github와 연결된 이메일 주소로 메일이 온다.

 

밑의 코드는 강의자료에서 가져온 develop 브랜치나, "feature/"로 시작하는 브랜치가 푸쉬되었거나, develop 브랜치로 pull request를 되었을 때, 자동으로 테스트 해주는 YAML이다.

 

# Actions 이름 github 페이지에서 볼 수 있다.
name: Run Test

# Event Trigger 특정 액션 (Push, Pull_Request)등이 명시한 Branch에서 일어나면 동작을 수행한다.
on: 
    push:
        # 배열로 여러 브랜치를 넣을 수 있다.
        branches: [ develop, feature/* ]
    # github pull request 생성시
    pull_request:
        branches: 
            - develop # -로 여러 브랜치를 명시하는 것도 가능

    # 실제 어떤 작업을 실행할지에 대한 명시
jobs:
  build:
  # 스크립트 실행 환경 (OS)
  # 배열로 선언시 개수 만큼 반복해서 실행한다. ( 예제 : 1번 실행)
    runs-on: [ ubuntu-latest ] 

    # 실제 실행 스크립트
    steps: 
      # uses는 github actions에서 제공하는 플러그인을 실행.(git checkout 실행)
      - name: checkout
        uses: actions/checkout@v4

      # with은 plugin 파라미터 입니다. (java 17버전 셋업)
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt' # See 'Supported distributions' for available options
          java-version: '17'

      - name: make executable gradlew
        run: chmod +x ./gradlew

      # run은 사용자 지정 스크립트 실행
      - name: run unittest
        run: |
          ./gradlew clean test

위의 코드는 ubuntu 환경에서, 위에서 언급한 조건이 발생한다면, 자동으로 해당 파일의 접근 권한이 없으면 권한을 수정하고, JAVA17 환경에서, test 폴더에 있는 test를 실행해서 통과가 되는지 확인해준다. pull request의 경우, test를 통과하지 않으면 merge를 할 수 없다.

 

앞으로 프로젝트를 진행할 때, 협업에서 유용하게 사용할 수 있을 것 같으니 기억해두도록 하자.

이와 마찬가지로 CD도 자동적으로 할 수 있다는 것을 배웠다. CD는 Cloudtype을 통해 간단하게 배웠다. 이 과정을 거치려면 cloudtype의 토큰과 github의 토큰이 필요하고, 이것을 github repository 환경변수로써 저장을 해서 YAML 파일에서 사용한다. 밑의 코드 또한 강의자료에 수록된 CD 코드이다.

name: Deploy to cloudtype
on:
  workflow_dispatch:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Connect deploy key
        uses: cloudtype-github-actions/connect@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          ghtoken: ${{ secrets.GHP_TOKEN }}
      - name: Deploy
        uses: cloudtype-github-actions/deploy@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          project: nbc.docker/cicd
          stage: main
          yaml: |
            name: cicd
            app: java@17
            options:
              ports: 8080
            context:
              git:
                url: git@github.com:${{ github.repository }}.git
                ref: ${{ github.ref }}
              preset: java-springboot

위의 코드는 main 브랜치를 자동으로 배포해준다. 이것도 기억을 해두자.

 

 

오늘은 일단 여기까지, 내일도 마저 강의를 듣고, 이전에 듣지 못했던 redis에 대해서도 공부해보자.

'부트캠프 일지' 카테고리의 다른 글

부트캠프 49일차 후기  (1) 2024.02.05
부트캠프 48일차 일지  (1) 2024.02.02
부트캠프 46일차 후기  (0) 2024.01.31
부트캠프 44일차 후기  (1) 2024.01.29
부트캠프 43일차 후기  (0) 2024.01.26