Docker Compose에서 k3s 기반 MSA로, 전환하기까지
·
Backend Programming
k3s 기반 MSA 구조로 전환하기까지이번 글에서는 프로젝트를 진행하면서 모놀리식 구조의 한계를 체감하게 된 과정과, 이를 해결하기 위해 k3s 기반 MSA 구조로 전환한 경험을 정리합니다. 초기에는 빠른 개발과 단순한 운영을 위해 모놀리식 구조를 선택했습니다. 하지만 서비스가 커지고 요구사항이 늘어나면서, 특정 기능의 장애가 전체 서비스로 확산되거나 작은 변경에도 전체 배포가 필요한 문제를 겪게 되었습니다. 또한 일부 기능에 집중된 부하가 애플리케이션 전체에 영향을 주는 상황도 확인할 수 있었습니다. 이 글에서는 단순히 “MSA를 도입했다”는 결과보다, 어떤 문제를 겪었고 왜 기존 구조로는 해결이 어려웠는지, 그리고 그 과정에서 아키텍처를 어떤 기준으로 다시 설계했는지에 초점을 맞춰 이야기해 보겠습니다..
정말 HTTPS에 대해서 알고 있는가?
·
Backend Programming
HTTPS는 왜 이런 구조로 만들어졌을까?HTTPS의 구조를 제대로 이해하려면, 각 보안 요소들이 왜 필요하게 되었는지를 먼저 이해해야 합니다. 이 글에서는 HTTP의 한계에서 시작해, HTTPS가 지금의 형태로 발전한 과정의 흐름을 순서대로 살펴보겠습니다. 우선 HTTP는 웹에서 데이터를 주고받는 통신 규약이고, HTTPS는 여기에 보안을 강화하기 위해 TLS(SSL) 암호화를 추가한 프로토콜입니다. SSL 인증서를 통해... 한번에 HTTPS의 통신 구조를 이해하기란 어렵습니다. 여러개의 구조들을 파악하고 어떤 것들이 진정으로 보완이 되어서 완성이 되었는지 이해가 되어야 비로소 HTTPS 구조를 이해할 수 있습니다. HTTP먼저 HTTP부터 입니다.HTTP는 웹에서 데이터를 주고받는 기본 통신 규약입..
JPA에서 ID는 언제 만들어지고, 언제 DB에 저장될까?
·
Backend Programming
JPA를 사용하다 보면 이런 의문이 생깁니다.“save() 직후 ID가 생기는데, DB에 저장 된건가?” 이 질문의 답은 트랜잭션의 동작 흐름 안에 있습니다.persist(), flush(), commit()은 각각 “메모리에 저장 -> SQL 실행 -> 트랜잭션 확정” 단계를 의미하며, ID는 이 과정 속에서 점진적으로 생성되고 확정됩니다. 이 글에서는 트랜잭션 내부에서 ID가 생성되고, DB에 반영되고, 다른 트랜잭션에서 보이게 되는 전 과정을 순서대로 살펴보겠습니다. 1. 비영속 상태ScheduleEntity schedule = new ScheduleEntity();System.out.println(schedule.getId()); // 대부분 null (직접 세팅 안 했다면)단순히 new 한 상..
맥북 한영키 전환 카라비너 없이 적용하는 방법
·
Etc/Memo
https://hidutil-generator.netlify.app/ hidutil key remapping generatorcaps_lockleft_controlleft_shiftleft_optionleft_commandright_controlright_shiftright_optionright_commandfnreturn_or_enterescapedelete_or_backspacedelete_forwardtabspacebarhyphen (-)equal_sign (=)open_bracket [close_bracket ]backslash (\)non_us_poundsemicolohidutil-generator.netlify.app 여기 링크에서 caplock -> f18로 적용 설정에서 입력 메뉴에서 다음..
데이터베이스 구조 리팩토링 및 마이그레이션 경험 공유
·
Backend Programming
기존 데이터베이스의 복잡성과 확장성 한계를 개선하기 위해 데이터베이스 구조를 리팩토링하고, 마이그레이션 및 배포까지 진행한 경험을 공유합니다.설계의 배경기존에는 유저 중심의 데이터베이스 설계로 구성되어 있었습니다. 캘린더의 종류는 기본 캘린더, 그룹 캘린더가 있었고, 그룹 캘린더는 group_user 테이블을 통해 그룹 안에 어떤 유저들이 포함되어 있는지를 관리하는 방식이었습니다. 그러나 Google Calendar 연동 기능이 추가되면서, 더 이상 유저 중심 구조만으로는 다양한 유형의 캘린더를 명확히 구분하기 어렵다는 판단이 들었습니다. 따라서 구조를 ‘캘린더 중심’으로 재설계하기로 결정했습니다. 이 과정에서 group_user는 calendar_member로 변경되었고, 캘린더 색상같은 설정에 관한 ..
빌드 실패 디버깅
·
Backend Programming
firebase를 통한 알림 서비스를 추가했고 다 완성되었다고 생각해서 빌드를 돌렸는데 실패해서, 디버깅했던 내용을 정리합니다. 문제 추론처음에는 문제가 하나의 원인 때문이라고 생각했습니다. 그래서 FirebaseConfig가 test코드에서 자동으로 등록되는 게 문제로 보여서 하나만 제외시켜 주면 되겠거니 했는데 아무리 해도 해결이 안 되었습니다. 4시간 동안을 혼자 생각했던 문제 해결방안과 gpt가 제시해 준 문제 해결방안을 시도해 봤지만 결과적으로는 해결되지 않았습니다. 그렇게 다음날에 멘탈을 잡고 천천히 하나씩 문제를 구글링을 통해서 추론해 나갔습니다.CalendarApplicationTests > contextLoads() FAILEDjava.lang.IllegalStateException at..