미리보기
기본 정보

안녕하세요. 저는 단순히 '멋'으로 개발을 시작하여 현재는 개발의 멋과 흥미를 모두 깨닫게 된 백엔드 개발자 및 DevOps 지망생 설희관입니다. 유년시절 시청했던 "유령"이라는 드라마로 인해 컴퓨터의 영향력과 프로그래머의 멋에 대해 알게되었고 프로그래머가 되겠다는 꿈을 가지게 되었습니다. 이를 계기로 컴퓨터공학과에 진학하여 지금까지 영향력있는 프로그래머가 되고자 노력해 오고 있습니다. 지속 가능한 서버 개발자가 되기 위해 웹 개발, 클라우드 등에 대한 지속적인 탐구와 노력을 바탕으로 빠른 성장을 이뤄오고 있습니다. 과거에는 빨리, 많이 하는 "양적 개발자"가 되는 것을 추구하였습니다. 그러나 점차 시간이 지남에 따라 더디더라도 탄탄한 "질적 개발자"가 되어야겠다고 다짐하였습니다. 이를 위해 학습 내용과 개발 중 고민한 과정을 꾸준히 개인 블로그에 남기기 시작하였습니다. 또한 개발 역량을 향상시키고 다양한 문제 상황에 직면해보고자 프로젝트를 진행해오고 있습니다. 하나의 기술 스택에 국한되지 않고 새로운 기술에 대한 거부감이 없는 개발자가 되겠습니다. 개발과 사람을 좋아하는 설희관이었습니다. 감사합니다.
기술 스택
Spring Boot, Spring Security, JPA, Django, AWS, MySQL
프로젝트
에코(Echo)
개인
2024.07. ~ 진행 중
[서비스 소개]
Gemini API를 활용한 이메일 관리 서비스
[개발 인원]
백엔드 개발 2명, 프론트엔드 개발 2명
[담당 역할]
백엔드 개발
[기여도]
약 25%
[기술 스택]
Spring Boot, Spring Data JPA, MySQL, GCP, Gmail API
[개발 내용]
Gmail API를 이용한 이메일 조회, 전송, 삭제 등의 이메일 관련 API 개발
멀티 쓰레딩과 쓰레드 풀을 이용한 비동기 처리를 통해 Gmail 목록 조회 속도 개선(4.71s -> 0.855s)
[Github]
외개인(Oegaein)
개인
2024.03. ~ 2024.06.
[서비스 소개]
교내 룸메이트 매칭 서비스
[개발 인원]
백엔드 개발 2명, 프론트엔드 개발 2명
[담당 역할]
백엔드 개발, 서비스 배포
[기여도]
약 50%
[기술 스택]
Spring Boot, Spring Data JPA, MySQL, GCP, Selenium
[주요 개발 내용]
유저, 매칭 게시글, 매칭 요청, 기숙사 소식, 댓글, 채팅 관련 API 개발
STOMP 프로토콜을 이용한 실시간 채팅 서버 개발
매일 자정, 마감 기한이 지난 매칭 게시글의 상태를 변경하는 스케줄러 구현
유저, 프로필 테이블 분리로 인한 N+1 문제를 해결하기 위해 Fetch Join을 적용
Redis를 활용한 채팅 내역 조회 응답 속도 개선(0.025s -> 0.014s, 약 31.4% 개선)
RabbitMQ를 활용하여 WAS 스케일 아웃 시 서버 간 메세지가 공유되지 않는 문제점을 해결
Selenium을 이용한 기숙사 공지사항 크롤러를 개발, 크롤링 후 데이터를 업데이트 하는 과정에서 발생하는 쿼리를 최적화(INSERT 10개 -> BULK INSERT 1개)
비동기 처리를 통한 이메일 전송 기능 속도 개선(4s -> 0.002s)
비관적 락을 이용한 채팅방 참여자 수 관련 DB 동시성 문제 해결
[Github]
HUFSTING
한국외국어대학교 멋쟁이사자처럼
2024.01. ~ 2024.03.
[서비스 소개]
교내 소개팅 서비스
[개발 인원]
백엔드 개발 2명, 프론트엔드 개발 4명
[담당 역할]
백엔드 개발, 서비스 배포, DB 설계
[기여도]
약 50%
[기술 스택]
Spring Boot, Spring Data JPA, MySQL, GCP
[주요 개발 내용]
유저, 매칭 게시글, 매칭 요청 관련 API 개발
Spring Security를 이용한 JWT 기반 인증 및 인가 기능 구현
GCP Compute Engine 및 Docker를 활용한 백엔드 서비스 배포(* 서버 사양 : N1,
vCpu 1, 3.75GB)
Nginx를 이용한 리버스 프록시 서버 구축하여 보안성을 높였으며 로드밸런싱 기능을 이용하여 트래픽을 분산시킴으로써 가용성을 확보
[Github]
퀀슘(Quansume)
Quansume
2023.06. ~ 2023.07.
[서비스 소개]
음향기기 추천 렌탈 서비스(* Beta Version)
[개발 인원]
프론트엔드 1명, 백엔드 개발 2명, AI 개발팀
[담당 역할]
백엔드 개발, 서비스 배포
[기여도]
약 30%
[기술 스택]
JavaScript, NodeJS, Express, AWS ECR, Docker, MongoDB
[핵심 개발 내용]
Spotify Open API를 이용한 음악 검색 기능을 구현
Mongoose를 이용한 NoSQL의 스키마 기반 데이터 모델링 및 음향 기기 데이터 조회 API 개발
멀티 스테이지(Multi-Stage) 빌드 방법을 이용한 Docker 이미지 용량 최소화
Jenkins와 AWS ECR을 이용한 CI/CD 파이프라인 구축
[Github]
비공개
GoormBank
Goorm
2022.10. ~ 2022.11.
[서비스 소개]
자격증 기출문제은행 서비스
[개발 인원]
프론트엔드 1명, 백엔드 개발 1명, 인프라 4명
[담당 역할]
프론트엔드 개발, 프론트엔드 서비스 배포, 오토스케일링
[기여도]
약 20%
[기술 스택]
HTML, CSS, JS, React, AWS EKS
[주요 개발 내용]
React를 이용한 기출 문제 은행 서비스 퍼블리싱
AWS EKS 클러스터 내에서 디플로이먼트(Deployment)를 통해 일정 수의 프론트엔드 파드(Pod) 수를 보장함으로써 고가용성의 클러스터 환경 구축
AWS EKS 클러스터 내 HPA(Horizontal Pod AutoScaler)를 구성하여 서버의 CPU 사용량에 따라 파드의 수를 오토스케일링 하도록 하여 대용량 트래픽에 대해 유연한 대처가 가능한 클러스터 환경 구축
[Github]
포트폴리오
교육
한국외국어대학교
대학교(학사) | 컴퓨터전자시스템공학부
2019.03. ~ 2024.06. | 졸업
대외활동
클라우드 클럽(Cloud Club)
클라우드 클럽(Cloud Club)
- 클라우드 기술에 관심이 있는 대학생과 현직자가 모여 네트워킹, 스터디, 세미나를 진행하며 함께 성장하는 IT 연합 동아리입니다.
- 동아리원들과 함께 AWS Community Day와 같은 클라우드 관련 행사에 함께 참여하여 다양한 클라우드 기술 소식을 접하고자 노력하고 있습니다.
- 온라인 강의와 서적을 통해 쿠버네티스에 대해 공부한 후 각자 공부한 주제로 발표를 진행하는 쿠버네티스 자격증 CKA 취득을 위한 스터디를 진행하고 있습니다.
- 동시에 검색 엔진인 ElasticSearch에 대해 서적을 통해 공부하고 실무에서 ElasticSearch를 통해 문제를 해결하고 있는 다양한 사례들을 조사하여 팀원들과 발표하는 스터디를 진행하고 있습니다.
카카오엔터프라이즈 x 구름(Goorm) 쿠버네티스 전문가 양성과정 5기 수료
구름(Goorm)
- 구름(Goorm)에서 주관하는 국비지원 프로그램인 카카오엔터프라이즈 x 구름(Goorm) 쿠버네 티스 전문가 양성과정 5기에 참여하여 약 4개월간 Linux, AWS 등의 교육을 받았습니다. 또한 다 양한 클라우드 서비스를 경험하는 것을 목적으로 하여 소규모 프로젝트를 진행하였습니다. 2022.11월에 최종 수료하였습니다.
- Docker, Kubernetes에 대한 존재와 기초를 학습할 수 있었던 경험이었습니다. 제공되는 AWS 크레딧을 이용하여 AWS EKS, AWS ECS 등 다양한 서비스를 이용해보았습니다.
한국외국어대학교 멋쟁이사자처럼 9기, 10기
멋쟁이사자처럼
- 웹 프로그래밍을 배우기 위한 한국외국어대학교 학생들이 모여 네트워킹, 스터디, 세미나를 진행 하며 함께 성장하는 교내 IT 동아리입니다.
- 학기 중 운영진들과 함께 Django RestFramework, Docker에 대해 학습하고 지식을 습득하며 습득한 지식을 바탕으로 격주 1회 동아리원들을 대상으로 백엔드 개발과 관련된 세션을 진행하였습 니다.
- 동아리 운영진들과 함께 방학 중 교내 AI 교육원과 협력하여 교내생들을 대상으로 모각코 프로그 램을 기획하고 진행하였으며 Selenium을 이용한 웹 크롤링 교육을 진행하였습니다.
- 멋쟁이사자처럼 9기, 10기 운영진들과 함께 매월 1회 개발자를 목표로 하는 풍생고등학교 학생 들을 대상으로 창의적체험활동 시간에 코딩 교육을 진행하였습니다. HTML, CSS, Python을 내용으로 교육을 진행하였으며 학생들이 만들고자 하는 아이디어를 구 체화하여 동아리 차원에서 운영하는 부스에 프로젝트를 전시하는 성과를 성취하였습니다.
자격증
SQLD
91 | 한국데이터산업진흥원
2024.06.
AWS Certified Cloud Practitioner
869 | AWS
2023.03.
자기소개
공통 질문 01. 해당 직무에 지원하는 동기를 작성해주세요.
"드라마의 주연이 되기 위해"
유년시절 시청했던 “유령” 이라는 한편의 드라마로 인해 프로그래머의 영향력과 멋에 대해 알게되었고 드라마의 주연과 같이 세상에 영향력을 줄 수 있는 개발자가 되겠다는 꿈을 가지게 되었습니다. 다양한 분야중에서도 영화 속 영웅들이 보이지 않는 곳에서 임무를 수행하듯 사용자가 직접 접하는 측면이 아닌 이면에서 다양한 비즈니스 로직과 대용량 트래픽을 처리하며 고가용성 있는 서비스를 제공하는 백엔드 개발자에 흥미와 관심을 가지게 되었습니다.
이러한 목표를 가지게 된 이후 저는 곧바로 교내 동아리 ”멋쟁이사자처럼“에 가입하여 Django를 기반으로 이론 학습과 API 개발 실습을 진행하며 기본적인 백엔드 개발 역량을 향상시킬 수 있었습니다. 또한 격주 1회 백엔드 개발과 관련된 주제를 선정하여 동아리원들을 대상으로 CGI, Oauth 2.0, HTTPS 등 다양한 주제에 대한 발표를 진행하며 넓은 식견을 가진 개발자로 한걸음 더 나아갈 수 있었습니다. 이후 저는 기술 스택에 구애받지 않는 개발자가 되고자 Spring Boot, Spring Security, JPA를 중점적으로 학습해 오고 있으며 제가 가진 지식을 검증하고 많은 사람과 협업하여 발전할 수 있는 개발자가 되고자 음향기기 추천 서비스, 교내 미팅 서비스 프로젝트를 제작하며 공통의 목표를 이뤄보았습니다.
이전까지 백엔드 개발자로서의 지식의 확장과 다양한 경험을 쌓아 올리는 데에 집중하였다면, 현재는 단순 기능 구현을 넘어 Fetch Join, Batch Size를 통해 데이터베이스 쿼리를 줄이고 글로벌 예외 처리를 통해 중복없는 코드를 작성하는 등 ‘효율성’에 중점을 둔 코드를 작성하고자 노력하고 있습니다. 또한 개발뿐만 아니라 클라우드, 인프라에 관심을 가지게 된 저는 연합 동아리 “클라우드 클럽”에 가입하여 공통 관심사를 가진 사람들과 쿠버네티스, ElasticSearch에 대해 학습하고 지식을 공유하며 기술적 전문성을 확보하고자 노력하고 있습니다.
이와 같이 저는 호기심이 생기면 항상 바로 실행에 옮기며 실행하면서 부족한 것이 있다면 추가적인 학습을 통해 바로 메워나가는 사람입니다. 이러한 저의 가치관과 완벽하지 않은 전략이라도 바로 실행에 옮기며 전략을 수정해 나가고 기술적 전문성을 추구하는 인프랩의 가치관이 부합된다고 생각하여 이 회사에 지원하게 되었습니다. 빠른 기술 변화에 적응하며 항상 어제보다 나은, 더 발전할 수 있는 지속 가능한 개발자가 되겠습니다.
공통 질문 02. 여태 개발을 해오면서 가장 기술적 도전 과제였던 경험을 소개해주세요. 개발자로서 원인을 알기 어려웠던 에러를 만나서 해결했던 경험이나 새로운 생태계, 새로운 도구 등을 필요에 의해 적용해보고 문제를 해결해본 경험이 있다면 소개해주세요.
“크롤링과 업데이트”
최근 교내 룸메이트 매칭 프로젝트를 진행하면서 교내 기숙사 홈페이지에서 상위 10개의 공지사항을 크롤링하여 사용자에게 정보를 제공하는 기능을 구현하는 역할을 맡았습니다. 기능 구현을 위해 매일 자정 BS4를 이용하여 기숙사 홈페이지의 공지사항을 크롤링하여 데이터베이스에 데이터를 업데이트 하는 스케줄러를 구현하였습니다. 기능 구현을 하며 많은 기술적 고민을 하게 만들었던 것은 바로 크롤링한 데이터를 데이터베이스에 업데이트할 때였습니다. 처음 스케줄러 구현을 하였을 때는 매번 크롤링 후 크롤링한 각 공지사항의 제목을 통해 DB에 데이터가 이미 존재하는지 확인한 후 존재하지 않는다면 INSERT 하고자 하였습니다. 그러나 이 방법은 많은 문제점이 존재했습니다. 첫번째 문제점은 특정 제목을 가진 데이터가 존재하는지 확인하기 위해 10번의 SELECT 쿼리를 요청해야 한다는 문제점이 있었습니다. 두번째 문제점은 만약 동일한 게시글인데 제목이 수정되었을 경우 새로운 데이터로 인식하고 DB에 저장되기 때문에 데이터가 중복되어 저장된다는 문제점이었습니다.
저는 이 문제점을 해결하기 위해 10개의 적은 데이터라는 점을 고려하여 BULK INSERT, BULK DELETE 방법을 선택하였습니다. 이 방법을 이용함으로써 매번 크롤링할 때마다 10개의 SELECT 쿼리를 요청하는 것이 아닌 두 번의 벌크 쿼리를 통해 쿼리 수를 줄이고 데이터의 중복 문제를 해결할 수 있었습니다. 또한 벌크성 쿼리를 매번 요청하는 것도 많은 데이터 블럭을 디스크에서 읽어들이기 때문에 많은 오버헤드가 발생할 것 같다고 생각하였습니다. 이를 해결하기 위해 매번 크롤링을 할 때마다 크롤링한 데이터를 특정 키값으로 인코딩하여 인코딩 된 결과를 특정 파일에 저장하고 다음 크롤링 작업이 진행될 때 이전에 인코딩된 값과 비교하여 인코딩 결과값이 변경되었을 때만 벌크성 쿼리를 요청하도록 함으로써 불필요한 쿼리가 요청되는 문제를 해결할 수 있었습니다.
“커넥션 시간의 이해”
Spring Boot를 이용한 프로젝트를 진행하며 가끔 “Failed to validate connection” 에러를 맞이한 적이 있습니다. 이 에러는 Hikari CP의 커넥션 풀에서 커넥션을 얻고자 했을 때 해당 커넥션이 유효하지 않은 커넥션일 때 발생하는 에러였습니다. 처음에는 무작정 사용하고 있는 MySQL의 문제점이라고 생각하여 매번 에러를 마주할 때마다 데이터를 백업하고 다시 MySQL 컨테이너를 띄우며 문제를 해결하고자 하였습니다. 그러나 시간이 지남에 따라 계속해서 동일한 에러를 마주하게 되었고 에러의 원인부터 파악한 후 적절한 방법으로 문제를 해결해야겠다고 생각하게 되었습니다. 검색, 공식문서 등을 통해 원인을 알아본 결과 에러의 원인은 Hikari CP의 최대 커넥션 유지시간인 maxLifeTime이 MySQL의 최대 커넥션 유지시간인 wait_timeout보다 길어 이미 끊긴 커넥션을 연결하고자 하여 발생한다는 것을 알게되었습니다. 이 문제점을 해결하기 위해 Hikari CP의 공식문서를 참고하여 maxLifeTime을 네트워크 지연시간을 고려한 wait_timeout보다 2~3초 적게 설정하여 해당 에러를 해결할 수 있었습니다. 이 에러를 해결하면서 이전에는 간과하였던 커넥션 풀에 대해 좀 더 자세히 알아볼 수 있는 계기가 되었고 데이터베이스의 커넥션 연결 시간과 Hikari CP의 커넥션 시간이 독립적으로 존재한다는 사실도 알 수 있었던 좋은 경험이었습니다. 또한 앞으로 에러가 발생했을 때 무작정 무언가를 시도하는 것이 아닌 정확한 원인을 파악하는 것을 우선시 해야겠다는 깨달음을 얻을 수 있었습니다.
공통 질문 03. 산업기능요원 '희망 복무 형태'와 '보유하신 자격 요건'을 작성해주세요.
보충역 신규편입, 보충역(4급) 판정