미리보기
기본 정보

안녕하세요. '의도를 파악하고 해결하는 개발자', 김주호입니다. 모든 것에는 의도가 있습니다. 저는 의도를 파악하고, 그에 맞는 해결책을 구성하는 개발자입니다.
자기소개
기술이 의도하는 바를 깨닫고 그에 맞게 사용합니다.
‘Socket.IO Adapter가 Room을 확장 불가능하게 구성한 의도’, ‘Spring Security가 XorCsrfTokenUtils를 통해 XOR 연산을 의도한 이유’, ‘@SoftDelete와 FetchType.LAZY를 같이 사용하면 Exception이 발생하는 의도’ 등 기술이 의도한 바를 깨닫기 위해 공식문서, 커밋 히스토리, 논문 등을 살펴보며 이를 이해하고 의도에 맞게 사용합니다.
문제가 제시된 의도를 이해하고 해결책을 제안합니다.
‘Service 코드가 너무 복잡해서 읽기 힘들다’는 팀원의 의견을 통해 ‘가독성이 저하된 이유가 무엇일까’, ‘해결하는 방법이 침투적 코드를 만들어내진 않을까’, ‘오남용 가능성은 없을까’ 처럼 단순 개발적 불편을 넘어 문제를 정의하고, 해결책을 찾아 제안합니다.
‘비로소 보이는 것들’을 다루는 개발자가 될 것입니다.
의도를 알아차리는 건 굉장히 힘든 일입니다. 우리의 행동에는 많은 무의식이 담깁니다. 코드 또한 ‘문제를 해결하거나 줄이기 위해’라는 한 문장으로 그 의도를 표현할 수 있습니다.
본질은 더 깊은 곳에 있습니다. ‘어떤 문제를 해결하고자 하는지’, ‘왜 그것을 문제라고 정의했는지’, ‘문제를 문제로 여기지 않기 위해 어떤 노력을 했는지’ 등 서로에게, 혹은 스스로에게 집중해야만 보이는 것들이 있습니다. 이처럼 주변을 살펴보고 몰두하고 고민했을 때 ‘비로소 보이는 것들’을 다루는 개발자가 되고자 합니다.
이를 위해 절대 단언하지 않으며, 서로의 생각을 나누어 열린 사고를 갖고자 노력하고 있습니다.
기술 스택
Java, TypeScript, Spring Boot, NestJS, Spring Security, spring-jpa, querydsl, junit5, github-actions, Docker, MySQL, Redis, Socket.io, React
프로젝트
실시간 아이스 브레이킹 프로젝트 - Socket.IO의 의도에 맞게 실시간 데이터 처리
네이버 부스트캠프 9기
2024.10. ~ 2024.12.
서로의 관심사를 나누는 것으로, 빠르고 쉬운 아이스 브레이킹이 가능하도록 구성한 프로젝트입니다. 랜덤한 질문에 대해 참여자가 키워드를 입력하면, 해당 키워드들을 실시간으로 확인 가능합니다. 이후 키워드 통계 및 이미지와 유튜브 영상 공유를 통해 서로의 관심사와 공감대를 빠르게 나눌 수 있습니다.
팀장을 맡았으며, 아이디어 기획과 프로젝트 방향성, BE 로직, CI/CD, 아키텍처를 맡아 작업했습니다. 그 외에도 원활한 협업을 위해 1일 2스크럼 도입, KPT 회고법 도입, FE 소켓 예시 코드 작성 및 전달, Socket.IO가 지닌 의도 설명, 그라운드 룰 최적화 등 ‘함께 성장할 수 있는 환경 구축’을 위해 노력했습니다.
BE 2명, FE 3명.
Socket.IO의 Room이 확장 불가능한 의도를 파악, 리소스 절감
Socket.IO Adapter의 Room은 단순 string 타입으로 확장 불가능, 추가적인 메타데이터를 저장할 수 없음.
Adapter의 역할은 클라이언트와 방의 연결 정보만 처리하는 것임을 파악(https://m.site.naver.com/1BlKO).
불필요한 클라이언트-방 관계 데이터 제거, 사용 리소스 절감.
새로고침 시 즉각적인 방 삭제 방지
클라이언트가 새로고침 시 소켓이 소멸, 방에 참여한 인원이 없을 경우 Socket.IO의 이벤트 전파로 방이 즉시 삭제.
방 삭제 이벤트를 지연시키는 LazyEventEmitter 작성, CustomIoAdapter에 적용하여 즉시 삭제 방지.
실제 사용자 중 40%가 경험한 문제 해결, 만족도 28% 향상.
RedisAdapter 오픈소스 기여
RedisAdpater의 ‘publishOnSpecificResponseChannel’ 설명에서 ‘request’ 채널로 publish한다고 언급.
실제로는 ‘response’로 publish되고 있었음을 발견.
주석이 잘못되었다는 이슈를 남기고, 이를 fix한 PR을 작성.
장애인 단기 보육 시설 홈페이지 - 보안적 이슈는 논문을 통해, 서버 다운은 모니터링을 통해 해결
개인
2024.04. ~ 2024.07.
다음 카페를 통해서만 유지되던 서비스의 접근성을 높이기 위해, 별도의 사이트를 구축한 프로젝트입니다. 장애인 단기 보육 과정에서 글을 작성하거나, 채팅을 송수신할 수 있는 서비스입니다.
아이디어 기획과 채팅 시스템 구축, BE 로직, CI/CD를 맡아 작업했습니다.
BE 1명, FE 2명, 기획자 1명, 디자이너 1명.
SockJS 환경에서 CSRF 토큰 검증 문제 해결
커스텀 헤더를 지원하지 않는 SockJS 환경에서는 body에 담긴 CSRF 토큰 검증 필요.
검증이 제대로 이뤄지지 않는 이유를 BREACH 공격 논문과 Spring Security의 XorCsrfTokenUtils 코드를 통해 추론(https://m.site.naver.com/1FMc4).
보안성을 유지하면서도 추가적인 구조 변경 없이 문제 해결.
‘@SoftDelete’ 예외 미발생 버그 발견, 이슈 작성
‘@SoftDelete’와 ‘FetchType.LAZY’를 동시에 적용했을 때 패키지명에 따라 예외 유무가 달라짐.
커밋 히스토리를 통해 '@SoftDelete'가 어떠한 의도로 'FetchType.LAZY'를 허용하지 않는지 확인함. 또한 예외가 발생하지 않는 상황이 버그임을 파악함.
오픈소스를 살펴본 후 버그가 발생한 이유에 대해 정리(https://m.site.naver.com/1BJIq) 및
Hibernate Jira 이슈 작성.
위치 기반 SNS - 레이어와 이벤트 활용, 코드의 가독성과 로직을 모두 개선
개인
2024.02. ~ 2024.04.
위치 기반 SNS 프로젝트입니다. 글 작성 시 위치 정보를 추가할 수 있으며, 지도 View에서 위치 기반 글들을 조회할 수 있습니다.
아이디어 기획, BE 로직, 쿼리 최적화 등을 맡아 작업했습니다.
풀스택 2명, 기획 2명.
비즈니스 로직 가독성 개선 및 이미지 업로드를 트랜잭션 사이클과 동기화
서비스 레이어에서 너무나 많은 일들이 수행되고 있었고, 이로 인해 코드의 가독성이 저하됨.
가독성이 저하된 이유를 찾고, 추가 계층을 신설하여 이를 해결함.
해당 과정에서 트랜잭션 이벤트를 사용, S3 이미지 업로드의 타이밍을 트랜잭션 커밋 직전으로 설정함. 또한 트랜잭션 롤백 발생 시 관련된 이미지들을 S3에서 삭제할 수 있도록 함.
DB 쿼리 해석의 차이로 인한 테스트 거짓 양성 해결
MySQL은 지리 좌표계 설정과 무관하게 미터 단위로 연산함.
그러나 H2GIS DB는 설정에 따라 미터 단위 혹은 도분초 단위로 연산함.
이에 실제 환경에서는 문제 없이 동작하나, 테스트 환경에서만 실패가 발생하는 상황이 생김.
테스트 환경에서도 MySQL을 사용할 수 있도록 testContainers 도입.
음식 주문 프로젝트 - 동시성 문제를 성능과 비용 사이에서 고려
NHN 아카데미 2기
2023.06. ~ 2023.08.
음식 주문 프로젝트입니다. 음식 선택, 쿠폰 사용, 주문, 결제 과정에서 접할 수 있는 많은 문제들을 마주하였습니다.
쿠폰 발행, 쿠폰 획득, 주문 시 쿠폰 사용, 주문과 결제 시점에서 가격 변동 시 처리, 포인트 지급 등을 맡아 작업했습니다.
풀스택 5명.
쿠폰 발급 동시성 문제 해결 및 비용 절감 방안 구상
대량의 쿠폰 요청 발생 시 동시성 문제로 인해 발급 실패 발생.
RabbitMQ와 Redis를 도입하여 1,000개 요청 기준, 기존 30초 → 5초로 성능 600% 개선(https://m.site.naver.com/1FMeA). 그러나 인스턴스 비용 증가.
(2025.02.21) SKIP LOCKED 쿼리 도입, 각 방법의 성능 비교를 정리(https://m.site.naver.com/1FMfq).
포트폴리오
교육
네이버 부스트캠프 9기
사설 교육 | JavaScript
2024.06. ~ 2024.12. | 수료
NHN 아카데미 2기
사설 교육 | Java, Spring
2023.02. ~ 2023.08. | 수료
SSAFY - 삼성 청년 SW아카데미 6기
사설 교육 | 자료구조, 알고리즘, Python
2021.07. ~ 2022.06. | 수료
국립한밭대학교
대학교(학사) | 전자제어공학과
2015.02. ~ 2021.02. | 졸업
대외활동
DevFest 2024 : 삐약톤 캠퍼스 대항전 우수상
개인
2025
Java, Spring Boot, MySQL을 활용하여 행사 내에서 빠르고 쉽게 다른 사람들과 네트워킹할 수 있는 서비스 구성.
22팀 중 우수상(2위).
삼성 청년 SW아카데미 자율 프로젝트 우수상
SSAFY - 삼성 청년 SW아카데미 6기
2022
Java, Spring Boot, SockJS, MySQL, React.js를 활용하여 100m 이내 사용자들과 소통, 익명 채팅 서비스 구성.
약 12팀 중 우수상(1위).
삼성 청년 SW아카데미 프로젝트 경진대회 최우수상
SSAFY - 삼성 청년 SW아카데미 6기
2021
Python, C#, Django, WPF, OpenCV를 활용하여 색채를 통한 영화 추천 프로젝트 구성.
약 15팀 중 최우수상(1위).
제9회 국립한밭대학교 정보기술대학 작품전시회 은상
개인
2020
C#, WPF, MySQL 등을 활용하여 도로 균열 정보를 확인하고 해당 위치와 균열 이미지를 업로드하는 프로젝트 구성.
약 20팀 중 은상(2위).
제13회 국립한밭대학교 창의적 종합설계 경진대회 금상
한밭대학교 연구실 '파워영상비전'
2020
적외선 센서와 물리 센서를 통해 구체의 속도 기록, 가상의 물체에 속력 부여.
약 15팀 중 금상(1위).
제12회 국립한밭대학교 창의적 종합설계 경진대회 은상
한밭대학교 연구실 '파워영상비전'
2019
C#, WPF, OpenCV 등을 활용하여 360도 카메라를 통해 차량 주차 유무 판별 및 번호 검색을 통한 차량 주차 위치 안내.
약 15팀 중 은상(2위).