분류 전체보기
-
동시성이 터졌다.스파르타 심화/MSA 개인프로젝트 2024. 12. 14. 16:10
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.sparta.msa_exam.order.entity.Order#2] 아주 멋진 에러가 터졌다.another transaction 바로 동시성 문제 바로 낙관적 락을 걸어주었다.jpa: properties: hibernate: use_version_always: true 엔티티엔@Version 추가 Detached entity with generated id '2' has an uninitialized version value 'null': com.sparta.msa_exam.orde..
-
프로젝트 시작 - 대략적인 구상스파르타 심화/MSA 개인프로젝트 2024. 11. 30. 18:17
문서로 제공된 요구사항 외에 내가 어떻게 구현해야할지에 대해 며칠을 고민했다. 거의 3일을 어떻게 해야할지에 대해 고민만 한 것 같다. 먼저 DB에 대한 고민 DB 분리 스키마 vs 테이블MSA 환경에서 데이터베이스를 어떻게 할 지 고민 도커컴포즈로 mysql과 레디스를 묶어 사용하려 했다. 이 경우 레디스는 key-space를 도메인 별로 나누면 된다. 하지만 mysql은 각 도메인마다 독립적like-it-too.tistory.com어떻게 해야할지에 대해 고민했던 것 같다. 깃허브 레포 관리에 대한 고민 마이크로서비스 깃허브 관리방식MSA 프로젝트를 하며 깃허브 레포지토리를 어떻게 관리해야할지많은 고민이 생겨 이것저것 알아보았다. 깃허브 관리 방식에는 3가지를 찾을 수 있었다. 1. 모노레포 (M..
-
매우 화나는 깃 - 하위 모듈 push rejected 해결?오늘/Error 2024. 11. 29. 20:39
결과 스포 프로젝트 전체 삭제 후 다시 만듦 하면 안되는 행동 목록 1. 모듈 remote 금지처음엔 main -> 이곳이 비어있어서 remote해줬는데 절대 이러면 안된다. 루트디렉토리만 push가 되고 하위 모듈들은 푸시를 거절당하게 된다. 나처럼 이런 실수를 저질렀다면 위와 같이 해당 디렉토리로 이동해 명령어를 실행하면된다.인텔리제이 파워쉘 명령어이기 때문에 본인의 설정에 맞춰 진행하면 된다.아무것도 안뜨면 성공한 것이다. Get 하기 귀찮으면 폴더에서 .git 파일을 찾아보면 된다. 그 다음으로 진행한 해결방식들 대체 왜..rebase로 양쪽을 맞춰보기도 했지만 결과는 같았다.여전히 커밋만 되고 깃허브에 푸시는 안되는 상태 git status로 상태를 보니 order와..
-
DB 분리 스키마 vs 테이블프로그래밍/MSA 2024. 11. 28. 16:53
MSA 환경에서 데이터베이스를 어떻게 할 지 고민 도커컴포즈로 mysql과 레디스를 묶어 사용하려 했다. 이 경우 레디스는 key-space를 도메인 별로 나누면 된다. 하지만 mysql은 각 도메인마다 독립적인 데이터베이스를 가져야하는데 어떻게 구현해야하나 고민이 되었다. 방식은 두가지가 있다. 1. 각 도메인이 다른 스키마를 사용2. 같은 스키마를 공유하되, 도메인 별로 테이블을 분리 1. 각 도메인이 다른 스키마를 사용Order는 order_db, Product는 product_db, Auth는 auth_db 로 스키마를 분리할 수 있다. 이 경우 각 도메인은 url이 분리되어 각자 독립적인 db를 보유한 것처럼 사용할 수 있다.jdbc:mysql://mysql:3306/product_db..
-
마이크로서비스 깃허브 관리방식프로그래밍/MSA 2024. 11. 28. 02:18
MSA 프로젝트를 하며 깃허브 레포지토리를 어떻게 관리해야할지많은 고민이 생겨 이것저것 알아보았다. 깃허브 관리 방식에는 3가지를 찾을 수 있었다. 1. 모노레포 (Monorepo)2. 서브모듈 (Submodule)3. 다중 레포지토리 (Multi-repo) 각 방식에 대해 간략히 설명해보자면 1. 모노레포 (Monorepo)모노레포란 하나의 깃 레포지토리에서 여러 프로젝트 또는 서비스를 통합 관리하는 방식모든 서비스와 코드를 하나의 레포지토리에서 관리하는 것이 특징 장점1. CICD 파이프라인 설정과 코드 공유가 쉽다.2. 서비스 간 의존성 문제를 해결하기 쉽다.3. 같은 레포지토리에서 작업하므로 변경사항 추적이 쉬우며, 협업이 쉽다.4. 관련된 모든 변경사항을 한번의 커밋으로 관리할 수 있기 때문에 ..
-
Commit Count 확장 - 로그(TIL) 카운트 EventListener ErrordevRace 2024. 11. 26. 18:46
커밋카운트 로직을 바탕으로 알고리즘 카운트, 로그(TIL) 카운트 를 만들었다. @EventListener @Async public void handleLogSubmitEvent(LogSubmitEvent event) { logCountService.updateLogCountOnSubmit(event.getUserId()); }} 이 곳에는 비동기를 적용하여 사용자가 제출한 이후 카운트를 따로 처리하게 함으로써 제출 이후 바로 다른 작업을 할 수 있도록 하였다. 테스트코드를 작성하여 간단히 로그 제출 -> 제출하며 카운트 이벤트 호출 로직으로 구성하였다. 하지만 테스트에서 문제가 발생하였고, 비동기가 제대로 적용되지 않은것이라 생각해 Awaitility.aw..
-
레디스오늘/Today I.. 2024. 11. 25. 16:00
cache hit (캐시 적중) → 캐시에서 찾음cache miss (캐시 누락) → 캐시에서 못찾음eviction policy (삭제 정책) → 캐시에 공간이 부족할 때 어떻게 공간을 확보할지에 대한 정책 Cache - Aside 레이지 로딩이라고도 함데이터를 조회할 때 항상 캐시를 먼저 확인캐시에 데이터가 있으면 캐시에서 데이터를 가져오고, 없으면 원본에서 데이터를 가져온 뒤 캐시에 저장필요한 데이터만 캐시에 보관됨최초 조회 시 캐시를 확인하기 때문에 최초 요청은 상대적으로 오래 걸림반드시 원본을 확인하진 않기 때문에 데이터가 최신이라는 보장이 없음 Write - Through 데이터를 작성할 때 항상 캐시에 작성하고, 그 후 원본에도 작성하는 전략캐시는 항상 최신 데이터임이 보장됨자주..
-
레디스 명령어 (4) Hash, Sorted Set오늘/Today I.. 2024. 11. 24. 01:48
Redis의 Hash는 Hash데이터를 가져오기 위해 Key를 사용하고 Key에 저장된 Hash데이터에 Field - Value 쌍을 넣어주는 식으로 동작한다. HSET HSET user:1 name boy age 20 city seoul # 하나의 키에 복수의 필드와 밸류가 담김 HGET String 과는 다르게 키 와 필드까지 넣어서 확인해야함HMGET 2개 이상의 필드 지정 가능HGETALL 데이터 다 가져옴HGET user:1 name # boy 반환HMGET user:1 name age # boy 20 반환HGETALL user:1 # name boy age 20 city seoul 반환 HKEYS Hash에 포함된 모..