이 글은 인프런 '박우빈'님의 Readable Code: 읽기 좋은 코드를 작성하는 사고법이라는 인프런 강의를 공부하며 정리한 내용이다. 가독성이 좋지 않게 짜여진 지뢰 찾기 게임 코드를 가독성 좋은 코드로 리팩토링 하며 읽기 좋은 코드를 작성하는 방법에 대해 학습한다. Readable Code: 읽기 좋은 코드를 작성하는 사고법 강의 | 박우빈 - 인프런박우빈 | 이 강의를 통해 클린 코드 원칙에 대한 깊은 이해를 하고, 객체 지향 사고 방식에 입각한 깔끔한 코드를 작성할 수 있게 됩니다. 클린 코드와 객체 지향이 궁금한 분, 코드를 정말 잘 짜www.inflearn.com 이번 강의는 SOLID 원칙에서 S에 해당하는 단일 책임 원칙(Single Responsibility Principle)에 대..
전체 글
프로그래밍 정보를 공유합니다도입 배경현재 Spring boot 프로젝트에 WAS(내장 톰캣)을 웹 서버로 사용 중이다. WAS(내장 톰캣)가 웹 서버의 역할까지 할 수 있지만, WAS는 비즈니스 로직만을 처리하고, 정적 리소스를 보여주는 부분은 Nginx가 담당하게 하여 WAS의 부하를 줄일 수 있도록 변경하려고 한다. 또한 Spring Boot 서버가 정상 작동하지 않을 경우, Nginx를 통해 사용자에게 에러 페이지를 표시함으로써 사용자 경험을 개선할 수 있을 것이다. 또한, 현재 SSL/TLS 인증서가 Spring boot에 직접 의존하고 있다. Nginx에 SSL 인증서 관리를 맡김으로써 WAS의 책임을 줄이고, 보안을 강화하고자 한다. 1. Docker Nginx 설치Nginx 이미지를 pull 해오고, 이미지가 잘 받아..
도입 배경예전에 Spring boot를 공부하며 만들었었던 암호화폐 모의투자 개인 프로젝트는 배포를 수동으로 진행 중이다. 프로젝트에 수정이 있을 때마다 빌드 & 배포 과정을 수동으로 진행하는 것에 시간이 지속적으로 투자된다. 이 과정을 자동화하여 빌드 & 배포에 소요되는 시간을 줄여서 효율적으로 개발할 수 있도록 개선해 보자. 기존 배포 방식빌드부터 배포까지 직접 수동으로 진행. 프로젝트가 잦은 수정이 있다면 이 과정을 계속 반복해야 한다. 비효율적이라고 할 수 있다.로컬 IntelliJ 에서 개발github 레포지토리에 push오라클 클라우드(Ubuntu) ssh 접속레포지토리 git clone 후 gradle 사용하여 직접 빌드빌드 후 jar 파일 -> Dockerfile 기반으로 도커 이미지 생성..
인프라 개선현재 Spring boot는 도커에서 실행되고 있지 않다. MySQL만 도커로 실행 중이고, Spring boot 서버는 서버 로컬에서 직접 jar 파일로 실행해 둔 상태이다. 배포 서버(오라클 클라우드)가 프리티어 이기 때문에 추후에 클라우드 플랫폼 자체를 변경할 가능성이 있음. 추후에 이식성, 확장성, 일관성 등을 고려하여 서버 클라우드 플랫폼을 다른 곳으로 변경하더라도 쉽게 옮길 수 있도록 도커로 실행하는 것으로 변경하겠다. 📌 MySQL 컨테이너 데이터 보존 필요현재 도커로 실행중인 MySQL이 볼륨 설정이 되어있지 않다. 이는 컨테이너가 삭제되면 내부에 데이터들이 모두 날아간다는 의미이다. 호스트 서버에 MySQL 데이터가 저장될 수 있도록 마운트 설정을 추가해야 한다. 이미 실행..
이 글은 인프런 '박우빈'님의 Readable Code: 읽기 좋은 코드를 작성하는 사고법이라는 인프런 강의를 공부하며 정리한 내용이다. 가독성이 좋지 않게 짜여진 지뢰 찾기 게임 코드를 가독성 좋은 코드로 리팩토링 하며 읽기 좋은 코드를 작성하는 방법에 대해 학습한다. Readable Code: 읽기 좋은 코드를 작성하는 사고법 강의 | 박우빈 - 인프런박우빈 | 이 강의를 통해 클린 코드 원칙에 대한 깊은 이해를 하고, 객체 지향 사고 방식에 입각한 깔끔한 코드를 작성할 수 있게 됩니다. 클린 코드와 객체 지향이 궁금한 분, 코드를 정말 잘 짜www.inflearn.com 왜? 읽기 좋은 코드를 작성해야 하는가읽기 좋은 코드를 작성하는 이유는 '가독성' 때문이다. 모든 코드는 지속적으로 관리되어야 ..
이제 거의 실전 프로젝트가 마무리되어간다. 저번엔 Redis를 활용하여 수강신청의 성능을 개선해 봤는데, 이번에는 ORM에서 자주 발생하는 N+1 문제를 개선하였다. 문제가 발생하는 부분을 확인하고, 개선하는 작업을 진행하였다. ✔️ N+1 문제 발생우리 프로젝트에서 N+1이 발생한 부분은 장바구니 페이지를 조회할 때 발생했다. 페이지 조회 시, 과목 정보에 대한 쿼리가 여러 번 요청되는 것을 확인하였다. 💬 원인 분석장바구니 페이지에서 N+1 문제가 발생하는 원인을 찾아보자. RegisteredSubjectRepository에서, findAllByStudentId() 메서드로 학생이 장바구니에 담은 과목들의 정보를 Spring Data JPA의 쿼리메서드로 불러오도록 되어있다. [ Register..
실전 프로젝트 4주 차에 돌입하며, Redis를 활용해 성능 개선을 진행했다. 이전에 동시성 문제를 비관적 락으로 해결했는데, 응답 속도를 개선할 수 있는 방법이 없을지 찾아보다가 빠른 I/O가 장점인 Redis를 활용한 개선을 해보면 어떨까 하는 생각에 적용하게 되었다. Redis 도입 이유 우리 프로젝트는 '수강신청'이다. 과목마다 수강신청이 가능한 인원은 제한적이다. 100명의 제한 인원이 이미 모두 신청해서 잔여석이 0명 일 때 에는 '수강신청 가능 인원이 마감되었습니다.' 라는 응답을 보내준다. 이 응답을 굳이 비즈니스 로직으로 들어와서 MySQL에서 남은 잔여석을 확인하지 않고, Redis를 활용하여 남은 수강인원이 0명일 경우에 바로 응답을 보내 주도록 하면 응답 속도를 개선할 수 있을 것이..
항해99 실전 프로젝트 3주차를 진행하며 발생한 동시성 문제 및 해결 과정을 작성해보려고 한다. 우리팀의 프로젝트 주제는 '수강신청' 이다. 많은 트래픽이 몰리는 상황에서 수강신청 시 발생할 수 있는 동시성 문제에 관한 글이다. ✔️ 수강신청 동시성 문제 발생 우리 프로젝트에서 동시성 문제는 모두 동시에 요청할 수 있는 '수강신청' 부분에서 발생하였다. Jmeter를 통해 테스트를 진행하여, 동시성 문제가 발생하는 것을 확인했다. 우리 프로젝트는 '수강신청' 전에 해당 강의를 장바구니에 담아두어야 한다. 그래서 테스트를 위한 회원 정보 및 장바구니 정보는 미리 담아둔 상태에서 수강신청에 대한 테스트를 진행했다. 💡 설정 조건 MySQL 데이터 수강 신청 테스트를 위한 로컬 MySQL에 데이터 설정을 했다..
실전 프로젝트 2주 차를 진행 중이다. 실전 프로젝트 최종 발표는 5월 7일이다. 한 달 남짓 남은 시점에서 어떤 것이 진행됐는지, 추후 어떤 걸 진행할 것 인지 정리해보려고 한다. ✔️ 기술 선택 이유 정리 CI/CD - Github Actions vs Jenkins Jenkins와 비교하면 Github Actions는 별도의 CI 서버가 필요 없다. Github의 호스팅 서버를 이용하여 프로젝트 빌드가 이뤄진다. 별도의 CI 서버를 관리하는 부담이 줄어드는 장점이 있다. 또한 사용 중인 Github에서 사용할 수 있는 접근성의 장점이 존재하여 Github Actions로 진행하게 되었다. 모니터링 - Prometheus + Grafana Spring boot 프로젝트의 actuator 를 활성화하여 ..