Backend 23

[DB] Azure MariaDB 에서 MySQL로 중단 없이 migration 하기

서론이전 포스팅에서 언급한대로, 회사에서 Azure 기반의 MariaDB에서 MySQL로 migration 하는 작업을 했다.이유는 9월 19일부로 MariaDB에 대한 지원을 Azure에서 종료하기 때문이다.본 포스팅에선 그 방법에 대해 작성하고자 한다. 사실 그렇게 어렵진 않은데, VM 서버의 ubuntu 버전이 호환이 안되서 삽질을 좀 많이했다.결론부터 말하자면, ubuntu 18.04 버전에선 불가능하다. 그리고 GTID 기반 replication도 불가능하다.바이너리 로그 기반 replication이 필요하다.  본인의 작업환경 버전을 꼭 체크하도록 하자.정확히는 온프레미스 환경이라면 어찌저찌 온몸비틀기로 되겠지만, 적어도 Azure 기반에선 불가능하다. 이유는 후술하겠다. 서비스 안정성을 위해..

Backend/DB 2025.02.08

[DB] Replication에 대해 알아보자

서론회사에서 대규모 업데이트를 진행함에 따라, 기존 MariaDB 10.2에서 MySQL 8.0으로 migration하는 작업을 진행했다.이 과정에서 필연적으로 replication 작업도 진행했는데, 하는 방법도 중요하지만 원리에 대해 조금 더 알아보고자 한다.본론Replication?Replication(복제)은 write 연산과 read 연산을 분산시켜 DB의 부하를 낮추고, 시스템 장애 발생 시 slave를 master DB로 승격시켜 빠른 장애 대응이 가능한 기법을 의미한다.정의 같은 것은 너무 기본적인 내용이고 더 자세하게 소개한 레퍼런스가 많으니 패스하고, 간단하게 도식화한 그림으로 이해해보자.어떤 원리로 작동하는가?크게 동기식, 비동기식, 반동기식(semi-sync)가 존재한다.반동기식은 ..

Backend/DB 2025.02.08

[Kafka] 카프카의 스펙을 적절히 설정하는 방법 - 1

서론회사에서 이벤트 브로커를 만들 수 있는 좋은 기회가 생겼다.기존에 우리 회사는 IoT 기기로부터 전달된 이벤트를 받아서 쓰기 때문에, 이를 저장하거나, 갈무리해 관리할 수 있는 구조가 아니었다. 이번에 새로운 3rd-party 플랫폼을 추가하게 되어서, 해당 작업을 맡게 되었다.전반적인 아키텍처는 구도가 잡혔는데, 파티션 수, 토픽의 개수, 순서 보장 방법, 클러스터 내 브로커 개수 등의 세부적인 설계가 필요한 상황이 되었다.카프카의 스펙을 어떻게 설정하는지, 기초부터 차근차근 따져가면서 생각해보기로 하자.설계가 필요한 다른 사람들에게 도움이 되길 바란다.본론배경먼저 현 상황에 대해 간단히 기술해보자면 TPS 기준으로, 평상시 700~800, 특정 타임 1500~2500, 스파이크 시 3500 이상의..

Backend/Kafka 2025.02.01

[RabbitMQ] AMQP에 대해

서론입사 후 처음 맡게된 업무는 회사에서 제공하는 OpenAPI 관련 업무였다.관련해서 MQ를 처음 사용해보게 됐는데, 회사에선 RabbitMQ를 사용하고 있었다.아직 업무 투입 전이기 때문에, 빠르게 학습해보도록 하려고 한다.RabbitMQ를 공부하다보니 자연스럽게 AMQP라는 용어도 나왔는데, 이게 뭔지 궁금해서 한 번 알아봤다.참고https://preamtree.tistory.com/172 Spring AMQP 맛보기 - 1. AMQP 개념부제: RabbitMQ Spring 연동, RabbitMQ 연동 이번 시리즈에서는 간단한 Spring AMQP 예제를 소개한다. 예제를 시작하기 전에 이번 포스팅에서는 AMQP라는 것에 대해 소개할 것이다. 1. AMQP 정의 Advanced Message Qup..

Backend/RabbitMQ 2024.08.14

[DB] 조회 시 트랜잭션을 걸어야 하는 이유? (Feat. 트랜잭션 격리수준)

서론면접에서 아래와 같은 이야기를 주고 받았다. (요즘 면접을 많이 다니기도 하고, 면접을 하면서 고민해볼 거리가 많이 나오는 것 같다.)(프로젝트 이야기와 조회 로직에 트랜잭션을 붙이지 않았다는 이야기를 했음)면접관 : 몇 가지 데이터 구조에 따라 다르긴 하겠지만, 조회 로직에 트랜잭션을 걸지 않았을 때 문제가 발생할 수 있을 것 같은데, 어떤 문제가 발생할 수 있을지 생각해보시겠어요?트랜잭션은 업데이트에만 적용해놨었는데, 관련된 질문이 들어왔었다. 트랜잭션은 보통 동시성 이슈와 밀접한 연관이 있기 때문인데, 해당 질문엔 계좌 잔액 조회를 예시로 들어서 설명했다.그러나 면접관이 원하는 대답은 아니었던 것 같았다. 조회엔 걸지 않는게 일반적인 걸로 알고있었는데.. 잘못된 거였구나. 라는 것을 깨닫고, 관..

Backend/DB 2024.06.26

[Oracle] 오라클 시퀀스가 동시성 이슈를 보장해주는 이유

서론이전 회사에서 오라클 시퀀스를 활용해 선착순 이벤트 처리를 한 경험에 대해 복기하던 도중, 오라클 시퀀스가 어떻게 그걸 보장해주는지가 궁금해졌다.오라클을 사용하지 않는다면 Redis를 사용해서 동시성 이슈를 제어하거나, 자바 단에서 thread, callback 등을 통해서 제어하는 방식이 있을텐데, 오라클에서 제공하는 기능을 활용해 훨씬 간단하게 업무를 처리한 기억이 있다.아마 이런식으로 업무처리하신 분이 나 말고도 있을 것 같은데, 그게 어떻게 가능한건지 알아보도록 하자. 간단한 포스팅이니 이해가 쉬울듯.시퀀스가 뭔지, 이런것들에 대한 내용은 다른 블로그를 참고하도록 하자.참고https://velog.io/@norighthere/Oracle-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC..

Backend/DB 2024.06.11

[Software Design] 헥사고날 아키텍처(Hexagonal Architecture) 톺아보기

서론모 회사에서 기술면접을 진행하는 도중, 헥사고날 아키텍처에 대해 알고있냐는 질문을 받았다.대충 어떤 모양새인지 흐릿하게는 알고 있었는데, 괜히 대답했다가 이도저도 아닌 대답을 내놓을 것 같아서 모른다고 했음(...)사실 헥사고날 아키텍처나 TDD는 실무에 적용하기 어렵다는 이야기를 많이 들었어서, 그런 내용에 집중하기보다 기본기를 쌓는게 더 중요하다고 생각하는데, 그래도 기본적인 이론과 장단점에 대해서는 파악을 하는 것이 좋을 것 같다.이론적인 부분은 훨씬 좋은 아티클과 글이 차고 넘치니, 이론에 대해 의미없이 포스팅 하는 것보단 스스로 생각해본 포스팅이라고 이해하시면 편하시겠다.참고https://tech.osci.kr/hexagonal-architecture/ 헥사고날 아키텍처(Hexagonal A..

[Mock] Mock, 도대체 뭐야? (Feat. 테스트코드)

이 글은 Notion에서 작성 후 재편집한 포스트입니다. 서론 프로젝트를 진행하며 본격적으로 테스트코드를 작성하기 시작했다. 강의를 보면서 대부분의 강의에서 모킹(Mocking)을 활용한 테스트코드 작성을 하던데, 아무리 봐도 DB 커넥션이 없는것이다. 내가 생각한 테스트코드는 DB에 직접 CRUD 작업을 거쳐서 하는것으로 알고있었는데... 그게 아니었다. 본 포스팅에선 테스트코드의 목적과, 가상 맵핑을 도와주는 Mock 프레임워크에 대해 알아보도록 하자. 참고 https://happy-coding-day.tistory.com/entry/Mock-%EA%B0%9D%EC%B2%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-%EC%99%9C-%EC%8D%A8%EC%9..

Backend/Test 2023.11.01

[MySQL, JPA] Schema-validation: missing column [컬럼명] in table [테이블명]

목차 문제 사항 JPA + MySQL 환경에서 작업을 진행하는 도중, 다음과 같은 에러가 발생했다. Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested except..

Backend/DB 2023.10.26

[CS스터디-헤드퍼스트 디자인 패턴] 3. 반복자 패턴

목차 이 글은 Notion에서 작성 후 재편집한 포스트입니다. 서론 이번 포스팅에선 반복자 패턴에 대해 다뤄보도록 하겠습니다. 반복자 패턴은 접근기능과 자료구조를 분리시켜서 객체화 하여, 서로 다른 구조를 가지고 있는 저장 객체에 대해서 접근하기 위해 인퍼페이스를 통일시키고 싶을 때 사용됩니다. 참고 https://www.coupang.com/vp/products/6403382250?itemId=13700178772&vendorItemId=80951605437&src=1042503&spec=10304982&addtag=400&ctag=6403382250&lptag=10304982I13700178772&itime=20221210115503&pageType=PRODUCT&pageValue=6403382250..