안녕하세요! 개발자 유승현입니다!
저는 전기공학 학사를 마치기 전 졸업논문으로 Python을 사용하여 연구실 도구를 디지털화하며 개발을 시작했습니다.
그리고 나아가 졸업 후 Spring Boot와 WebSocket으로 팀 프로젝트와 개인 채팅 서비스를 완성하며 개발 역량을 쌓았습니다.
좋은 개발자는 개발 실력 뿐만 아니라 문제를 정확히 정의하고 해결하는 힘도 필수적이라고 생각합니다. 앞으로도 꾸준히 역량을 쌓고, 깊이 고민하며 그 과정을 기록하고 발전하는 개발자가 되겠습니다!
프로젝트 / 연구경험
각 프로젝트별 기술을 사용하면서 경험했던 문제들과 해결방법 등을 위주로 작성한 학습 블로그와 깃허브를 링킹해두었습니다!
담당한 프로젝트를 최신 순으로 구성했습니다!
-
- 실시간 채팅 애플리케이션 개발 및 AWS EC2 배포.
- 데이터베이스 접근이 많을 수밖에 없는 실시간 채팅 서비스의 특성을 고려하여, 효율적인 데이터 처리 방안을 중점적으로 고민하고 구현했습니다.
- 프라이빗 채팅 서비스의 특성을 고려하여, 보안 강화를 위해 WebSocket 보안 전략을 고려하고 적용해봤습니다.
- 직관적인 UI/UX를 위해 HTML, CSS 와 JavaScript를 적극 활용하여 프론트엔드를 만들었습니다.
프로젝트 완료 후 작성한 정리글, 구현예시 및 시스템 아키텍쳐 포함
실제 운영 중인 서비스 주소입니다. 실제 서비스를 경험해보고 싶어서 AWS에 업로드했습니다. WebSocket은 HTTPS 환경에서만 동작하기 때문에 SSL 인증도 받았습니다.
프로젝트 구조 :
프론트엔드
- 기술: HTML, JavaScript, WebSocket (STOMP), CSS
- 주요 역할: 사용자가 채팅 서비스를 직접 경험하는 인터페이스로, 실시간 메시지 표시와 사용자 입력을 처리
- 데이터 처리: 백엔드에서 설계된 RESTful API를 호출하여 사용자 정보, 채팅방 목록, 과거 메시지 등 데이터를 가져와 화면에 렌더링
- 실시간 통신: WebSocket과 STOMP 프로토콜을 활용해 백엔드와 실시간 양방향 통신을 구현, 새 메시지 도착 시 즉시 화면에 반영
- UI/UX: CSS를 사용해 채팅창, 버튼, 메시지 버블 등을 시각적으로 꾸며 사용자 경험을 개선
- JavaScript 역할: DOM 조작, 이벤트 처리(예: 메시지 전송 버튼 클릭), WebSocket 연결 관리 및 STOMP 메시지 구독/발행을 담당
- 예시: 사용자가 메시지를 입력하고 전송 버튼을 누르면, JavaScript가 WebSocket을 통해 백엔드로 메시지를 보내고, 실시간 응답을 받아 화면에 표시
백엔드
- 기술: Java, Spring Boot, WebSocket, MySQL, JPA, Redis
- 모든 API는 프론트엔드 데이터 상호작용을 위해 RESTful하게 설계
- 개발 초점: 효율적인 리소스 사용과 서버 과부하 감소
Redis 사용 및 최적화
- 채팅 서비스의 빈번한 CRUD 요청으로 인해 성능 최적화를 위해 도입
- 모든 메시지를 직접 데이터베이스에 저장하지 않아 서버 과부하 방지
- 서비스 규모가 커질수록 직접 DB 접근 방식이 병목 현상을 유발할 가능성이 높아 이를 방지
- 예: 메시지를 Redis에 먼저 저장 후, Spring 스케줄링으로 30분마다 DB에 일괄 동기화
- 주요 과제: Redis, 데이터베이스, 사용자 인터페이스 간 데이터 동기화
ERD 구조:
테이블 설명
users
사용자 정보 저장chat_rooms
채팅방 정의messages
메시지 기록chat_room_users
사용자-채팅방 관계
관계
users
-messages
한 사용자가 여러 메시지 작성 (1:N)chat_rooms
-messages
한 채팅방에 여러 메시지 포함 (1:N)users
-chat_rooms
다대다 관계를 chat_room_users로 연결 (N:M)
트러블슈팅 및 기술 사용 기록
- 메세지별 읽음 안 읽음 처리 구현의 어려움
각 메세지의 읽지 않은 유저의수(unread count)를 추적하는 두 가지 방법과 그 구현의 어려움을 정리.
- Spring WebSocket에서
@AuthenticationPrincipal이 null인 것 해결하기
스프링 security 기능인 CustomUserDetails가 websocket 요청에서는 동작하지 않는 문제.
- Redis와 WebSocket 기반 채팅 목록
리프레시 및 알림 시스템
새 메시지 도착 시 채팅 목록을 실시간으로 리프레시하고 알림을 표시하는 시스템을 Redis와 WebSocket으로 구현.
- Redis 기반 채팅 리스트 읽음/읽지 않음 알림
시스템
Redis로 채팅 리스트의 읽음/읽지 않음 상태를 실시간 관리.
- Redis 기반 채팅 메시지 저장 및 성능
개선
Redis를 활용해 채팅 메시지 저장 성능을 개선하고 MySQL 과부하를 방지.
- Websocket 보안 방식 변경 방법 2
웹소켓 보안 방식 업데이트: 쿠키 방식 도입.
- Websocket 보안 방식 변경 방법 1
웹소켓의 보안방법 취약점과 해결방법.
- Spring Boot 앱의 정적 HTML 파일 url .html 없애기. (프론트와 백 서버 나누기)
정적 파일(static) ec2에 올려서 스프링과 다른 서버에 있게 하기.
- JPA에서 JdbcTemplate로 bulk update 최적화
JPA의 saveAll의 비효율성과 JdbcTemplate으로 해결방법.
-
- 팀장으로서 Java, Spring Boot, MySQL, MyBatis, Thymeleaf를 활용해 CRUD 기능 포함 to-do 게시판 개발했습니다.
- 팀원 간 조율하며 GitHub로 브랜치 관리 및 충돌 해결. 협업과 리더십 역량를 강화했습니다.
- 착수, 분석, 설계, 개발, 검수, 구현 단계를 거쳐 프로젝트 완료 보고서 및 사용자 메뉴얼까지, 실제 실무와 비슷한 산출물들을 갖추고 개발했습니다.
프로젝트 구조 :
- 기술:
-
Java, Spring Boot, MySQL, MyBatis, Thymeleaf, HTML, JavaScript, CSS
- 설명:
-
팀장으로서 4인 팀을 이끌며 Spring Boot와 MyBatis로 CRUD 기능이 포함된 To-Do 게시판을 개발했습니다. Thymeleaf로 동적 UI를 구현해 사용자가 태스크를 추가, 수정, 삭제할 수 있게 했고, MySQL로 데이터를 관리했어요. Git/GitHub로 협업하며 팀원 간 실력 차이를 조율한 경험이 특히 기억에 남습니다.
ERD 구조:
테이블 설명
USER
사용자 정보 관리 (USER_ID, NAME, LEVEL_ID, TOTAL_POINT 등)MAIN_TASK
주요 태스크 기록 (MAIN_TASK_ID, USER_ID, CATEGORY_ID, TASK_STATUS_ID)POINT & USER_POINT
포인트 시스템 (POINT_ID, USER_ID 연결)LIKES & REPLY
소셜 상호작용 (USER_ID, MAIN_TASK_ID 연결)
관계
USER
-MAIN_TASK
1:N, 사용자가 여러 태스크 생성MAIN_TASK
-SUB_TASK
1:N,주요 태스크에 여러 하위 태스크 포함USER
-USER_POINT
1:N,사용자가 여러 포인트 획득USER
-LIKES/REPLY
1:N, 사용자가 여러 좋아요/댓글 작성USER
-FOLLOW
N:M, 팔로워-팔로이 관계 (FOLLOWER_ID, FOLLOWEE_ID)
트러블슈팅 및 기술 사용 기록
- Planet Now 프로젝트 개발 중 발생한
문제와 해결 방법
프로젝트 진행 중 문제발생과 해결방법.
- Https ssl인증 받기 및
websocket 통신 방법 정리
aws에서 https 인증 받기.
산출물 구글 드라이브 링크
-
- 전기철도 실험기계의 전압강하 및 단락 분석 도구를 Python으로 디지털화한 소형 시뮬레이터 개발했습니다.
- OOP 기반 알고리즘 설계와 Tkinter로 UI 구현을 담당했습니다.
- 현재도 연구실에서 학부생 실험 도구로 사용 중입니다.
- 지도교수님으로부터 학업 및 프로젝트 성과를 인정받아 추천서를 받았습니다.
- 기술:
-
Python, Tkinter
- 설명:
-
Warsaw University of Technology 학사 졸업 논문으로 개발한 Python 기반 3kV DC 철도 전원 시스템 가상 시뮬레이터입니다. 전통적인 물리적 실험을 대체하기 위해 전압 강하, 변전소 성능, 단락 시나리오, 전류 분배를 분석하는 도구를 만들었어요. Tkinter로 GUI를 설계해 사용자가 직관적으로 철도 전기 매개변수를 조정하고 실시간 계산 결과를 확인할 수 있게 했습니다.
배포를 위해 사용한 github repository 주소. (Readme O)
학사 졸업 논문
2025년 02월 - 2025년 03월
✔️ 나만의 카카오톡 만들기 — WebSocket 기반 메신저 서비스
2025년 01월 - 2025년 02월
✔️ Plan it Now — Java Spring 기반 to-do 게시판 개발
2024년 02월 - 2024년 06월
✔️ 전기철도 DC 전원 시스템 디지털화 — 학사 졸업 논문 프로젝트
마치며
저는 개발자에게 코딩 실력만큼이나 중요한 건 단순히 "무엇을 했는지" 나열하는 게 아니라 "왜 했는지", "어떻게 했는지", "무엇을 배웠는지"를 보여주는 과정, 문제를 정의하고 해결하는 힘이 중요하다고 생각합니다.
그리고 결국 개발도 사람들이 하는 거기에 결과만큼 중요한 건 이 과정에서 함께하는 팀과 명확히 전달하는 커뮤니케이션 능력이 정말 중요하다고 생각합니다.
팀 프로젝트에서 팀원을 이끌고, 문제를 해결하며 배운 점을 블로그에 기록한 경험은 이런 가치를 깨닫게 했습니다.
앞으로도 기술적 성장뿐만 아니라 소통을 통해 함께 발전하는 개발자가 되기 위해 노력하겠습니다. 제 포트폴리오를 읽어봐주셔서 정말 감사합니다!