전체 글 48

병렬 배치 도입 후 트랜잭션이 무너졌다 - 리팩토링 기록들

성능 개선을 위한 병렬 처리 도입외부 스포츠 API를 통해 향후 31일간의 경기 데이터를 매일 동기화하는 배치를 운영하고 있었다. 매일 새벽 4시와 오후 4시에 Job이 실행되고, 날짜별로 API를 호출해서 경기·리그·팀 데이터를 DB에 저장하는 구조다. 처음에는 단일 스레드로 31일치를 순차 호출했다. 느리긴 했지만 문제는 없었다. 트랜잭션도 깔끔하게 열리고 닫혔고, 데이터 정합성 이슈가 생긴 적도 없었다. 그런데 동기화 대상 리그와 경기 수가 늘어나면서, 31개 날짜를 순차 호출하는 것만으로 API 응답 대기 시간이 누적돼 전체 배치 수행 시간이 길어지기 시작했다. 자연스럽게 병렬 처리를 검토하게 됐고, Spring Batch를 도입했다. 단순히 빠르게 하려는 것만이 아니라, JobRepositor..

Spring Boot 2026.02.13

실시간 채팅 구현

이번에 실시간 채팅 구현을 처음 시작을 해봤는데 음,, 계속 오류가 뜬 문제에 대해 살펴보려 합니다. Spring Boot와 WebSocket으로 실시간 채팅을 구현하며 CORS 정책 위반, 잘못되 데이터 검증, 경로 오류, 메시지 브로드캐스트 누락, 경로 불일치 문제가 발생하였습니다.처음에는 저도 실시간 채팅은 "그냥 websocket 연결하고 메시지 주고받으면 되는거 아닌가?"에 대해 생각했지만 생각보다 오류가 많이 나왔습니다. 다시 회고하는 느낌으로 정리해보겠습니다먼저 개발 환경은 다음과 같았습니다. - Backend: Spring Boot 3.x, Spring Security, Spring WebSocket, STOMP- Frontend: Vanilla JavaScript, SockJS, STO..

Spring Boot 2025.08.27

Firebase Authentication의 계정 연동 부분

최근에 프로젝트를 하다가 firebase 연동 부분을 진행하다가 백엔드 개발자님에게 그런 의견을 제시받았습니다.firebase id token을 받아서 user_id 값을 제공하는데 서버에서 이 값을 기반으로 해서 각각의 회원을 식별하고 있다고 함. 다중 계정의 경우에는 이 user_id를 파이어베이스 차원에서 같이 병합을 해가지고, 동일한 user_id로 보내줄 수 있어야 함.=> 이 기능을 firebase에서 제공하면 db 구조로도 아무런 문제가 없는 건데 안되면 서버 단에서 처리해야 한다고 합니다 즉, db 수정이 필요하다. 처음에는 firebase의 firestore를 사용하려고 했지만, 저희 프로젝트에서는 별도의 데이터베이스(firestore) 없이 구축이 되어 있어서 다른 방법을 찾아봤습니다..

카테고리 없음 2025.07.26

투자 대안의 경제성 분석

이 글은 (홍성조 외) 를 참고하여 만들어졌습니다일반적으로 투자 안(investment proposal)이라는 것은 투자를 고려 중인 하나의 계획이나 프로젝트를 말하는 것이다.투자 의사 결정에서는 대부분 다수의 투자 안을 놓고 선택 여부를 결정하게 된다. 투자 대안(investment alternative) : 투자 의사결정에서 선택할 수 있는 상호 배타적(mutually exclusive)이고, 완전 포괄적(totally exhaustive)인 여러 행동 방향들(course of action) 중 하나를 일컫는 말이다.=> 상호 배타적 : 반드시 하나만 선택해야 한다. (완전 포괄적 : 반드시 대안들 중 하나를 택해야 함) 즉, 의사결정을 위한 대안의 집합을 구성했다는 말은 그중 반드시 하나를 그리..

컴파일러 2025.06.10

세금을 고려한 등가계산

이 글은 을 참고하여 만들어졌습니다. 5.1 감가상각과 감모기업이 생산을 위해 보유하고 있는 기계, 설비 등의 유형 자산은 생산 활동이 진행되거나 시간이 지남에 따라 마모 또는 소모되거나 효용이 떨어져 그 가치가 감소하게 된다. => 이러한 자산가치의 감소를 회계 처리 감가 상각(depreciation) : 유형자산의 원가를 자산의 사용 가능 기간 동안 적절하게 배분하여 비용으로 처리하는 절차감가 상각비 : 실제적인 현금 지출을 의미하는 것은 아니지만 기업의 운영에 따른 비용으로 간주 감모(depletion) : 자연자원을 대상으로 하는 자산의 감소=> 기계나 설비 등의 자산에 감가상각이 발생하였을 때 기업은 기존의 자산을 다른 자산으로 대체할 수 있는 데 반해 자원이 고갈되어 발생하는 감모의 경우 그..

공학경제 2025.06.09

데이터베이스 설계

출처: 데이터베이스 개론 2판 김연희 저, MySQL로 배우는 데이터베이스 개론과 실습 박우창 외2데이터베이스 설계의 중요성과 목표를 이해한다.데이터베이스 설계 5단계를 학습한다.요구 사항 분석, 개념적 설계, 논리적 설계의 과정을 실제 예를 통해 연습해본다. 1. 데이터베이스 설계 단계데이터베이스 설계사용자가 다양한 요구 상항을 고려하여 데이터베이스를 생성하는 과정관계 데이터베이스의 대표적인 설계 방법E-R 모델과 릴레이션 변환 규칙을 이용한 설계정규화를 이용한 설계E-R 모델과 릴레이션 변환 규칙을 이용한 설계의 과정=> 설계 과정 중에 오류를 발견하여 변경이 필요하면 이전 단계로 되돌아가 설계 내용을 변경 가능 설계 1단계: 요구 사항 분석목적사용자의 요구 사항을 수집하고 분석하여 개발할 데이터베..

데이터베이스 2025.06.07

구문 분석

이 글은 (저자: 오세만)을 참고하여 만들어졌습니다. 구문 분석이란 주어진 입력이 올바른 프로그램인가를 검사하고 다음 단계에서 필요한 정보를 구성하는 과정이다.이와 같은 작업을 수행하는 컴파일러의 단계는 구문 분석기(syntax analyzer)이다. 구문 분석기는 간단히 파서(parser)라 부르며, 스캐너에 의해 생성된 토큰을 입력으로 받아 문법적인 검사를 한 후에 다음 단계인 중간 코드 생성기가 효과적으로 중간 코드를 생성할 수 있는 형태의 정보를 구성하여 출력한다. 6.1 구문 분석 방법유도 트리(derivation tree) : 구문 분석기의 출력으로 생성되는 트fl=> 이 트리가 구문 분석기에 의해 생성될 때는 파스 트리(parse tree) Context-free 문법을 위한 구문 분석 방..

컴파일러 2025.06.05

Context-free 문법

이 글은 (저자: 오세문)을 참고하여 만들어졌습니다.프로그래밍 언어의 구문 구조를 명시하는데 context-free 문법이 널리 사용되어 왔다.또한 context-free 문법은 효율적이고 잘 정의된 구문 분석 알고리즘을 가지기 때문에 프로그래밍 언어의 문법적인 표현이나 번역에 매우 중요하다. 정규 문법은 프로그래밍 언어의 구문 구조를 표현하기에는 너무 제약이 많아 부적합하다.대부분의 경우 토큰의 구조는 정규 표현으로 나타내지만 프로그래밍 언어의 구조는 context-free 문법을 사용한다. 장점1. 간단하고 이해하기가 쉽다.2. 표현된 문법으로부터 자동적으로 인식기를 구현할 수 있다.3. 입력된 프로그램의 구조를 생성 규칙에 의해 분해할 수 있으므로 번역에 유용하다. context-free 문법은 ..

컴파일러 2025.06.04

어휘 분석

이 책은 (저자: 오세만)을 참고하여 만들어졌습니다.4.1 서론3장에서 다루었던 정규 언어에 관한 이론을 적용하여 이 장에서는 구체적으로 어휘 분석기를 구현하는 방법을 살펴보자 어휘 분석(lexical analysis) : 소스 프로그램을 하나의 긴 문자열로 보고 차례대로 문자를 검조(scanning)하여 문법적으로 의미있는 최소의 단위로 분할해 내는 것을 말하는데 이 문법적인 단위(syntactic entity)를 토큰(token)이라 부른다.이러한 작업은 컴파일러의 어휘 분석기(lexcial analyzer)에서 처리하는데 어휘 분석기는 간단히 스캐너(scanner)라 부른다.토큰은 유한 오토마타에 의해 인식될 수 있으며, 토큰의 구조는 프로그래밍 언어 설계자(language designer)나 컴파..

컴파일러 2025.06.04

정규언어(후반부)

이 글은 을 참고하여 만들어졌습니다. 3.3.4 DFA의 상태수 최소화DFA의 상태수 최소화(state minimization)는 DFA를 이용하는 어휘 분석기의 상태 전이표의 크기를 줄임으로써 기억 공간을 적게 차지하도록 하고 또한 어휘 분석 프로그램을 간단히 하는데 큰 도움을 준다.상태수를 최소화하는 방법은 등치 관계(equivalence relation)을 이용하여 상태들을 합침(state merge)으로써 상태수를 최소화하는 것이다.따라서 구별되지 않는 상태들은 같은 형태의 입력 스트링을 인식하기 때문에 모두 합칠 수 있다.다음은 동치 관계를 이용하여 구별되지 않는 상태들을 하나의 상태로 합치는 방법이다. DFA의 상태 집합을 동치 관계에 의해 분할하고 각 동치류를 최소화한 유한 오토마타 상태(Q..

컴파일러 2025.06.03