미리보기
기본 정보
끊임없이 사고하는 개발자 김정훈입니다. 커뮤니케이션을 중시하며, 한 줄 이라도 의미있는 코드가 되도록 노력하고 있습니다.
기술 스택
Spring Boot, MySQL, JPA, Spring Security, JWT, Docker, REST API, JavaScript, SQL, Java, github-actions
대외활동
교내동아리 DCA
동아대학교
컴퓨터공학과 학술 동아리인 DCA에서 활동한 경험이 있습니다. 선배님들께서 진행하시는 수업을 통해 C, JAVA, Python과 같은 기본 언어들의 기초를 배울 수 있었고, 주어진 과제를 성공과 실패를 경험하여 언어에 대한 이해를 할 수 있었습니다. 팀 과제를 통해 처음으로 코드에 대한 의견을 나누고 문제를 해결하는 재미를 느꼈으며, 다양한 사람들과 친해질 수 있는 기회가 됐습니다.
2학기에는 선배님들의 수업 커리큘럼 준비 과정을 지원하며, 선배들이 강조하는 핵심 주제와 개념을 식별하는 과정에서어떤 지식이 실제로 중요하고, 어떻게 그 지식이 적용될 수 있는지를 이해할 수 있었습니다.
경력
(주)네오택
팀원 | 소프트웨어팀 | 재직 중
2024.09. ~ 재직 중 (4개월)
Neotack은 응용 소프트웨어 개발과 제품 공급을 전문으로 하는 기업입니다. 인턴십 동안 사내 부가 서비스 프로젝트를 개발하고 실제 프로젝트에 참여하면서 회사의 분위기와 체계, 협업 방식을 명확히 이해할 수 있었습니다.
1. Device Error Notification System (9.2 ~ 10.1)
목적
Naver Works Open API를 활용하여 사내 메신저인 Naver Works를 통해 자사 환경 모니터링 장비 및 서버 데몬 상태를 실시간으로 감시하고, 오류 발생 시 해당 장비 및 데몬에 대한 알림을 자동으로 전송하는 프로젝트
주요 기술
Spring Boot, MySQL, Linux
역할
Naver Works API 문서 분석
DB 트리거 구현 및 로그 테이블 설계
Systemd 서비스 유닛 파일 작성 및 구성
2. Motor Controller (9.30 ~ 11.29)
목적
센서를 통해 값을 측정하여 소형 전지의 불량 여부를 확인하는 시스템을 개발. 이 시스템은 스텝모터와 리니어 트랜슬레이션 스테이지를 활용하여 전지를 정밀하게 이동시키며, 측정된 값을 모니터링하여 프로그램을 통해 불량 전지를 식별하는 프로젝트입니다.
주요 기술
LabVIEW, Arduino, 스텝 모터
역할
모터 스펙 분석
다이어그램 설계 및 프로토콜 처리 방식 설계
모터 동작 함수 구현
3. Smart Tracker Map Viewer (11.01 ~ 11.11)
목적
스마트 트래커는 GPS를 활용해 현재 위치를 실시간으로 기록하는 장치입니다. 특정 시간마다 측정된 위치 정보를 Google Maps를 활용해 마킹합니다.
주요 기술
Springboot, Javascript, Mysql, Google Map API
역할
요구사항 분석 후 DB 데이터 조회
UI/UX를 고려하여 기능 구현 및 디자인
프로젝트
LoLStagram
개인
2024.02. ~ 진행 중
팀 구성 : 1명
목적: 목표로 하는 플레이어를 등록 또는 검색하여 해당 플레이어의 전적을 보며 동기를 얻고, 인상 깊었던 오늘의 플레이를 자랑할 수 있는 플랫폼
기술 스택: Springboot, JWT, React, MySQL, AWS EC2, Riot API, Docker
주요 내용
Riot API가 제공하는 플레이어 정보를 가공하여 플레이어 객체 생성
일반 로그인 및 소셜 로그인에 JWT를 이용한 인증 시스템 구현
매주 정해진 일자에 게임 패치 데이터를 자동 반영하여 서버 데이터 동기화 및 최신화 스케줄링
경기 정보 갱신 시 Circular Queue를 설계해 갱신 시간을 단축하고 정렬 과정을 없애 API 응답시간을 6초 -> 2.2초로 감소
프로젝트를 Docker로 컨테이너화 하고 git Actions를 이용해 EC2 서버에 CI/CD 파이프라인 구축
Device Error Notification System
(주) 네오택
2024.09. ~ 2024.10.
팀 구성: 2명
주요 내용
장비 상태 알림: 장치 테이블의 데이터를 주기적으로 확인하여 로그 테이블에 기록하는 트리거를 설정합니다. Spring Boot 애플리케이션이 일정 간격으로 로그 테이블을 확인하고, 에러가 기록된 경우 알림을 전송한 후 로그를 삭제합니다.
알림 전송: 에러가 발생한 장비의 정보를 지정된 양식으로 작성하여 API를 통해 특정 대상에게 알림을 보냅니다.
애플리케이션 관리: 애플리케이션 서버에 Spring Boot jar 파일을 배포 및 실행하고, 해당 인스턴스의 상태를 모니터링하며 로그를 기록합니다. 필요 시 자동 재실행을 위해 Systemd 서비스 유닛 파일을 작성했습니다. 이를 통해 Spring Boot 애플리케이션의 상태를 모니터링하고, 장애 발생 시 자동으로 복구 및 재실행하도록 구성했습니다.
데몬 상태 알림: 서버에서 실행 중인 데몬들의 상태를 확인하여 active 상태가 아닐 경우 알림을 보내는 파이썬 스크립트를 작성합니다.
파이썬 스크립트 관리: 파이썬 스크립트의 상태를 확인하고, 로그를 남기며 필요 시 재실행하는 로직을 담은 Systemd 서비스 유닛 파일을 만듭니다.
포트폴리오
자기소개
간단 자기 소개
안녕하세요. 지속적인 발전을 추구하며, 백엔드 개발에 열정을 가진 김정훈입니다. 학부시절 웹프로그래밍과 java 수업을 통해 처음으로 springboot를 이용한 웹 개발에 대해 흥미를 가진 뒤 네트워크, 데이터베이스 등의 흐름과 구조를 이해하고 설계하여 구현하는 과정에 재미를 느껴 백엔드 개발에 매진하고 있습니다.
직무에 대해 중요하다고 생각하는 점과 자신이 했던 노력
개발자는 언어를 다루는 사람이라고 생각합니다. 같은 의미여도 어떻게 표현하고 전달하느냐에 따라 가독성이 달라지고 개발의 속도가 달라집니다. 네이밍이 모호하거나 프로젝트의 각 서비스와 코드 단위 간의 의존성이 높아지면 팀원들이 코드를 이해하기 어려워지고 유지보수가 복잡해질 수 있습니다. 이를 방지하기 위해 객체 지향 프로그래밍(OOP) 원칙과 단일 책임 원칙(SRP)을 따르며, 각 기능별로 서비스를 분리하고 메서드명을 기능 중심으로 작성하여 가독성과 효율성의 균형을 맞추고자 노력했습니다.
물론 사람에게는 가독성을 높이는 코드가 최우선일 수 있지만, 기계 관점에서는 성능 저하로 이어질 위험도 간과할 수 없습니다. 예를 들어, 경기 정보 업데이트 로직에서 Java의 기본 Sorting 대신 Circular Queue를 설계해 정렬 부하를 줄였으며, 이를 통해 업데이트 시간을 6초에서 2.2초로 단축했습니다. 비록 초기에는 해당 로직을 이해하는 데 어려움이 있을 수 있지만, 팀원 간 원활한 의사소통을 통해 극복할 수 있습니다.
개발자는 흔히 새로운 기술을 배우는 것을 좋아해야 한다고 합니다. 저는 새로운 기술이 최신 버전이나 개선된 기술뿐 아니라, 경험해보지 못한 구기술도 포함된다고 생각합니다. 실제 회사에서는 출시되지 않은 프로젝트라 하더라도 개발 시작일 때문에 예전 버전으로 개발이 진행된 경우도 있으며, 기능을 업데이트할 때도 기존 프로젝트의 버전이 현재보다 낮은 경우가 있습니다.
알림 시스템에 참여하면서 기존 디바이스 프로젝트 코드를 분석해야 했는데, 해당 프로젝트는 JSP, XML Mapper, MyBatis로 개발되어 있었습니다. 레거시 프로젝트에서 사용된 JSP와 MyBatis 같은 구기술을 처음 접했을 때, 왜 이런 기술이 여전히 쓰이는지 의문이 들었습니다. 하지만 해당 스택으로 만들어진 소프트웨어가 실제로 상용 중이며 유지보수가 필요하다는 현실을 접하면서, 구기술에 대한 이해 또한 중요하다는 것을 깨달았습니다. 단순히 최신 기술을 따라가는 것만이 아니라, 기존 시스템에 맞춰 구기술을 수용하고 활용할 수 있는 능력 역시 개발자로서 필수적이라는 생각을 하게 되었습니다. 이러한 마음가짐 덕분에 레거시 시스템을 보다 유연하게 이해하고 분석할 수 있었으며, 이를 통해 새로운 기술과 기존 기술을 조화롭게 다루는 역량을 기를 수 있었습니다.
프로젝트 경험
프로젝트를 하더라도 내가 좋아하는 장르의 프로젝트를 해보자 라는 생각에 LoLstagram
이라는 1인 프로젝트를 계획했습니다. 이 사이트는 게임 전적을 검색하고 포스팅 기능을 통해 친구들과 경쟁하고 자랑할 수 있는 플랫폼입니다. 게임사의 Open API를 활용해 필요한 데이터를 분석한 후 캐릭터와 아이템의 이미지 데이터를 확보하고, 게임 내 정보를 JSON으로 받아와 사용자의 정보를 업데이트하는 데 활용했습니다.
또한, 게임 패치가 주기적으로 발생하는 상황에서 서버 데이터를 어떻게 효율적으로 최신 상태로 유지할지에 대한 고민도 있었습니다. 이를 위해 스케줄링 시스템을 도입하여 매주 정해진 시간에 자동으로 게임 패치 데이터를 반영하도록 설정했습니다. 이 과정에서 새로운 데이터만을 업데이트 하기 위해 removeAll을 활용해 기존 데이터와 신규 데이터를 비교하여 중복 업데이트 문제를 해결했습니다.
사용자 정보 보호를 위해 더 안전한 인증 방식을 구현해 보고 싶어 로그인에 JWT 로직을 추가하고, OAuth2와 JWT를 결합하여 인증을 구현했습니다. Spring Security를 통해 보안 필터 체인, API 접근 권한 관리, CORS 설정 등을 이해하고 적용하는 기회를 가졌습니다.
마지막으로, 프로젝트를 운영하면서 배포 자동화의 필요성을 느꼈습니다. 서버 운영 중 수동 배포로 인한 오류를 최소화하기 위해, Docker를 이용해 컨테이너화하고 Git Actions를 활용한 CI/CD 파이프라인을 구축하여 EC2 서버에 자동 배포 시스템을 구현했습니다. 이를 통해 배포 속도를 개선하고, 운영 효율성을 높일 수 있었습니다.
성격 및 장단점
행동의 원인과 이유를 중요하게 생각합니다. 어떠한 기획을 하거나 기술을 선택할 때, 원인 관계가 적절하지 않다면 더 나은 방향을 제시하는 편입니다. 커뮤니케이션에 있어서도 매우 적극적인 편으로, 과제나 팀 프로젝트를 할 때 의견을 적극적으로 제시하고 협의하는 것이 업무 이해에 큰 도움이 됐습니다. 특히 개발 직군은 협업이 잦기 때문에 일정, 코드 스타일 등을 소통을 통해 맞춰 나가는 것이 중요하다고 생각합니다.
제 단점은 빈말을 잘 하지 못하는 것입니다. 원인과 이유를 중시하는 성격 탓에, 무언가를 말할 때 항상 그 근거와 논리를 생각하게 됩니다. 이러한 성향은 문제 해결과 기획에 있어 강점이 될 수 있지만, 의도치 않게 감정을 상하게 할 수 있기 때문에 상대방을 존중하고 배려하는 선에서 의견을 제시하고자 노력하고 있습니다.
인턴 활동 중 BMS 프로젝트에서 컴포넌트 구성 방식을 분석하여 데이터를 불러올 때 DB를 거치지 않아도 됨을 깨닫고 대리님께 로직의 수정을 제안했습니다. 처음에는 대리님께 무례한 행동을 하는 건 아닌가 라는 생각이 들었지만, 확실한 논리를 기반으로 하되 유연하게 의사소통을 하면 오히려 더 좋은 결과를 얻을 수 있다는 점을 깨닫게 되었습니다. 대리님도 제 제안을 긍정적으로 받아들였고, 이후 개선된 로직이 프로젝트의 효율성을 높이는 데 기여하게 되었습니다.
이 경험을 통해, 논리를 기반으로 한 의견 제시에 적절한 사회성, 정중한 태도가 더해지면 오히려 관계를 해치기보다는 더 나은 결과로 이어질 수 있음을 배웠습니다.
교육
동아대학교
대학교(학사) | 컴퓨터공학과
2019.03. ~ 현재 | 재학 중