본문 바로가기

전체 글191

[재머시뮬레이터] WebSocket 다른 PC에서 접속되지 않는 문제 해결 1. 문제 상황Spring Boot 에서 STOMP 기반 WebSocket 기능을 구현했습니다. 서버에서는 다음과 같이 /ws 엔드포인트를 열어두었습니다.@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws") .setAllowedOriginPatterns("*"); } @Override public voi.. 2026. 5. 18.
요구사항 정의서 재정의 과정 프로젝트를 진행하면서 요구사항 정의서를 작성했지만, 단순히 기능을 정리하는 작업이라기보다는 설계 기준을 다시 잡는 과정에 가까웠습니다.이번 글에서는 요구사항 정의서를 작성하게 된 배경과, 그 과정에서 겪은 문제 그리고 해결 방법을 정리해보려고 합니다.1. 문제 상황 - 같은 기능을 다르게 이해현재 프로젝트는 큰 주제와 방향은 정해져 있지만, 세부적인 구현 방식은 계속 변경되는 상황이었습니다.이 과정에서 백엔드와 프론트엔드가 각각 설계를 진행하면서 문제가 발생했습니다.요구사항 정의서, 인터페이스 정의서, UI 설계가 서로 맞지 않음같은 기능을 보고도 서로 다르게 해석결과적으로 문서는 존재했지만, 서로 연결되지 않고 따로 노는 상태가 되어버렸습니다.2. 문제의 원인 - 기준이 되는 흐름 3. 해결 방법 -.. 2026. 4. 21.
요구사항, 인터페이스, UI가 전부 어긋난 이유와 다시 정리한 과정 1. 문제 상황프로젝트를 진행하던 중 요구사항 정의서, 인터페이스 정의서, UI 정의서가 서로 맞지 않는 문제가 발생했습니다.요구사항 기준으로 만든 API가 UI와 맞지 않음UI 기준으로 만든 기능이 요구사항과 다름인터페이스 정의서가 요구사항과 매치가 되지 않는 부분이 일부 생김즉, 문서들이 서로 기준이 아닌 상태였다.2. 원인 분석문제가 발생하는 이유는 명확했습니다. 기준이 되는 흐름 없이 문서를 각각 작성했기 때문요구사항 기능 단위로 작성됨UI는 화면 기준으로 작성됨인터페이스는 API 기준으로 작성됨결과적으로 같은 기능을 서로 다른 기준으로 정의하게 되었고 정합성이 깨졌습니다.3. 해결 방법3.1 흐름도를 기준으로 재정의문제 해결을 위해 전체 기능 흐름을 먼저 재정의했습니다. 기존에는 기능, 화면, .. 2026. 4. 20.
개발 공부를 다시 고민하게 된 이유 1. 서론작년 2월에 취업하고 난 뒤에 적응기를 거쳐서 실무를 하다 보니 개발 업무의 많은 부분이 기능 구현뿐만 아니라 문서 작성, 유지보수, 기존 코드 이해와 같은 작업에 집중되는 경우가 많았습니다.이 과정에서 느낀 점은 대학교에서 배웠던 CS 기초 지식들은 직접적으로 활용할 기회가 생각보다 많지 않다는 것이었습니다.물론 이러한 지식들이 전혀 필요없는 것이 아닌 구조 설계에 도움이 되지만 반복적으로 사용하지 않다보니 시간이 좀 더 지나면 기억이 흐릿해질 것 같은 느낌이 들었습니다. 2. 앞으로의 계획그래서 앞으로는 잊어버리기 전에 기초를 다시 정리하는 방향으로 공부를 진행하고자 합니다.단순히 이론을 다시 읽는 것이 아닌 직접 코드로 구현하고 정리하면서 실제로 이해한 내용을 기록하는 방식으로 운영할 계획.. 2026. 4. 8.
자바스크립트 기초 복습-변수, 조건문, 반복문, 함수 1. 이번 공부한 범위- 변수 (let, var, const)- 조건문 (if, if-else, switch)- 반복문 (for, while, do-while)- 함수 (function)회사를 다니면서 틈틈히 공부했었지만 블로그에 정리하지 않았으나 다시금 공부하면서 블로그에 정리하고자 합니다.2. 간단 요약변수var a = 10;let b = 20;const c = 30;변수는 사용 범위에 따라 3가지로 나뉩니다.전역 변수 : 함수 밖에서 선언, 프로그램 실행 시작부터 종료까지 생존지역 변수 : 함수 내에서 선언, 함수내에서만 사용가능블록 함수 : for 등 블록 내에서 선언된 변수전역 변수는 함수내에서 지역 변수와 이름이 같을 때 접근하기 위해서 this 키워드를 이용하면 접근할 수 있지만 let으로 .. 2026. 3. 30.
[Markdown] 글쓰기 연습하기 서론마크다운(Markdown)은 개발자 블로그에서 가장 흔하게 사용되는 문법 중 하나입니다.단순히 글자를 꾸미는 용도가 아니라, 글의 구조와 흐름을 설계하기 위한 도구라고 생각합니다.이 글에서는 마크다운의 주요 문법들을 살펴보면서,각 문법을 어떤 상황에서 사용하면 좋은지 정리해 보려고 합니다.헤더#, ##, ### 같은 헤더는 글의 목차를 만들고 구조를 짜는데 사용됩니다.# 제목 (H1) : 글 전체의 제목으로 쓰거나, 아주 큰 대단원을 나눌 때 사용됩니다.## 소제목 (H2) : 템플릿의 큰 섹션을 나눌 때 사용됩니다. (예 : 1. 배경, 2. 문제)### 세부 제목 (H3) : 소제목 안에서 내용을 더 쪼갤 때 사용됩니다, (예 : 1.1 배경의 예)인용구단순히 인용할 때 뿐만 아니라, 글의 흐름상.. 2026. 1. 6.
[Git] 브랜치 간 폴더 단위 교체 서론오늘 협업 중 발생한 Git 브랜치 병합 충돌 문제를 해결한 과정을 정리해보고자 합니다. 상황은 다음과 같았습니다.GitHub 저장소에 main과 v2.0 두 개의 브랜치가 있고, 팀원과 나는 각각의 폴더를 수정 중이었습니다. 그런데 서로 다른 시점에 작업하다 보니 업데이트 충돌이 생겼습니다. 그래서 다음과 같은 해결 방법을 찾았습니다.팀원이 수정한 폴더는 그대로 유지내가 수정한 폴더는 완전히 교체불필요한 충돌 없기 푸시문제 상황서로 다른 시점에 커밋했기 때문에, 병합 시 충돌이 발생했습니다. 매번 혼자 깃허브를 사용하고 협업으로 깃허브 사용이 처음이다 보니 푸시에 충돌이 나서 이를 매번 수동으로 해결해야 했습니다.내 폴더만 교체하기브랜치의 기존 폴더는 삭제하고 로컬 폴더 업로드 하기main 브런치 .. 2025. 11. 10.
[트러블 슈팅] 영상 분석 속도 문제 1. 문제 상황기존에는 RTSP 서버에서 전송하는 영상이 프론트엔드에서 직접 받을 수 없어 이를 위해 중개하는 서버를 발전시켜 영상 분석 기능을 추가하는 과정에서 2025. 10. 16.
[트러블 슈팅] 역직렬화 에러 발생 1. 문제 상황저번 주, 진행 중인 프로젝트에 대해 발주 업체로부터 피드백을 받았고, 해당 피드백을 반영하여 수정 작업을 진행했습니다.프론트엔드 파트에서 백엔드 수정 사항에 맞춰 작업하던 중, 특정 테이블이 조회되지 않는 문제가 발생했습니다.증상테이블 목록 조회 API 호출 시 데이터가 반환되지 않음개별 id로 조회 시 일부 데이터는 정상 조회되나, 일부 데이터에서 content null 오류 발생2. 문제 원인초기에는 테이블 조회 시 일부 컬럼 값이 null 인 것이 문제가 될 거라고 생각하지 않았습니다.이유는 해당 컬럼은 null 허용 설정이 되어 있고, 과거에도 null 일 경우 예외가 발생하는 것을 발견했습니다. 그러나 에러 로그를 재확인한 결과, 특정 컬럼을 역직렬화하는 과정에서 해당 값이 nu.. 2025. 8. 13.
[2025.08.04] 배운 점 및 회고 작업 개요프로젝트/업무명 : 안티드론성능평가시스템/백엔드기간 : 2025.03.02 ~주요 기술 스택 : Java, MySQL, Spring Boot오늘 한 일MySQL 파티션 문제 해결실제 사용할 서버 컴퓨터 사전 설치터미널에서 명령어 입력 없이 쉽게 서버 실행을 위해 배치 파일 작성피드백 받은 부분 수정오늘 배운 점이벤트 스케줄러는 MySQL 서버가 켜져 있어야 작동함컴퓨터가 꺼져 있으면 이벤트는 실행되지 않으며, 이후에도 자동 보상 실행 안됨이벤트는 주 단위로 동작하며, 한 주 누락되더라도 다음 주 이벤트는 정상 실행됨파티션 오류를 해결하기 위해서는 수동으로 파티션을 추가해야 됨회고이번 오류는 주말에 회사 사무실이 더워지는 것과 대부분의 작업이 마무리 단계에 진입하여 주말에도 원격 접속을 하지 않기.. 2025. 8. 4.
[트러블 슈팅] 데이터베이스 파티션 문제 해결 문제 상황테스트를 진행할 장비가 없어서 장비 대신 데이터베이스에 데이터를 삽입 동작을 하는 FastAPI 서버가 데이터를 삽입하지 못하는 문제가 발생했습니다. 원인 분석오늘이 데이터베이스 파티션을 생성하는 날인데 금요일에 테스트를 진행하는 컴퓨터를 종료하고 퇴근하여 데이터베이스가 월요일 자정에 파티션을 생성하지 못했고 이로 인해 현재 날짜의 파티션이 생성되지 않아 데이터 삽입 시 오류가 발생했습니다. 해결 방법오늘 날짜 이상을 커버하는 파티션을 수동으로 추가하는 방식으로 문제를 해결했습니다. ALTER TABLE environments ADD PARTITION (PARTITION en_20250811 VALUES LESS THAN ('2025-08-11')); 위와 같은 방식으로 파티션을 추가해야 하는 .. 2025. 8. 4.
[배운 점 & 회고] 7월 17일 작업 개요프로젝트/업무명 : 안티드론성능평가시스템/백엔드기간 : 2025.03.02 ~주요 기술 스택 : Java, MySQL, Spring Boot배운 점Service와 RepositoryService로 계층을 분리한 구조에서는, 수정/삭제 작업 전에 반드시 엔티티를 Service 계층에서 명시적으로 조회해야 한다.JPA에서는 @Transactional 범위 내에서 영속 상태의 엔티티의 필드만 변경해도 DB에 반영되며, save() 호출은 필수가 아니다.엔티티 수정은 Entity 내부에 updeteFromeDTO() 같은 메소드를 두면 응집력 있고 안전한 구조가 된다.삭제 작업 시에도 단순히 deleteById() 를 호출하기 보다, 대상이 현재 로그인 사용자의 데이터인지 검증 후 삭제하는 것이 안전.. 2025. 7. 17.
[트러블 슈팅]MySQL 및 스프링 부트 오류 문제 상황Spring Boot와 MySQL을 수정하고 난 뒤에 테스트를 위해 실행하는 과정에서 다음과 같은 오류가 발생했습니다.Unknown column 't1_0.test_end' in 'field list'(pymysql.err.OperationalError) (1054, "Unknown column 'equipment_id' in 'field list'") 원인 분석이틀 전 발견한 오류로 이를 수정하는 과정에서 데이터베이스를 수정하는 것을 깜빡하여 스프링부트에서는 해당 필드를 호출하는데 데이터베이스에서는 존재하지 않아 발생한 오류였습니다. 즉 엔티티와 실제 DB 테이블 간의 구조가 일치하지 않아 JPA가 잘못된 컬럼을 조회하는 문제가 발생하였습니다. 해결 방법문제가 발생한 데이터베이스 테이블의 컬럼.. 2025. 7. 17.
[배운 점 & 회고] 7월 16일 작업 개요프로젝트/업무명 : 안티드론성능평가시스템/백엔드기간 : 2025.03.02 ~주요 기술 스택 : Java, MySQL, Spring Boot배운 점조건 없이 deleteAll() 을 사용하면 로그인 사용자와 상관없이 테이블의 모든 데이터 삭제Spring Data JPA는 인증 정보를 자동으로 고려하지 않기 때문에, 삭제 대상은 반드시 명시적으로 제한deleteByUser_UserId(String userId) 와 같은 메소드 시그니처만 정의하면 원하는 조건에 맞는 삭제 쿼리 자동 생성반복문 개별 삭제보다 성능도 좋고, 코드도 간결성능 개선이나 코드 단순화를 위해 기존 로직을 변경할 때는, 동작 대상이 동일한지 검증 필수데이터 삭제처럼 위험성이 큰 작업은 테스트와 검토를 충분히 거쳐야 함회고이번 .. 2025. 7. 16.
[트러블 슈팅] deleteAll() 전체 데이터 삭제 문제 문제 상황로그인한 사용자에게 귀속된 데이터만 삭제하기 위해 기존에는 반복문을 사용해서 delete() 했으나, 리팩토링 과정에서 deleteAll() 을 사용 후 테스트에서 모든 사용자의 데이터가 삭제가 발생했습니다. 원인 분석초기 구현List logs = logRepository.findByUser_UserId(currentUserId);for (Log log : logs) { logRepository.delete(log);} 리팩토링 시도logRepository.deleteAll();→ 로그인 인증된 사용자의 데이터만 삭제할 것이라 예상했으나 모든 데이터가 삭제되는 문제 발생 deleteAll()은 내부적으로 다음과 같은 쿼리를 생성DELETE FROM log;즉, 조건 없이 전체 테이블 데이터.. 2025. 7. 16.