[팀프로젝트] 2주차

 

배포자동화

애플리케이션을 개발하면서 feature 브랜치에서 develop 브랜치로 PR을 날리는 작업은 계속 될 것이다. 이때마다 서버로 접속하여 develop 브랜치의 소스를 pull 받고, build 하고 배포하는 작업을 해야 할까? 이럴 땐 배포자동화를 하면 된다.

 

젠킨스

이번 팀프로젝트에서는 배포자동화 도구로 Jenkins를 선택했다. 팀프로젝트를 시작하기 전 Jenkins를 한번 연습해 보았기도 하고 제공 되는 문서가 GitHub Actions 보다 많다.

 

또한 팀프로젝트 전 Jenkins를 연습할 때 프리티어 EC2에서 돌린적이 있었다. 지옥이었다. 배포자동화를 담당하는 서버는 어느정도 스펙를 갖추어야 한다고 한다. 이번 우테코 3기 팀프로젝트에서 medium 스펙의 EC2까지 생성할 수 있었다. 그래서 주저 없이 젠킨스를 선택했다.

 

만약 개인 프로젝트를 한다면 Github Action을 진지하게 고려해 볼 것이다.

 

CI

  • 지속적통합이라는 뜻으로 형상관리 시스템에 있는 Source파일을 읽어들여 자동으로 빌드하여 실행할 수 있는 결과물을 주기적으로 생산해주는 시스템 

젠킨스는 내가 대시보드에서 Build Now를 클릭하거나 설정한 브랜치에 push가 감지되었을 경우(ex. github-webhook) 설정한 브랜치에서 소스를 받아 빌드를 하고 jar파일을 생성한다.

 

CD 

  • 배포 자동화

위의 CI의 결과로 생성한 jar 파일은 아직 jenkins서버에 존재한다. 이를 ssh를 이용하여 내 배포서버로 전송하고, 미리 등록해둔 Shell Script를 실행 시키는 명령어를 설정하여 jar파일을 실행시킬 수 있다.

 

젠킨스에서는 내 EC2 서버를 등록해주고 해당 EC2의 어느 경로에 jar를 전송할지 설정한다. 파일이 전송된 EC2에서 실행할 명령어를 설정 할 수 있다. 여기에 쉘스크립트 실행과 같은 명령어를 설정할 수 있다.

 

https://jhleed.tistory.com/130

 

CI(Continuous Integration), CD(Continuous Delivery / Deployment)에 대해 알아보자.

웹 서비스를 개발/운영하다 보면 CI 와 CD라는 말을 자주 듣게 된다. 보통 CI 와 CD 를 묶어서 이야기하는 경우가 많아서 많은 사람들이(이전에 내가 그랬듯이) 두 개념을 종종 혼동하곤 한다. 이 포

jhleed.tistory.com

 

DB서버 구축

 

현재 팀플에서 사용하는 아웃바운드가포트는 몇가지로 한정 되어 있다. 그래서 DB서버는 8080포트로 들어온 요청을 3306으로 전달 하도록 하였다. 물론 8080포트에 Mysql을 띄울 수 있지만 3306 포트가 더 익숙해서 포트포워딩 하기로 하였다!

 

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 3306

 

외부에서 계속 접근이 안된다.. Mysql  bind address 설정

  • Mysql은 default bind adress가 127.0.0.1이다.
  • mysql.conf 파일에 접근해서 변경해 주어야 한다.

https://emong.tistory.com/235

 

aws mysql 외부접속 허용

오늘은 AWS로 만든 서버에 MySQL 서버 구축과 외부 접속을 허용해보도록 하겠습니다. [ AWS EC2 인스턴스 생성 방법은 http://luji.tistory.com/6를 참조하세요. ] 순서 1. MySQL 설치 2. 방화벽 설정 3. 외부접.

emong.tistory.com

 

그래도 안된다.. Mysql user host 설정

  • database에 user를 만들 때, host를 정해준다.
  • 해당 user는 설정된 host에서 접근할 수 있다. 

 

Jasypt

 

소셜 로그인을 구현하면서 SecretKey를 발급받게 되었다. JWT 토큰을 발행하면서 우리 자체 SecretKey도 생겼다.  주로 이런 데이터들을 application 파일에 넣어 관리하며 런타임에 사용한다. 그러나 현재 팀프로젝트의 레포지토리는 공개 레포지토리 이기 때문에 중요 데이터들이 노출될 위험이 있다. 이것을 해결하기 위해 Jasypt이라는 자바 암호화 라이브러리를 사용해서 비밀 데이터를 암호화 시키기로 하였다.

 

 

Jasypt을 도입하게 되면서 아래 사이트를 많이 방문했다. 내가 정한 Seceret Key로 데이터를 암호화 해준다. 

 

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

 

Best Programming Courses and Tutorials | DevGlan

Choose your programming language interest and we will suggest you the best courses, tutorials and blog articles from around the web that is recommended by the Programming community.

www.devglan.com

 

프로젝트에 의존성을 추가해준다.

 

  implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:2.1.2'

 

그리고 application.yml과 같은 스프링 설정 파일에 아래와 같이 추가해 준다. ENC(암호화 된 데이터) 형식으로 지정해 주면 런타임 시 복호화 된 상태로 데이터를 사용할 수 있다. @Value 또는 getProperty() 메서드를 사용하여 값을 얻을 수 있다.

 

ENC(W/isqx5Cr9Vm4dD9Zajcf4Y2bEX+ANXeIlWgw9w3Dlxs4YoJgvKcA/YkalFEgvRs0qbmrPTioTsuR/3dmYhAdG9C7qybJh+Uv9u6r96g47J6V4oLeKfjQJNlN5Nvo2miFWwUNcAs2cYvcM4dvvPnOlE9F2l12ybL)

 

 

그럼 데이터를 암호화 할 때 사용한 시크릿 키는?

-D옵션을 통해 JVM 환경변수로 등록하였다! 

 

-Djasypt.encryptor.password=pwpwpwpwpwpw

 

우리가 스프링 구동시 active 프로파일을 설정해주는 방법이랑 똑같다.

$ java -jar -Dspring.profiles.active=prod [jar파일명]

 

=>  스프링 프로퍼티에서 관리하는 값들은 모두 JVM 시스템 프로퍼티에 등록된다는 것을 깨달았다.

또한 현재 SSH로 JAR파일을 젠킨스에서 배포 EC2로 전달하는 상황인데, 혹시나 전송 도중 jar를 강탈 당하더라도 중요 데이터는 암호화 되어있지롱!

 

 

https://yangbox.tistory.com/44

 

인텔리제이 어플리케이션 외부 옵션 및 변수

인텔리제이에서 Run/Debug Configuration을 들어가면 Configuration에서 지정할 수 있는 옵션중에 다음 3가지가 있다. 스프링부트에서 프로파일을 지정하고 싶어서 spring.profiles.active=dev 옵션을 주고 싶은.

yangbox.tistory.com

https://soongjamm.tistory.com/136

 

스프링부트 profile 설정 (궁금증 해결. .properties / jvm 옵션 -Dspring/ web.xml의 init-param / System.setProperty

공부를 하면서 불편함과 해결되지 않은 궁금증이 있었다. (불편.귀찮) mysql로 개발을 하려면 매번 mysql를 켜줘야한다. 그게 귀찮아서 h2로 인메모리 db를 쓰려면 설정을 또 바꿔줘야 하는데 url, id,

soongjamm.tistory.com

 

스프링 부트 2.4부터 변경된 구성파일 처리방식

각각 dev, prod 스프링 프로필에서 암호화 된 oauth2.0키를 가진 설정파일을 include해서 사용하려고 하는데 동작하지 않았다.

정확히 말하면 application.yml의 include는 동작하는데 application-dev.yml을 -Dspring.profile.active=dev 옵션을 줘서 따로 지정하면 동작하지 않았다. 심지어 테스트 코드에 들어간 test 설정파일에 들어간 include도 동작이 안되었다. @ActiveProfile("test")

 

원인은 스프링 부트 2.4부터 application.yaml이 변경되었기 때문이었다. 새로운 yaml파일 작성방식에 대해 공부해야 겠다.

 

https://multifrontgarden.tistory.com/277

 

spring boot 2.4 application.yaml 구동방식 변경

spring boot 2.4 버전부터 애플리케이션 설정 파일( application.properties, application.yml, application.yaml ) 에 대한 구동방식이 변경됐다. 변경된 이유는 k8s 볼륨 마운트 구성때문이라고 하는데 이것에..

multifrontgarden.tistory.com

 

 

 

슬랙 야무지게 사용하기

 

Logger와 Slack의 incoming-webhook을 사용하여 서버에서 에러가 발생했을 때 Slack으로 알림을 받도록 설정하였다.

 

 

또한 젠킨스 구동 시 상태를 슬랙으로 전달 받을 수 있도록 설정하였다.

 

 

 

이렇게 설정을 해 놓으니 즉각적으로 우리 서비스의 상태가 모든 팀원 한테 공유 될 수 있어서 유용한 것 같다. 

 

 

그래서 2주차는..

나는 이번주에 개발 환경을 구성하는데 많은 시간을 보냈다. 다른 팀원이 테스트 코드를 보강하고 REST DOC를 구축하였는데 이부분은 좀 더 공부해 봐야 할 것 같다.

 

나와 페어 프로그래밍을 한 크루가 구축한 개발 환경은 아래와 같다. 이번주에 발표 담당이어서 피피티 만들겸 아래와 같이 개발환경을 도식화 해보았다. 뿌듯하다~ 그러나 아직 초보라 피드백은 언제나 환영!

 

 

댓글



Designed by JB FACTORY