우아한테크캠프 Pro 8주차 안정적인 서비스 만들기 미션을 진행한 내용과 후기를 정리해보았습니다.
미션 저장소
https://github.com/Gyeom/infra-subway-performance
학습 내용
- HTTP 개선에 따른 차이를 이해하고 Reverse Proxy 성능 개선을 해봅니다.
- HTTP Cache 전략을 이해하여 적절한 정책을 설정해봅니다.
- 쿼리를 최적화하여 조회 성능을 개선해봅니다.
- 인덱스를 설정하여 조회 성능을 개선해봅니다.
단계별 요구사항 및 PR 리뷰
🚀 1단계 - 화면 응답 개선하기
- Reverse Proxy 개선하기
- WAS 성능 개선하기
- 부하테스트 각 시나리오의 요청시간을 목푯값 이하로 개선 개선 전 / 후를 직접 계측하여 확인
https://github.com/next-step/infra-subway-performance/pull/410
- Reverse Proxy와 WAS에 캐싱을 적용했는데 생각보다 개선효과과 미미했다.
- 부하테스트를 진행할 때는 일정 간격을 두고 점진적으로 VUser가 증가 되도록 시나리오를 구성해보자.
🚀 2단계 - 스케일 아웃 (with ASG)
- springboot에 HTTP Cache, gzip 설정하기
- Launch Template 작성하기
- Auto Scaling Group 생성하기
- Smoke, Load, Stress 테스트 후 결과를 기록
https://github.com/next-step/infra-subway-performance/pull/459
- Auto Scaling은 warm up이 있어서 구간을 보다 길게 갖고 가자.
- 시작템플릿에 redis를 띄우는 스크립트까지 포함 했다. 이렇게 되면 매 인스턴스마다 불필요하게 redis가 새로 만들어진다.
- Controller에서 HttpServletResponse 를 받은 후 직접 `Cache-Controle`을 할당하여 설정할 수도 있고, WebContentInterceptor를 활용할 수 도 있다.
- 로그인용 사용자 이름, 비밀번호 및 기타 민감한 정보들을 보호하기 위해 SSL 을 로그인 페이지나 회원 정보 페이지등은 SSL로 암호화하는 경우가 많다. SSL 을 사용해서 민감한 정보들을 보호한다고 해도 브라우저에 이 정보가 캐싱되면 문제가 발생할 수 있기 때문에 `Cache-Control: no-cache, no-store, must-revalidate` 와 같이 사용하면 브라우저 캐싱을 방지할 수 있다. 단 캐싱을 하지 않으면 성능 저하가 발생할 수 있으므로 로그인 페이지등에 제한적으로 사용해야 한다.
🚀 3단계 - 쿼리 최적화
- 활동중인(Active) 부서의 현재 부서관리자(manager) 중 연봉 상위 5위안에 드는 사람들이 최근에 각 지역별로 언제 퇴실(O)했는지 조회해보세요.
(사원번호, 이름, 연봉, 직급명, 지역, 입출입구분, 입출입시간) - 인덱스 설정을 추가하지 않고 200ms 이하로 반환합니다.
- M1의 경우엔 시간 제약사항을 달성하기 어렵습니다. 2s를 기준으로 해보시고 어렵다면, 일단 리뷰요청 부탁드려요
- 급여 테이블의 사용여부 필드는 사용하지 않습니다. 현재 근무중인지 여부는 종료일자 필드로 판단해주세요.
https://github.com/next-step/infra-subway-performance/pull/485
🚀 4단계 - 인덱스 설계
- 주어진 데이터셋을 활용하여 아래 조회 결과를 100ms 이하로 반환
- M1의 경우엔 시간 제약사항을 달성하기 어렵습니다. 2배를 기준으로 해보시고 어렵다면, 일단 리뷰요청 부탁드려요
- Coding as a Hobby 와 같은 결과를 반환하세요.
- 프로그래머별로 해당하는 병원 이름을 반환하세요. (covid.id, hospital.name)
- 프로그래밍이 취미인 학생 혹은 주니어(0-2년)들이 다닌 병원 이름을 반환하고 user.id 기준으로 정렬하세요. (covid.id, hospital.name, user.Hobby, user.DevType, user.YearsCoding)
- 서울대병원에 다닌 20대 India 환자들을 병원에 머문 기간별로 집계하세요. (covid.Stay)
- 서울대병원에 다닌 30대 환자들을 운동 횟수별로 집계하세요. (user.Exercise)
https://github.com/next-step/infra-subway-performance/pull/513
🚀 [추가] 페이징, Replication
- 페이징 쿼리 작성
- MySQL Replication with JPA
https://github.com/next-step/infra-subway-performance/pull/542
미션 회고
이번 미션에서 Auto Scaling Group을 구성하는 실습을 진행하면서 삽질을 좀 많이했다. 502 Bad Gateway가 발생해서 보니 서버가 아예 구동되지 않았고 시작템플릿의 문제임을 짐작할 수 있었다. 원인은 mac에서 업로드한 배포스크립트의 행간 문제였던것으로 파악되었다. 그 외에도 인증 관련 이슈 때문에 시간을 많이 날려먹었는데 알고보니 chain.pem을 잘못 복사해서 alb에 적용해서 발생한 이슈였다.
8주차까지 우아한테크캠프 PRO 미션을 모두 완료했다. 8주 전 보다 많은 양의 학습 지식을 습득 한 것은 분명하다. 밑 빠진 독이 되지 않기 위해서 지금까지 배운 내용들을 복습하자.
늘 초심의 마음으로.
'우아한테크캠프 PRO > 우아한테크캠프 회고록' 카테고리의 다른 글
[우아한테크캠프 Pro] 7주차 미션 후기 (레거시 코드 리팩터링) (0) | 2023.01.02 |
---|---|
[우아한테크캠프 Pro] 6주차 미션 후기 (서비스 진단하기) (0) | 2023.01.02 |
[우아한테크캠프 Pro] 5주차 미션 후기 (Subway - ATDD & 단위테스트) (0) | 2023.01.01 |
[우아한테크캠프 Pro] 3주차 미션 후기 (Subway - ATDD) (0) | 2023.01.01 |
[우아한테크캠프 Pro] 4주차 미션 후기 (그럴듯한 서비스 만들기 - AWS) (0) | 2023.01.01 |