미리보기
기본 정보
안녕하세요, 효율성과 안정성을 기반으로 개발하는 김종하입니다. 저는 다양한 요구 사항에 맞춰 서버와 DB 사이에서의 원하는 응답, 호출을 정확하고 신속하게 구현할 수 있는 능력을 갖추었습니다. 특히, 기술 습득과 적용을 통해 문제를 효율적으로 해결하는 데 강점을 가지고 있으며, 예시로는 모놀리식 아키텍처를 MSA로 전환하는 프로젝트에서 공식 문서와 아티클을 활용하여 스프링 클라우드와 유레카부터 API 게이트웨이 등 MSA를 위한 필수 기술들을 빠르게 학습하고 실제 프로젝트에 기여한 경험이 있습니다. 또한 새로운 시도에 주저하지 않을 것입니다. 제게 익숙하고 편한 언어, 프레임워크가있지만 비즈니스 요구사항에 따라 사용되는 언어나 프레임워크가 변화할 수 있다는 점을 인식하고 있으며, 이러한 변화를 수용할 준비가 되어 있습니다. 예를 들어, 주로 서버 개발에 집중해 왔지만, 인프라 구축에 대해 학습후 CI/ CD 배포 경험으로 프로젝트에 성공적으로 적용한 경험이 있습니다.
기술 스택
Java, Docker, Spring Boot, Redis, AWS, Git, IntelliJ IDEA
교육
평택대학교
대학교(학사) | 융합소프트웨어학과
2018.03. ~ 2024.02. | 졸업
포트폴리오
대외활동
취업 리부트 코스
항해 99
- 현업 시나리오 프로젝트 기반 프로젝트 수행 , 개인 프로젝트를 통한 실무적 경험 및 고도화 기술 습득
대용량 MSA 엔지니어 양성과정
엔코아 플레이데이터
- 모놀리식과 MSA(Micro-Service Architecture)의 비교, 스프링 클라우드를 포함한 다양한 마이크로서비스 구성 요소 학습
- 개별 기능 구현부터 도커 환경 설정, 마이크로서비스 개별 기능 개발, Git Flow, Config 서버 활용
- 도커 이미지 빌드와 배포, 서비스 간 통신, 회복 탄력성 관리, 클라우드 서비스 활용
Java & SpringBoot로 시작하는 웹 프로그래밍
페스트캠퍼스 강남학원
- Spring에 대한 핵심적 개념을 이해하고 실전 프로젝트 진행
외주 시뮬레이션 챌린지
그릿지
- 실제 외주 프로세스와 동일한 시나리오 기반 코드 개발
프로젝트
지식 공유 학습 웹사이트 , KNOWLEDGE-SHARING
항해99
2024.01. ~ 2024.03.
프로젝트 설명
학습할 때 퀴즈 형식과 아티클을 보며 학습할 때 효과가 좋은 사람들의 니즈를 충족하기 위한 아티클 피드, 퀴즈 학습 웹사이트입니다.
주요 사용 스킬
Spring Boot 3.1, JWT, JPA, React.ts, MySQL, Redis, Docker-compose, Axios, AWS S3, JAVA 17, React.ts
💡 개인 프로젝트, 기여도: 10/10
프로젝트 활동
레디스의 캐싱 기능을 활용하여, 기존 JPQL 기반의 데이터 처리 방식 대비 좋아요 및 조회수 기능의 응답 속도를 80% 향상
- 추가 검증을 위해 조회수를 확인한 유저의 ID와 아티클의 ID를 레디스에서 관리하여 중복 방지
Spring AOP를 활용해 응답 속도 로깅
- 성능 모니터링을 강화하고, 평균 처리 시간을 체계적으로 분석
Artillery 시나리오 기반 부하 테스트 진행
- 원하는 시나리오의 부하 테스트 결과와 예측 기댓값이 일치
JUnit, Mockito를 이용한 유닛 테스트 코드 작성 및 오류 개선
- 계층 독립적 테스트 코드 작성
구글 SMTP를 이용한 메일 인증 기능 구현
- 이를 통해 사용자 이메일 인증 과정의 로직 경험
✅ 성능 구조 개선
- 쿼리 방식을 다양하게 경험 및 스킬 향상을 위해 JPA -> JPQL -> QueryDSL 구조 변경
- Redis를 사용해서 메서드의 응답 속도 개선
- CRUD 작업, 페이징 및 검색 기능을 팔로잉, 아티클, 퀴즈, 백오피스 관리자 기능에 추가
- GitHub Actions를 활용한 Gradle CI 파이프라인 구축으로 코드 품질 검증을 자동화하고, 개발 효율성 및 배포 안정성을 향상
📌 트러블슈팅
🚫 문제 - AWS RDB 사용 중 VPC 비용 이슈
✔ 해결 - Vultr 클라우드에서 무료 인스턴스를 받아 리눅스에 MySQL 설치 및 환경 설정, 방화벽 설정 후 연동
🚫 문제 - 토큰을 서버에서 발급하는 로직 배포 후 크로스 도메인에서 쿠키 전송 에러
✔ 해결 - 토큰을 response JSON으로 프론트에 전달하여 프론트에서 쿠키를 관리
🚫 문제 - 클라이언트에서 요청을 보내고 DB까지 거쳐 값이 변경됐지만 원상복구 되는 문제
✔ 해결 - 트랜잭션 처리를 업데이트되는 메서드에 걸어서 락이 걸리도록 리팩토링하여 해결
Domain: https://knowledge-sharing-two.vercel.app
GitHub: https://github.com/kimjongha99/knowledge-sharing
빠르게 찾는 게임 친구 , GGWP
엔코아 플레이데이터
2023.10. ~ 2023.12.
프로젝트 설명
리그오브레전드 팀원 찾기 및 전적 검색 서비스 프로젝트
주요 사용 스킬
SpringBoot 3.1, JAVA 17, React.ts, SpringCloud, MySQL 8.0, OpenFeign 4.1.0
💡 팀 프로젝트, 기여도: 4/10
프로젝트 활동
스프링 클라우드를 활용한 마이크로서비스 간의 Feign 통신
- 스프링 클라우드와 Feign의 조합으로 여러 비즈니스 로직을 거쳐 이동할 때 한 방향의 흐름대로 진행
라이엇 API를 활용하여 유저 정보를 요청, 받은 데이터를 가공하여 데이터베이스에 저장
- 유저가 회원가입 시 유저의 라이엇 닉네임을 API 호출해서 필요한 정보를 가공하여 DB에 저장
프로젝트 활동
- 모놀리식 아키텍처를 MSA(마이크로서비스 아키텍처)로 전환하여 구조화
- 모놀리식 아키텍처를 마이크로서비스 아키텍처(MSA)로 재구성하면서, 기존 비즈니스 로직의 이슈를 방지하기 위해 도메인을 세심하게 분리하고 조정
Jira를 이용한 프로젝트 관리
- 작업 항목의 배정, 진행 상황 추적, 그리고 이슈 관리를 통해 프로젝트의 효율성과 협업의 효과를 경험
✅ 성능 구조 개선
- 도메인의 단위를 크게 설정하여, 인스턴스 비용 절감
- Riot API에서 개인키 유저들에게 400번대 에러 발생 -> 비즈니스 로직에 라이엇 API 오류 시 다른 비즈니스 로직으로 이동
📌 트러블슈팅
🚫 문제 - 전적 검색 시 라이엇 API 호출 횟수 문제
✔ 해결 - 전적 검색마다 API를 호출하면 호출 횟수가 많아져서 개인키 유저에게 감당 불가, 따라서 회원가입한 유저는 전적 검색 DB에 자동으로 저장되게 해서 회원 유저들은 전적 검색 속도 개선
🚫 문제 - 도메인마다 인스턴스 각각 DB를 사용하여 비용 과도 청구
✔ 해결 - 인스턴스는 최대한 분리하되 RDB는 하나로 여러 개의 인스턴스와 연결
GitHub: https://github.com/kimjongha99/GGWP/tree/develop
Portfolio: https://url.kr/un4fpl
SNS 핵심 기능 챌린지 (SERVER)
개인
2024.03. ~ 2024.03.
프로젝트 설명
SNS 기반으로 구성된 화면 설계서와 시나리오를 참고하여 백엔드 API를 작성하여 EC2에 배포하는 프로젝트
주요 사용 스킬
SpringBoot 2.7, JAVA 11, MySQL 8.0, Redis
💡 개인 프로젝트, 기여도: 10/10
프로젝트 활동
스케줄러를 통한 사용자 동의 상태 및 결제 검증 시스템 구축
- 사용자의 동의 상태를 주기적으로 업데이트되며, 모든 결제가 정확하게 처리되었는지 확인
레디스를 활용한 게시글 조회 1차 캐싱 구현
- 기존 로직 대비 레디스 적용으로 응답 시간은 약 74.14% 감소하고, 세션 길이는 약 60% 감소
포트원(PortOne) 결제 시스템 구현
- 결제 성공 및 실패를 로그화, 구독 여부 및 상태 관리를 위한 사용자 및 결제 기록 DB화
유효성 검증 로직의 직접 구현과 적용
- @Valid 어노테이션을 사용하지 않고, 직접 유효성 검사 로직을 구현함으로써 더 세밀한 검증 조건을 설정 및 정규식 경험
Jasypt를 활용한 민감정보 암호화 및 GitHub Actions을 통한 CI/CD 배포
- 민감 정보의 안전한 암호화를 위해 Jasypt 사용 및 GitHub Actions을 활용하여 지속적 통합 및 배포 프로세스 자동화로 개발 효율성 및 보안 강화
실무 개발 가이드라인 숙달
- 실무에서의 개발 가이드라인을 준수하며 프로젝트를 수행, 다양한 개발 상황에 대한 이해도 증진 및 문제 해결 능력 강화
✅ 성능 구조 개선
- 열거형을 사용해서 객체 상태 관리 -> 소프트 딜리트 및 객체 활성화 비활성화 적용
- 배포 시 민감정보 암호화 -> Jasypt를 활용하여 민감정보를 암호화, GitHub repo에 암호 저장하여 CI/CD 적용
📌 트러블슈팅
🚫 문제 - 레디스 캐시 서버 적용 중 직렬화 및 역직렬화 문제 발생
✔ 해결 - Jackson2JsonRedisSerializer를 통한 JSON 직렬화 적용, 데이터 구조 변경에 유연한 처리 가능
🚫 문제 - Page<Comment>를 CommentInfo 객체 리스트로 변환 시 성능 오버헤드
✔ 해결 - CommentInfo 생성 로직을 엔티티 내부로 이동, 코드 간결성 및 처리 효율성 향상
Domain: http://ec2-15-164-245-23.ap-northeast-2.compute.amazonaws.com:9000/swagger-ui/index.html
GitHub: https://github.com/kimjongha99/2024-Server-main
Portfolio: https://url.kr/un4fp
추가 프로젝트
엔코아 플레이데이터
2023.07. ~ 2023.09.
학원 비품 관리 시스템은 학원 수강생과 학원 관리자의 비품 관리 업무를 효율화하고, 학원 운영의 효율성을 높이는 데 도움이 되기 위한 프로젝트
GitHub: https://github.com/kimjongha99/Inventory-Manager
Portfolio: https://url.kr/un4fpl
자기소개
협업을 통해 문제를 해결하거나 갈등을 극복했던 경험
커뮤니케이션 중요성의 대한 고찰
내성적인 성격을 개선하고자 대학교 학회장과 대의원으로 활동하며 커뮤니케이션 능력을 키웠습니다. 활성화되지 않은 스터디를 주도하여 소통이 활발해지는 것을 보며 소통의 중요성을 배웠고, 남들이 기피하는 일에 앞장서며 적극성을 길렀습니다. 부트캠프와 교외 스터디에서는 조장으로 활동하며, 원활한 커뮤니케이션을 유지하고 실력 향상에 어려움을 겪는 팀원을 도왔습니다. 특히, 국비학원에서 Git Flow에 익숙지 않은 팀원들을 위해 설명 시간을 마련하고 PR, Merge 과정을 직접 관리하였습니다. 코드 충돌 해결을 담당하여 프로젝트의 진척도를 상승시키고 결과적으로 팀원들이 Git Flow의 이해도가 향상되어 프로젝트 속도가 개선되었습니다. 이 경험은 개인과 팀의 협업 효율성 증가에 기여했습니다. 커뮤니케이션의 힘과 새로운 도전의 중요성을 다시 한번 깨달았습니다. 개발 이외에도 인간적으로도 큰 발전을 이뤘다고 느꼈습니다.
문제 해결 경험 및 도전 정신
Vaild 어노테이션을 대체하여 유효성 직접 구현 및 커스텀 Vaild 사용
데이터 유효성 검사에서 @Valid 어노테이션의 일반적 사용을 넘어, 직접 유효성 검증 로직을 개발해 적용한 경험이 있습니다. Valid 어노테이션 동작원리가 궁금하여 오픈 소스를 검색하며 유효성 처리를 어떤식으로 적용했는지 확인후 유효성 검사 클래스를 만들어 사용한 경험이있습니다. 추가로 @Vaild 어노테이션을 추가로 커스텀하여 커스텀 비밀번호 검증 어노테이션도 작성해보고 사용한 경험이있습니다. 이는 기술의 깊은 이해와 개발 능력 확장의 중요성을 깨닫게 했습니다. 문제 해결에 있어 오픈소스 분석의 가치를 인식했습니다.
개발자로서 기술 및 지식 습득에 대한 노력
테스트코드 작성 및 CI/CD 구현
저는 개발자로서 역량 강화 하기 위해 테스트 코드와 CI/CD를 공부했습니다.
주요 비지니스 로직에 대한 테스트 커버리지를 극대화하고 이 과정에서 코드의 이해성과 유지보수가 용이하도록,
즉 테스트가 가능한 코드로 만드는 것을 중요시하였습니다.
Mockito를 활용하여 의존성을 목 객체로 설정하고, 서비스 레이어에 주입함으로써 다른 레이어 서비스에 의존하지 않는 테스트 환경을 구성하였습니다. 또한, 사용자 ID 중복 확인, 이메일 인증 요청 및 인증 확인 과정에서 발생할 수 있는 다양한 시나리오에 대해 성공 케이스와 예외 케이스를 모두 포함하여 테스트 케이스를 설계했습니다. 이를 통해 인증 시스템이 예상대로 정확하게 작동함을 확인하였습니다. 또한 작성한 테스트 코드로 CI 통합 테스트를 진행하였고, 깃 액션을 사용하여 EC2에 배포하였습니다. 추가로, 프론트엔드 개발에 도전하여 Vercel을 사용한 프론트엔드 CI/CD 파이프라인을 구축했습니다.
이러한 경험은 저에게 기술적 능력뿐만 아니라 새로운 도전을 받아들이고, 변화를 주도하는 능력을 키우는 데 큰 도움이 되었습니다. 앞으로도 지속적인 학습과 개선을 통해 개발자로서 더욱 성장해 나갈 것입니다.