미리보기
- 직업
- 백엔드 개발자
- 이름
- 김영명
- 간단소개
- 깊이 있고 지속적으로 성장하는 백엔드 개발자가 되기 위해 고민하는 것을 좋아합니다. CS, 알고리즘으로 기본기를 탄탄히 다지고, 빠르게 변화하며 무수히 새로 생기는 기술들은 지속적인 학습을 통해 머릿속에 Indexing하여 필요시 현업에서 적용할 수 있도록 해야 한다고 생각합니다. 최근에는 팀 프로젝트를 통해 학습한 내용들을 체득하고 현업에서 필수인 협업 능력을 키운 경험이 있습니다. 개발에 대한 학습 외에도 팀원들과의 원활한 커뮤니케이션을 위한 설계와 코드 작성을 위해 노력하는 것도 좋아합니다. 단순한 CRUD를 넘어서 실제 서비스에 사용되는 복잡한 로직을 설계하며 시스템의 성능을 최적화하고 개선하는 것을 좋아합니다. API, 로직을 작성할 때 어떻게 하면 DB에 날아가는 쿼리의 개수를 줄일 수 있을지, 요청에 대한 응답 속도가 빨라질 수 있을지 등 고민하고 기술 선택에 따른 trade-off를 이해하여 상황에 맞는 best-practice를 선택하려고 노력합니다.
기술 스택
- 기술 스택
- Java
- Spring Boot
- Spring Security
- MySQL
- querydsl
- JPA
- Redis
- AWS
- Docker
- nginx
프로젝트
- 프로젝트명
- 모아밤 (모두의 아침과 밤)
- 소속/기관명
- Mobam
- 프로젝트 기간
- 2023.10. - 2023.12.
- (3개월)
- 프로젝트 설명
그룹 + 보상이라는 시스템으로 루틴을 실천할 수 있도록 도와주는 서비스입니다.
Java, Spring Boot, Spring Data JPA, MySQL, Querydsl, JWT, Redis, AWS, Docker, Nginx, Jacoco, SonarCloud, Scouter
방, 참여자, 루틴 인증 및 이미지 업로드 관련 기능 등 서비스의 핵심이 되는 기능을 담당하여 Spring Boot를 통해 API 개발.
Docker와 Github Actions를 이용하여 CI/CD Pipeline을 구축하여 반복되는 통합 배포 작업을 자동화함.
AWS 인프라는 효율적인 설계, 보안을 고민하며 구축. VPC 내에 개발/운영 EC2 인스턴스를 각각 다른 public subnet으로, RDS는 private subnet에 추가하여 게이트웨이가 아닌 EC2로만 접근 가능하도록 설계.
Java AWT의 이미지 스케일링 알고리즘을 이용하여 이미지 리사이징 비즈니스 로직을 구현, 기존 파일 크기에서 80% 축소된 이미지를 저장하도록 함.
비관적 락을 이용하여 방 입장, 루틴 인증 시 발생할 수 있는 동시성 문제를 해결. java.util.concurrent 패키지를 통해 여러 스레드를 이용한 단위 테스트 코드를 작성하여 문제 해결을 확인.
코드를 수정하고 재배포할 때 빌드 중 서비스를 중단하지 않도록 하기 위해 reverse proxy로 Nginx의 upstream을 설정하여 Blue-Green 무중단 배포를 실시.
최초 배포 이후 MySQL의 Full-Text Search를 적용하여 기존 full table scan에서 index scan을 할 수 있도록 옵티마이저를 유도하여 검색 속도를 28.9% 향상 (10만 데이터 기준, 평균 152 ms-> 108 ms).
SonarCloud, Jacoco, checkstyle을 적용하여 PR당 coverage 80% 이상의 테스트 코드와 팀의 코드 컨벤션을 강제하였으며 그 결과 프로젝트에서 전체 447개의 테스트 코드가 작성되었음.
Logback, Slack을 연동하여 에러 메시지를 실시간으로 확인 할 수 있도록 적용.
서버 모니터링와 부하 테스트를 위해 Scouter(APM)를 설치, 구축.
Github: https://github.com/team-moabam/moabam-BE
Link: www.moabam.com
BE: 5명, FE: 4명
- 프로젝트명
- JTOON (네이버 웹툰 클론 코딩)
- 소속/기관명
- 데브코스
- 프로젝트 기간
- 2023.08. - 2023.09.
- (2개월)
- 프로젝트 설명
네이버 웹툰을 클론 코딩한 팀 프로젝트 입니다. 특히, Multi Module을 적용해보면서 아키텍쳐에 대한 고민과 학습에 중점을 두었습니다.
Java, Spring Boot, Spring Data JPA, Spring Security, MySql, Querydsl, Redis, Oauth 2.0, JWT, Google SMTP, Docker, AWS, Nginx, Docker
멀티 모듈 환경 세팅과 회원 도메인을 담당하여 개발.
module-application: 독립적으로 실행 가능한 계층으로 하위 모듈을 조립하여 서비스 비즈니스 완성
module-domain: 핵심 도메인을 다루는 모듈로, 각 도메인 마다 하나의 모듈로 구성
module-internal: 저장소, 도메인 이외에 시스템 전체적인 기능을 지원하기 위한 모듈
module-core: 순수 Java Class를 정의하여 시스템 내 모든 모듈이 의존할 수 있는 모듈
옆에서 보는 Layered Architecture의 시점이 아닌, 위에서 바라보는 다른 시점으로 애플리케이션을 바라보고 설계.
최상위 모듈과 하위 모듈간의 순환 참조가 발생하여 해당 클래스에 인터페이스를 적용 후 DI(Dependency Inversion)으로 해결.
Authentication Filter를 제작, Spring Security와 함께 적용하여 Oauth 2.0(Naver), JWT 기반 로그인 기능을 구현.
TTL, 높은 빈도의 호출, 보안을 위해 Redis에 refresh token을 저장하는 방식을 선택.
Google SMTP를 이용하여 회원 가입 시 이메일 인증을 진행하도록 구현.
Github: https://github.com/ymkim97/BE-04-JTOON
BE: 5명
포트폴리오
교육
- 소속/기관
- 세종대학교
- 종류 | 전공명/전공계열
- 대학교(학사) | 컴퓨터공학과
- 재학 기간 (재학 상태)
- 2017.02. - 2024.02. (졸업)
- 소속/기관
- 프로그래머스
- 종류 | 전공명/전공계열
- 사설 교육 | 백엔드 데브코스 4기
- 재학 기간 (재학 상태)
- 2023.06. - 2023.12. (졸업)
대외활동
- 활동명
- 프로그래머스 백엔드 데브코스 4기
- 소속/기관
- 그렙
- 활동 연도
- 2023
- 활동 상세 설명
Java와 Spring을 중심으로 자기 주도적인 학습을 통해 과제를 진행하였습니다.
데일리 스크럼, 페어 프로그래밍, 팀 프로젝트, 코드 리뷰를 통해 협업심을 키웠습니다.
현업 개발자의 지속적인 멘토링을 통해 실무에 대한 궁금증을 풀어 나가고 학습 방향을 잡았습니다.
팀원들과 디자인 패턴, CS와 같은 정기적인 스터디를 진행하였습니다.
최종 프로젝트 16개 팀에서 기획, 협업, 개발 우수 중 개발 우수상을 수여했습니다.
프로그래머스에서 주관하는 백엔드 교육 과정
자격증
- 자격증명
- TOEIC
- 점수/급 | 발급 기관
- 960 | 한국TOEIC위원회
- 취득월
- 2022.11
외국어
자기소개
- 자기소개
“개발자"의 정의를 고민하며 성장
저에게는 “사람들의 일상에 스며든 서비스” 를 개발하는 궁극적인 목표가 있습니다. 이 목표를 달성하기 위해 대규모 트래픽을 감당할 수 있는 아키텍처를 설계하고, 서비스의 핵심 로직을 직접 작성할 수 있는 개발자가 돼야겠다고 생각했습니다. 그중에서도 정말 깊이 있는 백엔드 개발자가 가져야 하는 역량이 무엇인지 고민하였습니다. 처음에는 코딩, 구현 능력이 좋기만 하면 개발자로서 필요한 자세를 모두 갖춘 것으로 생각했습니다. 하지만 대외활동과 팀 프로젝트를 진행하면서 개발자에 대한 근본적인 시각을 바꾸게 되었습니다. 개발자는 탄탄한 기본기를 바탕으로 다양한 문제 해결 능력을 갖추고, 끊임없이 새로운 기술들을 자신의 것으로 만들어야 한다고 생각합니다. 언제든지 새로운 문제들이 발생하며 개발자는 이를 제대로 파악하고 대처해야 하기 때문입니다. 또한, 컴퓨터는 여러 기술, 분야들이 유기적으로 이루어져 있기 때문에 기본기를 확실히 다져야 한다고 생각하게 되었습니다.
운영체제, 컴퓨터 네트워크 등 전공 서적을 다시 읽어가면서 동작 과정과 원리에 대해 외우는 것이 아닌 이해를 목표로 꼼꼼히 학습했습니다. 그동안 당연하게 사용했던 컴퓨터가 어떻게 실행되고 있는지, 그런 컴퓨터에서 제가 작성했던 코드들이 어떻게 메인 메모리에 올라가서 CPU에 의해 계산되는지 등 지식을 다시 정리했습니다. 그 결과 다양한 CS부터 현재 실행하고 있는 Spring Boot까지 수많은 지식들이 연결되어 있는 것을 직접 느끼기 시작했습니다. 이후 새로운 것을 배울때는 왜, 어떻게를 생각하며 기존 지식과의 연결점을 찾으면서 학습하고 있습니다.
Yes, No가 아닌 다양한 방법, trade-off를 이해하며 학습
백엔드 데브코스 교육과정에 입과 후 초기, 기술에 대한 궁금증 대해서는 무조건 “이렇게 하면 안 된다, 이렇게 해야 한다”와 같은 정답을 추구 했습니다. 즉, 모든 것에는 명확한 정답이 있는 것인 줄 알았습니다. 이는 저뿐만 아니라 주위 예비 개발자들도 흔히 오해하고 있다는 것을 깨달았습니다. 예를 들어, “객체를 생성할 때는 빌더를 써야 한다는 것”이 있었습니다. 이런 말을 처음 들었을 때는 무조건 따라야 한다고 생각했었지만, 실제로 개발하면서 오히려 불편함을 느끼며 다시 생각하게 되는 계기가 되었습니다.
생성자에 매개변수가 많다면 빌더를 사용하는 것이 편할 수는 있지만, 오히려 필요한 매개변수를 빼먹을 수 있다는 것, Mapper를 만들어줘야 하는 번거로움, 테스트 코드 작성 시 더 불편을 느꼈습니다. 하지만 빌더에 넘기는 매개변수에 따라 다른 객체를 만드는 등 상당한 유연함이 있다는 장점도 느꼈습니다. 이를 통해 어떤 기술 또는 방법을 선택하는 것에는 명확한 정답이 있는 것이 아닌, 항상 trade-off가 뒤따르며 현재 상황에 가장 알맞게 선택하는 것이 중요하다는 것을 배웠습니다. 그 결과, 3개 이하의 매개변수가 필요한 생성자는 빌더를 적용하지 않기로 합의했습니다.
협업과 커뮤니케이션을 중시
"프로그래머스 백엔드 데브코스 4기"에서 최종 팀 프로젝트를 진행한 경험이 있습니다. 초기에 저를 포함한 팀원 전체가 코어 타임 도중에 실시간으로 궁금한 것을 서로 의논하였습니다. 하지만 너무 오랫동안 결론이 나지 않게 되어 몇 시간이 지나는 상황이 빈번하게 발생했습니다. 이로 인해 개개인이 개발에 집중하기 어렵게 되면서 프로젝트에 영향 끼치는 것을 느끼게 되었습니다.
저는 팀원들이 서로 불편함을 주지 않으면서 효율적으로 개발을 진행할 수 있도록 기존과 다른 새로운 협업 방식에 대해 고민하게 되었습니다. 최근 몇 년간 재택, 원격 근무가 대중화면서 비동기 커뮤니케이션이 자주 사용되는 것을 알게 되었습니다. 비동기 커뮤니케이션이 현재 팀에서 발생하고 있는 어려움을 해결해 줄 수 있다고 생각하여 정확한 방법과 적용 사례를 조사하고, 이 방식에 경험이 있는 멘토를 찾아 조언을 구했습니다.
회의를 통해 제가 당시에 느꼈던 협업 방식의 문제점을 설명했습니다. 문제를 해결하기 위해 개인 간 비동기 커뮤니케이션을 바탕으로 소통하고, 함께 의논할 사항은 코어 타임 시작 또는 끝나기 전 스크럼 때 정해진 시간 동안만 함께 의논하기를 제안했습니다. 팀원들 또한 문제에 대해 동일한 생각을 하고 있으므로 제안을 흔쾌히 수용하였습니다.
일주일 동안 적응기를 거치며, 모든 팀원이 새로운 방식에 불편함이 없는지 확인이 된 후 프로젝트가 끝날 때까지 유지되었습니다. 효율적인 의사소통을 통해 프로젝트의 완성도를 높일 수 있었고, 마침내 제가 속한 팀이 해당 프로젝트로 개발 우수상을 수여하게 되었습니다.
이런 경험을 통해 개발자의 개발 역량이 아무리 뛰어나도, 팀원들과의 소통과 협업이 제대로 이루어지지 않으면 프로젝트나 기업에는 악영향을 끼칠 수 있다는 것을 느꼈습니다. 저는 이러한 이유로 팀원들과의 효율적이고 적극적인 커뮤니케이션을 유지할 수 있도록 신경쓰고 있습니다.