미리보기
기본 정보
테스트 코드를 중요하게 생각하며, 테스트 코드를 꼼꼼하게 작성하고자 노력합니다. 꾸준함의 가치를 알기에 1일 1커밋을 실천하려고 노력하며, 배운 것들을 기록하고 있습니다. 팀의 성공을 우선시하며, 프로젝트 성공에 이바지하기 위해 노력합니다.
프로젝트
우리 이거 삭제하지 말자
데브코스 / 프로그래머스
2023.10. ~ 2023.12.
연인간 데이트 했던 장소에 대해서 기록을 해 특정 장소에 대한 기록을 할 수 있는 서비스입니다.
사용 기술
- 개발 : Java 17, Spring Boot 3.1, JPA, Querydsl, caffeine, JWT
- 데이터베이스 : MySQL, flyway
- 인프라 : AWS EC2, AWS RDS, AWS S3, AWS CodeDeploy, Nginx, Github Actions, Jacoco
- 모니터링 : Spring Actuator, Prometheus, Grafana
- 테스트 : Junit5, Mockito, ArchUnit, Ngrinder
개발 주요 사항
- Jacoco와 Github Actions를 통한 CI/CD 적용으로 빠른 배포주기 달성 및 코드 에러율 감소 달성
- Git-flow 전략 도입을 통한 효율적인 협업 프로세스 구축 및 프로젝트 배포 주기 단축
- 애플리케이션 튜닝을 통해 기존 TPS 대비 12배 증가 (12.8 -> 368.7) 및 에러율 감소 (4.4% -> 0.0%)
- 다이어리 조회 관련 API의 경우 Covering Index를 적용 해 기존 SQL 대비 실행시간 90% 감소
- Spring Event를 사용해 클래스간 결합도 감소시키고 관심사를 분리함으로써 유지보수성 향상
- 비동기 처리를 통한 사랑의 온도 증가 로직의 응답 속도 개선
- 사랑의 온도 증가 로직의 경우 동시성 이슈를 고려해 낙관적 락 적용
- 충돌이 일어날 경우 비동기적으로 재시도 처리하도록 구현하여 응답 속도 개선
- 259개의 테스트 코드 작성, 83.6% Coverage 달성
- 추상 클래스를 활용해 테스트 환경 통합, 기존 테스트 수행 시간 대비 10초 감소 (60초 -> 50초)
- ArchUnit 테스트 도입을 통한 통일된 아키텍처 구조 유지
- Grafana를 사용한 알림제도를 도입해 warn 및 error 로그 발생 시 알림을 받아 문제 발생 시 빠르게 대응
개발 고민 사항
- 같은 클래스 내 다른 변경주기를 가진 메서드의 코드 분리
- Command 메서드에 비해 Query 메서드의 경우 매우 짧은 변경 주기를 가짐
- Command와 Query 관련 로직 분리를 통한 가독성 및 유지보수성 증대
- EC2 실행 시 애플리케이션 자동 실행 구현
- EC2 활성시간 (09 : 00 ~ 23 : 00)에 따라 매일 애플리케이션을 수동으로 실행해야 하는 불편함 발생
- systemd 유닛 파일을 작성해 EC2가 실행 될 때 자동으로 애플리케이션이 실행되도록 구현
- 데이터베이스 마이그레이션의 자동화
- 데이터베이스의 스키마가 변경 될 때 마다 수동으로 MySQL에서 업데이트 쿼리를 적용하는 불편함 발생
- flyway를 사용한 마이그레이션 자동화를 통해 불필요한 리소스 감축
삼삼오오(3355)
항해 99 / 이노베이션 캠프 강원
2022.09. ~ 2022.10.
같은 취향 혹은 목적을 가진 사람들이 모임을 할 수 있도록 도와주는 서비스입니다.
사용 기술
- 개발 : Java 11, Spring Boot 2.7, JPA, Querydsl, JWT, WebSocket, SseEmitter
- 데이터베이스 : MySQL
- 인프라 : AWS EC2, AWS RDS, AWS S3, AWS CodeDeploy, Nginx, Github Actions
- 테스트 : Junit5, Jmeter
개발 주요 사항
- WebSocket 및 STOMP를 사용한 실시간 채팅 구현
- 악성 게시글 및 댓글에 대한 신고 및 서비스 이용 제한 기능 구현을 통해 악성 유저사용 제재
- SseEmitter를 사용한 실시간 알림 서비스 기능 구현
- 장애 해결
- Hikari Connection Pool 응답 지연
- Proxy 객체 관련 이슈 (LazyInitializationException)
- Nginx 도입 후 발생한 기능 장애 해결
개발 고민 사항
- 모집 게시글 상태 업데이트 로직 처리
- 사용량이 적은 시간에 Scheduler를 사용해 모집 인원에 따른 게시글 상태 업데이트 로직 구현 (성사 / 마감)
- 회원 탈퇴시 회원의 개인 정보는 어떻게 관리해야하는가?
- 탈퇴한 회원이 주최한 모임은 닫히도록 처리하였으며, 개인정보는 별도의 테이블에 보관
- Scheduler를 사용해 탈퇴 후 특정 기간이 지났을 때 개인정보들을 파기하도록 구현
기술 스택
Java, Spring Boot, JPA, querydsl, AWS, nginx, Jenkins, github-actions, Git, Slack, IntelliJ IDEA
포트폴리오
교육
프로그래머스
사설 교육 | 클라우드 기반 백엔드 엔지니어링 데브코스
2023.06. ~ 2023.12. | 졸업
이노베이션 캠프 강원
사설 교육 | 항해 99
2022.08. ~ 2022.11. | 졸업
연세대학교
대학원(석사) | 환경공학과
2020.03. ~ 2022.08. | 졸업
연세대학교
대학교(학사) | 환경공학과
2014.04. ~ 2020.03. | 졸업
대외활동
Computer Science Study
프로그래머스
프로그래머스에서 진행하는 데브코스 수료생들과 함께 Computer Science 공부를 위해
팀스터디를 진행하고 있습니다. [Github]
외국어
영어
일상 회화 가능
자기소개
개발자를 선택하게 된 이유
대학원 재학 당시 CFD(전산유체역학) 프로그램과 머신러닝을 접목하여 연구를 진행했습니다.
해당 연구에서 머신러닝 모델을 학습시키기 위해 진행되는 일련의 과정들
(분산된 csv 데이터 수집 -> 정규화 진행 -> (train / test) set 분리 -> 학습 -> 학습 모델 저장 및 결과 가시화)
을 코드로 구현 할 수 있다는 것이 흥미로웠고 이를 계기로 프로그래밍에 큰 재미를 느끼게 되었습니다.
첫 부트캠프 과정(항해99)을 밟아나가며 java에 대한 기초 지식을 배우고 팀 프로젝트를 진행했을 때 주어진 문제에 대해 코드로 풀어나가는 것에 큰 흥미를 느끼며 좋아한다는 것을 깨달았습니다.
현재 사용하고 있는 Java 언어와 Spring 프레임워크에 대해 제대로 이해하기 위하여 책 및 인터넷 강의를 통해 기본 개념 습득 및 체득을 해오고 있습니다. 또한 전공자와 비슷한 기본 지식을 겸비하기 위해 자료구조, 네트워크, 운영체제, 데이터베이스에 대해 개인 및 그룹 스터디를 통해 꾸준히 공부하고 있습니다.
기억에 남는 개발 프로젝트
KREAM 서비스를 클론코딩을 했던 프로젝트가 가장 기억에 남습니다.
해당 프로젝트에서 저희가 중점적으로 생각한 목표는 협업, 입찰 도메인에 대한 이해였습니다.
당시 팀원들 모두 입찰 도메인에 대해 중요하게 생각을 하여 도메인 분담 시 입찰 도메인의 기능을 판매입찰과 구매입찰로 나누어 두 명의 팀원이 개발을 진행했습니다. 하나의 도메인을 분리하여 개발을 진행하다 보니 불필요한 Table 생성 및 생산성 저하의 문제가 발생했습니다.
팀원들과 3시간의 토론 끝에, 2주동안 개발해 온 코드들을 모두 들어내고 입찰 도메인을 통합한 뒤 새로운 도메인을 추가한 뒤 역할을 재분배하여 개발을 진행했습니다. 역할 재분배 후 팀의 전체적인 생산성이 증가하는 경험을 하였습니다.
이러한 경험을 통해 팀 단위로 개발을 할 때 어떠한 기준으로 역할 분담을 해야 하는지 깨달을 수 있던 프로젝트였기에 가장 기억에 남습니다.
개발 프로젝트 진행 시 주요 담당 역할
프로젝트 시 주로 팀을 이끄는 역할을 맡았습니다.
가장 최근 프로젝트에서는 제가 의견을 낸 주제로 선정되어 Project Leader 겸 Backend Leader 역할을 맡았습니다.
프로젝트의 방향성에 대해 다양한 의견을 냄과 동시에, 팀원들의 새로운 의견들을 수렴하여 개발 목표를 설정했습니다. 또한 팀원들 간의 편안한 분위기를 만들기 위해 서로 아이스브레이킹을 할 수 있는 시간들을 만들었습니다.
빠른 개발프로세스를 갖기 위해 매일 오후 1시에 백엔드, 프론트 팀원들이 모여 진행할 개발 사항들에 대해 공유하며 의견을 나누는 시간을 가졌으며, 추가적인 요청사항에 대해서는 Slack 및 Notion을 활용해 요청사항을 적어두고 공유하는 방식으로 개발을 진행했습니다. 추가적으로 백엔드 팀원들 간에는 Code Review 기반으로 한 PR merge, 새로운 기술 도입 시 팀원 간 회의를 진행하여 서로 개발 사항에 대해 이해를 할 수 있도록 규칙을 세웠습니다.
내가 생각하는 좋은 코드란
제가 생각하는 좋은 코드란 명확한 책임을 가진 객체들이 서로 협력을 통해 동작을 하는 코드라고 생각합니다.
객체가 여러가지의 책임을 지닌다면 객체가 어떤 일을 하는지 명확히 알기 어렵고, 리팩토링 시 많은 부분들이 얽혀있어 잘못된 리팩토링을 할 수 있는 여지가 있다고 생각합니다. 이에 반해 객체가 하나의 책임을 지닌다면 객체의 역할을 명확하게 알 수 있고, 단위 테스트를 통해 행위 검증을 하기 쉬우며, 추후 리팩토링시에도 변경 부분이 작기 때문에 리팩토링이 쉬워지는 장점이 존재한다고 생각합니다.
다른 사람과 구별되는 나만의 강점
맡은 일들을 정해진 기한 내에 끝낼 수 있습니다.
항해99 과정 중 최종 프로젝트 때 프론트 개발자 3명, 백엔드 개발자 3명이 팀을 이루어 프로젝트를 진행하게 되었습니다.
프로젝트 주제 선정 중, 백엔드 팀원 한명이 개인적인 이유로 빠지게 되었습니다. 멘토님이 프로젝트 수행 목록을 보고 다 할 수 있을지 걱정을 하셨습니다. 남은 백엔드 팀원과 의견조율 후 빠진 팀원의 몫의 대부분을 제가 맡는 형식으로 진행했습니다. 결국 프로젝트 마감 기한 내에 처음 목표량을 그대로 수행해 냈습니다.
테스트 코드를 중요하게 생각합니다.
기능 개발 및 리팩토링을 하며 놓칠 수 있는 예외 발생 케이스들을 테스트 코드를 통해 방지할 수 있다고 생각합니다. 그렇기에 평소 테스트 코드 짜는 것에 대해 많은 고민을 하고, 개발하는 코드에 대해 테스트 코드를 최대한 작성하려고 노력해오고 있습니다.
성격의 장점과 단점
장점
팀의 성공을 위해 최선을 다합니다
프로젝트를 진행하며 맡은 일에 대해서만 일을 하는 것이 아닌 주변 팀원들이 어려워하는 부분을 같이 고민하고 해결하고자 합니다. 일례로 프로젝트를 하며 github의 사용법을 잘 모르는 팀원을 위해 화면공유를 통해 3시간 정도 가르쳐준 적이 있습니다. 또한 Github Actions를 사용해보지 않은 팀원을 위해 블로그에 글을 작성해 CI / CD 관련해 hands on session을 작성한 적이 있습니다.
긍정적인 마인드로 일에 임합니다
모든 일에 있어 부정적인 상황이 와도 긍정적인 마인드로 일에 임합니다. 마감기한이 1달인 KREAM 클론 코딩 프로젝트에서 2주간 했던 작업량을 지우고 새로 출발해야 하는 상황이 있었는데, 그 당시 팀원들의 걱정이 많았습니다. 팀원들에게 현재의 상황이 변했으니 충분히 할 수 있다고 다독였고, 팀원들도 긍정적인 영향을 받아 별 무리 없이 프로젝트를 마감했던 경험이 있습니다.
단점
조심성 많습니다
프로젝트를 진행하며 Pull Request를 올리기 전 잘못 된 부분들이 없는지, 테스트 코드를 짜지 코드는 없는지 등등에 대해 조심성이 많아 Pull Request를 올리기 전 코드를 세 번에서 다섯 번은 더 검토했습니다. 그러다 보니 PR을 올리는 데에 시간이 많이 드는 것을 확인할 수 있었습니다. 이러한 단점을 고치고자, Pull Request를 올리기 전 체계를 잡고 코드를 다시 확인한 뒤에 올리는 방식으로 노력하고 있으며 초기 소요 시간 대비 많은 시간이 줄은 것을 확인할 수 있었습니다.