스프링부트로 웹 서비스 출시하기 7일차

박세건·2023년 8월 25일
0

/profile 로 접근해서 profile이 잘 나오는지 확인하자!

ProfileController를 만들어주고 해당 기능이 문제가 없는지 테스트를 만들어놓은 후에 commit&push를 하니

com.example.board_project.ProfileControllerTest > profile은_인증없이_호출된다 FAILED
    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:98
        Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1804
            Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421
                Caused by: org.hibernate.exception.JDBCConnectionException at SQLStateConversionDelegate.java:112
                    Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:175
                        Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2
                            Caused by: java.net.ConnectException at PlainSocketImpl.java:-2

알고보니 build.gradle에서

tasks.named('test') {
	useJUnitPlatform()
}

이부분이 주석처리되어있었다 이전에 테스트가 아무것도 없을때 켜놓으니 문제가 발생해서 주석처리 해놓았던것을 잊어버렸다.....
주석처리를 풀어주고 진행하니

정상적으로 빌드가 됐고 s3와 codedeploy에게도 전달이되었고 프로젝트가 성공적으로 배포가 되었다.

real1, real2 profile 생성

현재 EC2환경에서 실행되는 profile값은 default입니다. 이 profile은 travis CI 배포 자동화를 위한 profile이니 무중단 배포를 위해 profile 2개를 생성해줍니다.

NGINX 설정 수정

배포때마다 엔진엑스의 프록시 설정(스프링 부트로 요청을 보내는)이 순식간에 교체됩니다. 프록시 설정이 교체될 수 있도록 설정을 추가해보자.

nginx.conf를 수정하다가 실수로 내용의 반절정도가 사라지고 저장되었다.
이를 복구하는 방법을 찾다가 결국 방법을 발견하지못하고 nginx를 전체 삭제시키고 다시 설치했다...

재설치 후 nginx.conf 수정

&service_url은 include된 service-url.inc 에서 갖고온다.
service-url.inc 내용

배포 스크립트 작성

무중단 배포 스크립트는 기능별로 총 5개로 구분한다.

  • stop.sh : 엔진엑스에 연결되어있지 않지만, 실행중이던 스프링 부트 종료(대기하고있는 스프링 부트)
  • start.sh : 배포할 신규 버전 스프링 부트 프로젝트를 stop.sh로 종료한 'profile'로 실행
  • health.sh : start.sh 로 실행시킨 프로젝트가 정상적인지 확인
  • switch.sh : 엔진엑스가 바라보는 스프링 부트를 최신 버전으로 변경
    (대기하고있었던 스프링 부트와 교환)
  • profile.sh : 앞선 4개 스크립트 파일에서 공용으로 사용할 profile과 포트 체크 로직

각각의 코드와 설명은 깃허브에 있습니다!

Springboot의 Actuator

진행중에 health.sh 에서 사용하는 Actuator 라는 springboot의 강력한 기능을 알게되었다.
기능 :
SpringBoot 어플리케이션의 상태를 실시간으로 확인할 수 있다.
현재 Context에 등록된 Bean 확인, 사용중인 Heap 사이즈, 최근 요청한 HTTP 상태 등등 관련한 모든 정보를 볼 수 있다.

속성값

이 속성값들을 사용해서

이렇게 정보를 확인할 수 있다!!

이 능력을 활용해서
health.sh 를 보면

  RESPONSE=$(curl -s http://localhost:${IDLE_PORT}/profile)
#   #/health의 결과는 {"status":"UP"}와 같이 나옵니다.
#이는 저희가 처음에 추가한 org.springframework.boot:spring-boot-starter-actuator 의존성 덕분입니다.
  UP_COUNT=$(echo ${RESPONSE} | grep 'real' | wc -l)

이렇게 응용할 수가 있습니다!!

최대한 천천히 이해하면서 쉘 스크립트를 작성했지만 아직 많이 부족한 것 같다.
일단 진행이 중요하니 문제없이 진행된후 천천히 다시 공부하자

이제 모든 스크립트를 작성하고 배포 테스트를 진행해보자!!

profile
멋있는 사람 - 일단 하자

0개의 댓글