미리보기
기본 정보

"모방이 아닌, 이해를 통한 활용", "결과로써 과정을 입증한다" 를 모토로 삼고 지식을 추구하고 있는 개발자 유제환입니다. 백엔드/서버개발 경력으로 2년의 경험이 있으며, 주로 Spring Boot, PostgreSQL, MY-SQL, JPA, QueryDSL, WebSocket, Amazon Web Services 등을 사용하여 작업했습니다. 저의 목표는 Flutter 를 이용한 앱개발과 함께 풀스택을 목표로 하고 있습니다. 단순 모방이 아닌 이해를 통한 활용으로 자신이 이해한 개념을 프로그램에 도입하는 것을 즐깁니다. 코드가 갖는 문제/한계점을 발견하면 이를 해결하기 위해 끊임없이 생각하는 것을 좋아합니다. 코드의 구성과 설계에 대해서 다양한 시각 및 관점에서 이야기를 들어보고 의견 나누는 것을 원합니다.
기술 스택
Spring Boot, JPA, Flutter, dart, Java, Kotlin
경력
미림미디어랩주식회사
선임 | DX연구팀
2022.09. ~ 2024.09. (2년 1개월)
웹 서비스 서버 개발자로서 연매출 100억의 이러닝 미디어 콘텐츠 제작 기업 LMS 개발 및 자사 솔루션 플랫폼 개발, 기존 LMS 유지보수 업무를 담당했습니다.
프로젝트
PPT_Video 비교 프로그램
미림미디어랩
2024.05. ~ 2024.09.
📝 Description
이 프로젝트는 자사 영상 제작 프로세스에서 활용되는 도구로, 간단하게 작성된 콘티 PPT와 완성된 영상 간의 유사도를 비교하는 프로그램입니다. 영상의 장면을 추출하고, 이를 PPT와 비교하여 유사도가 20% 이하인 경우 경고 표시를 추가하여 결과물을 생성합니다.
주요 개발 기능
영상의 각 장면을 이미지로 추출하고 OCR(문자인식)을 통해 텍스트로 변환 후 저장
OCR 결과와 콘티 PPT의 텍스트를 비교하여 유사도를 계산 및 저장
유사도가 낮은 장면에 경고 표시를 추가한 최종 결과 PPT 생성
⚒ Used Stacks
Python: 프로그램의 핵심 로직 구현
EasyOCR: 영상 장면에서 텍스트를 추출
PPTX: 결과 PPT를 생성 및 수정
cosine_similarity: 텍스트 유사도 계산
TfidfVectorizer: 텍스트 벡터화 및 비교
🖼 Result
https://github.com/dbwpghks56/automatic_video_inspection.git
📃 Review
이번 프로젝트는 영상 제작 과정에서 품질 관리와 효율성을 동시에 높이는 데 초점을 맞춘 도구를 개발했다는 점에서 의미가 깊었습니다.
다음은 프로젝트에서 느낀 점과 배운 점입니다.
OCR 및 텍스트 유사도 알고리즘 학습
EasyOCR을 활용하여 영상의 장면을 텍스트로 변환하는 과정에서 OCR의 정확도와 한계점을 이해할 수 있었습니다. 또한 cosine similarity와 TfidfVectorizer를 활용하여 유사도를 계산하면서 자연어 처리(NLP)에 대한 기초적인 지식을 적용할 기회가 되었습니다.
PPT 자동화 프로세스 경험
Python의
python-pptx
라이브러리를 사용해 PPT를 자동으로 생성하고 수정하면서, 업무 자동화를 위한 스크립트 작성 능력을 더욱 발전시킬 수 있었습니다.문제 해결 능력의 성장
OCR 과정에서 영상의 해상도와 텍스트 인식률이 낮아지는 문제를 해결하기 위해 이미지 전처리와 텍스트 데이터 보완에 시간을 투자했습니다. 이러한 경험을 통해 비정형 데이터 처리에 대한 자신감을 얻을 수 있었습니다.
CodeU
미림미디어랩
2023.11. ~ 2024.09.
📝 Description
이 프로젝트는 Learning-Code에서 개발한 기존 실습기에 다음 기능을 추가하고 고도화한 프로젝트입니다:
온라인 컴파일러 기능 개선 및 동기화 문제 해결 AI GPT 기반의 채팅 기능 연동 다국어 지원 기능 추가
프로젝트는 모놀리스 아키텍처로 구성되었으며, 폴더 구조는 Package by Feature 방식을 따릅니다.
주요 개발 기능
CRDT 알고리즘 구현: Node.js와 Y.js를 활용하여 실시간 협업(페어 프로그래밍)을 지원
온라인 컴파일러 기능 구현: Webhooks(HTTP callbacks)을 활용한 실시간 실행
국제화(i18n): 프론트엔드에서 다국어 지원
Comment 기능: 실시간 피드백 지원
Redis를 이용한 서버 확장성(Scale-out) 구현
API 문서화: Swagger를 활용한 명세 작성
AWS 기반 서버 인프라 구축
CI/CD 파이프라인: GitHub, Jenkins, Shell script를 이용한 배포 자동화
Problem Solving
💡 Node.js와 Y.js를 이용한 CRDT 구현
문제: Y.js는 Java를 지원하지 않아 기존 Java 서버와의 통합이 어려웠습니다.
해결: CRDT가 필요한 실시간 기능(예: 댓글, 동기화 등)을 Node.js 기반의 Y.js 서버에서 처리하도록 아키텍처를 변경했습니다.
Y.js는 내장된 CRDT 알고리즘으로 동시성 및 순서를 자동으로 보장하기 때문에 비교적 간단히 적용할 수 있었습니다. </aside>
💡 WebSocket과 Redis를 활용한 확장성 문제 해결
문제: WebSocket 서버는 단일 연결에서 최대 65,535개의 커넥션만 지원해 확장성이 제한되었습니다.
해결: Redis의 pub/sub 기능을 사용하여 다수의 WebSocket 서버가 동일한 데이터를 공유할 수 있도록 설계했습니다.
Redis가 데이터를 pub 하면, 이를 sub한 서버들이 데이터를 수신하여 WebSocket으로 클라이언트에 전달하도록 구성했습니다. </aside>
📃 Review
이번 프로젝트는 제가 오랫동안 구상했던 온라인 코딩 시스템 고도화를 실현한 경험이었습니다.
새로운 기술(Node.js, Redis, Webhooks, i18n 등)과 요구사항들을 처음 접하면서 두려움이 컸지만, PM과의 협업을 통해 하나씩 해결할 수 있었습니다.
특히 Redis의 pub/sub 활용, Y.js를 통한 CRDT 구현, 국제화 지원 등은 실무에서 처음 시도해본 도전이었지만, 이를 완성하며 큰 성취감을 느꼈습니다.
이 경험은 저에게 기술적 자신감을 심어주었고, 앞으로 더 복잡한 시스템 설계와 구현에 도전할 수 있는 동기가 되었습니다.
⚒ Used Stacks
JDK 17
Gradle
Spring Boot 3.1.5
DDD
PostgresQL
JPA
QueryDSL
Flyway
Jenkins
Swagger 3
Docker
Redis
Web Socket & Stomp
AWS
Sentry
Node.js + Y.js
worknet 크롤링
미림미디어랩
2023.06. ~ 2023.07.
📝 Description
이 프로젝트는 Worknet에서 고용허가제에 관련된 내용을 포함한 공고를 크롤링하여 정보를 추출하고, 이를 Excel 파일로 저장하는 프로그램입니다.
주요 개발 기능
Python과 Selenium을 이용한 웹 크롤링 자동화
Worknet에서 특정 조건에 맞는 공고 데이터 추출
추출한 데이터를 Excel 파일로 저장
⚒ Used Stacks
Python
Selenium
PyInstaller
🖼 Result
https://github.com/dbwpghks56/worknet_job.git
📃 Review
Spring Boot를 사용해 서버 개발을 진행하면서, 대학 시절 배운 HTML 지식을 사용할 일이 거의 없었습니다. 그러나 Python과 Selenium을 이용해 크롤링 프로그램을 개발하는 과정에서 HTML 구조에 대한 기본 지식이 필요하다는 점을 다시 한번 느꼈습니다.
이번 프로젝트를 통해, 현재 개발 업무에 직접적으로 사용되지 않더라도 기본 지식을 갖추는 것이 얼마나 중요한지 깨닫게 되었습니다.
Chat Module Server
미림미디어랩
2023.05. ~ 2023.06.
📝 Description
이 프로젝트는 자사의 다양한 웹 애플리케이션에 채팅 기능을 도입하기 위해 설계된 익명 채팅 서버입니다. 주요 목표는 여러 웹 애플리케이션에서 재사용 가능한 모듈화된 채팅 시스템을 구축하는 것이었습니다.
주요 개발 기능
익명 채팅 서버 개발: WebSocket과 STOMP를 이용한 실시간 익명 채팅 기능 구현
모듈화 설계: 다양한 웹 애플리케이션에서 쉽게 통합 가능하도록 설계
테스트 기반 개발(TDD): JUnit 5를 활용하여 주요 기능의 안정성을 확보
문서화: Swagger 3를 활용하여 API 명세 작성
클라우드 배포: nCloud를 활용한 서버 배포 및 운영
⚒ Used Stacks
Kotlin
Spring Boot 2.7.4
Gradle
MySQL
Swagger 3
nCloud
JUnit 5
DDD, TDD
JDK 11
Web Socket & Stomp
📃 Review
이번 프로젝트는 자사가 운영하는 다양한 웹 애플리케이션에 채팅 기능을 모듈화하여 적용하기 위한 첫 시도였습니다.
특히 기존 KDT의 Chat 시스템을 참고하여 모듈화를 시도했고, 관리자 분들로부터 긍정적인 피드백을 받으며 다른 웹 애플리케이션에서도 활용하고 싶다는 요청을 받았습니다. 이 과정에서 큰 자부심을 느낄 수 있었습니다.
프로젝트 진행 중에는 다음과 같은 도전과 성취가 있었습니다:
Kotlin으로 전환한 Spring Boot 개발
기존 Java로 개발하던 방식에서 Kotlin으로 전환하며 새로운 언어의 문법과 철학을 학습해야 했습니다. Kotlin의 고유 기능(예:
null-safety
, 확장 함수, 데이터 클래스 등)을 최대한 활용하려 노력했습니다. 이 과정에서 초기에는 어려움이 있었지만, 코드의 간결성과 효율성을 경험하며 성장할 수 있었습니다.테스트 기반 개발(TDD) 실천
TDD를 도입하여 프로젝트 안정성을 높였습니다. 각 기능의 예상 동작을 테스트 코드로 먼저 정의하며, 설계 단계부터 더욱 신중하게 접근하게 되었습니다.
모듈화 설계
다양한 웹 애플리케이션에 재사용할 수 있도록 구조를 모듈화하면서, 유연성과 확장성을 고려한 설계를 구현했습니다.
이번 프로젝트를 통해 새로운 기술(Kotlin)을 학습하고 실무에 적용하는 즐거움을 느낄 수 있었습니다. 앞으로도 최신 기술을 학습하며 보다 효율적인 시스템을 설계하고 싶습니다.
Learning-Code (LMS)
미림미디어랩
2023.01. ~ 2023.04.
📝 Description
KDT 학습 관리 시스템(LMS) 백엔드 개발
자사 러닝핏(LearningFit)에서 운영 계획 중인 KDT 교육 프로그램을 위한 학습 관리 시스템(LMS)을 개발했습니다.
주요 기능으로는 실시간 페어 프로그래밍, 실시간 채팅, 알림, 온라인 컴파일러, 그리고 LMS의 핵심 기능들이 포함됩니다.
주요 개발 기능
OAuth 2.0 및 JWT: Stateless WAS 서버 구축으로 사용자 인증 및 역할(ROLE) 기반 접근 제어 구현
Socket 서버 구축: 실시간 통신 기반 실시간 페어 프로그래밍 및 채팅 서버 개발
온라인 컴파일러 기능 구현: 실시간 코드 실행 및 결과 제공
API 문서화: Swagger 3를 이용한 API 명세 작성
Kafka 도입: 동시성 문제 해결 및 안정적인 메시지 브로커 역할
배포 자동화: GitHub + Jenkins + Shell Script 기반 CI/CD 파이프라인 구축
클라우드 인프라 구축: nCloud를 활용한 클라우드 서버 및 데이터베이스 구성
Problem Solving
💡 실시간 통신의 싱크 문제
문제점:
실시간 페어 프로그래밍 중 서로 다른 유저가 동일한 행(line)을 동시에 수정할 경우 싱크가 어긋나는 문제가 발생.
해결방안:
Kafka를 활용한 동시성 해결 및 버퍼링 기능 구현
Kafka의 파티션과 키(Key)를 활용하여 메시지 순서를 보장
테스트를 통해 최적의 버퍼링 시간을 설정하여 싱크 문제 완화
향후 개선 계획: OT(Operational Transformation) 또는 CRDT(Conflict-Free Replicated Data Types) 알고리즘 도입으로 싱크 안정성 강화 </aside>
📃 Review
이번 프로젝트는 제가 회사에서 처음 맡은 업무로, KDT 학습 관리 시스템이라는 큰 프로젝트의 백엔드 개발을 담당했습니다. 처음에는 규모와 책임에 대해 부담을 느꼈지만, 설레는 마음으로 도전했습니다.
주요 경험 및 배움:
실시간 페어 프로그래밍 설계
실시간이라는 특성을 고려하여 한 글자 단위로 통신하도록 설계했습니다. 서버 부하를 줄이기 위해 REST API 서버와 실시간 통신 서버를 분리하였으며, Kafka를 활용해 안정성을 확보했습니다.
새로운 기술 도입과 협업
Kafka를 처음 도입하면서 학습과 테스트 과정에서 많은 시행착오를 겪었습니다. 그러나 팀원들과의 긴밀한 협업과 지속적인 논의를 통해 문제를 해결할 수 있었습니다. 또한 JWT와 OAuth 2.0을 활용한 사용자 인증 체계를 설계하며 실무 경험을 확장할 수 있었습니다.
플랫폼 구축의 전 과정 경험
기획부터 구현, 테스트, 배포까지 프로젝트 전 과정을 경험하며 개발자로서의 시야가 넓어졌습니다. 특히 클라우드 인프라 구성과 CI/CD 파이프라인 구축은 프로젝트를 더욱 체계적으로 운영할 수 있는 계기가 되었습니다.
이 프로젝트를 통해 새로운 기술을 배우는 즐거움과 팀워크의 중요성을 다시금 느꼈습니다. 도전과 성공의 경험이 개발자로서 저를 한 단계 더 성장하게 만들었다고 생각합니다.
⚒ Used Stacks
언어: JDK 11
프레임워크: Spring Boot 2.7.4
빌드 도구: Gradle
인증: OAuth 2.0(Kakao, Google, Naver), JWT
데이터베이스: MySQL 8.0
ORM: JPA, QueryDSL
배포 및 운영: nCloud(클라우드 DB, Object Storage)
테스트: Jenkins, Swagger 3
메시지 브로커: Kafka
실시간 통신: WebSocket & STOMP
유지보수
미림미디어랩
2022.09. ~ 2024.09.
📝 Description
자사의 자체 개발 프로젝트인 learningfit 과 충남도로교통연수원의 LMS 웹의 서버 유지보수를 하였습니다.
주요 개발 기능
Learningfit 및 충남도로교통연수원 LMS 서버 유지보수
⚒ Used Stacks
Spring Boot 2.7.4
Gradle
MySQL
Swagger 3
nCloud
JUnit 5
DDD, TDD
JDK 11
맑은 프레임워크 ( Learningfit )
🖼 Result
📃 Review
선배들이 먼저 작성한 코드들을 이해하고 그 의도에 맞춰 추가 기능을 개발 및 보수하는 작업은 쉽지 않았습니다.
선배들의 의도를 우선적으로 파악하고 이해하기 위해서는 선배들과의 소통 및 제가 알고 있는 지식과 의도보다 한 단계 위의 것을 필요로 했습니다.
첫 업무 및 지속된 업무가 유지보수인 것이 불만이 아니라고 하기에는 어폐가 있겠지만, 시야를 넓히는 것과 성장하는 과정에서는 필수라 생각되었고 유지보수에 대한 편견이 사라지게 되었습니다.
포트폴리오
교육
대진대학교
대학교(학사) | 컴퓨터공학전공
2018.03. ~ 2022.02. | 졸업
자격증
정보처리기사
1급 | 한국산업인력공단
2021.11.