본문 바로가기

전체 글141

[개인프로젝트 리팩토링] 데이터베이스 레플리케이션 적용하기 데이터베이스 레플리케이션을 적용해보았따.  레플리케이션 왜 필요한가? 보통 개인프로젝트 하다보면 데이터베이스를 한대만 운영한다. 데이터를 읽고 쓰는 작업이 하나의 데이터베이스에서 수행된다는 의미다 근데 갑자기 트래픽이 폭주했다고 가정해보자.DB관점에서는 크게 2가지문제가 발생가능하다. 1. SPOF물론 트랙픽에 대응해 DB성능 한대의 성능을 Scale up하는 방법도 존재한다. 그러나 한대의 데이터베이스가 다운될 경우 그냥 서비스가 다운이다. 데이터를 백업하지 않았다면 더 큰일... 그래서 SPOF 하나의 장애가 시스템 전체 장애로 이어지는 상황이 발생하게 된다. 2. 성능저하하나의 데이터베이스에 읽고 쓰는 작업이 모두 일어나다보면 부하가 늘어난다. 물론 이부분도 DB성능을 향상시키는 방법도 존재하지만... 2024. 8. 3.
[개인프로젝트 리팩토링] Actuator, Prometheus, Grafana 구축 이미 어느정도 모듈로 나누고 코드를 80%이상 짠 상태라서 모니터링 환경을 구축해보았다. 구조 구조라고 말하기에 애매하지만 Spring boot의 메트릭정보를 Prometheus가 수집하여 해당 내용을 Grafana가 시각화한다. 1. 디펜던시 추가implementation 'org.springframework.boot:spring-boot-starter-actuator'runtimeOnly 'io.micrometer:micrometer-registry-prometheus' 이후 localhost:{포트}/actuator에 접속해보면 요렇게 제공하는 엔드포인트들이 나온다.Prometheus에서 사용되는 메트릭을 노출시키기 위해 밑의 내용을 yml에 추가한다.management: endpoints: .. 2024. 8. 3.
[개인프로젝트 리팩토링] 리팩토링 계획 최근에 쉬다가 개인프로젝트를 조금 널널하게 리팩토링중이었다. 그래서 무엇을 리팩토링하고 있는지 정리해보고자 한다.그에 대한 자세한 얘기는 차차 다룰 예정이다. 프로젝트 리팩토링 첫번째로 멀티모듈개인프로젝트에는 지금 Customer와 Walker가 섞여있다. 그니까 약간 Admin코드랑 Customer 코드가 한 프로젝트에 섞여있는 느낌??그래서 모듈을 나누고자 한다. 1. Common 모듈domaincommon code (위치, auth 관련)2. Customer 모듈산책 알바를 신청한 고객3. Walker 모듈산책 알바를 하는 고객(알바생느낌)4. Batch 모듈Spring Batch관련 코드이렇게 4모듈정도로 나눌 예정이다.사실 Common모듈은 조금 애매함이 있어서 나중에 고민좀 해볼 예정  두번째.. 2024. 8. 1.
왜 swagger에서는 괜찮은데 테스트코드에서 LazyInitializationException이 터지는가? 코드짜다가 swagger로 테스트를 했을때는 괜찮아서 pr을 올렸느데 팀원중 한분이 이거 Lazy예외 안터지냐고 물어보셨다. 그러면서 트랜젝션 어노텡션 붙여야하지 않아요? 하셔서 엥..? 나는 swagger에서 됬는데 싶었다.그래서 일단 swagger테스트해봤는데 되었다고 말씀드렸다. 근데 내가 테스트코드를 까먹고 안한것이다..ㅎㅎ그래서 테스트코드를 짰는데 엥?? LazyInitializationException 바로 터지쥬...? 그래서 트랜젝션을 해당 서비스 코드에 붙였더니 테스트코드가 잘 통과했다.왜?? swagger에서는 잘되었는데 테스트코드에서는 예외가 터진건지,,, 급 궁금해짐,, 일단 트랜젝션 로그를 보자  일단 처음에는 LazyInitializationException자체가 트랜젝션과 관계.. 2024. 6. 7.
Delete와 Insert의 트랜잭션 문제 일중에 S3이미지를 삭제 + 데이터 삭제 후에 다시 S3이미지 넣고 데이터 삽입하는 로직이 있었다. 즉, 수정하는 로직.근데 S3이미지까지는 잘 삭제가 되는데 데이터가 삭제가 안되고 삽입만 되는 것이다... 그래서 보자마자,, 아 트랜젝션 같은데,,, 싹 냄새가,,, 그래서 집에 와서 한번 테스트해보았다. 코드 게시물과  댓글 엔티티가 존재한다. 여기서 정말 말도안되지만.... 게시글이 수정할때 댓글도 같이 수정되어 댓글이 모두 삭제후 -> 새롭게 Insert한다고 가정한다. @Entityclass Post( var content: String,) : BaseEntity() { @OneToMany(mappedBy = "post", cascade = [CascadeType.ALL]) val.. 2024. 6. 2.
Git merge 전략 맡아진 업무를 하고 merge할때... 항상 merge에 대한 두려움에 팀장님께 물어보고.. 한다...매번 그럴수는 없으니 회사에서 사용하는?? Git과 관련된 것들을 정리해볼까 한다. Git merge 나에게 깃이란 그냥 코드를 올린다 정도여서 Create Merge Commit / Squash and Merge / Rebase and Merge의 차이를 잘 몰랐다. 1. merge - fast forward예를 들어 main 브랜치에 develop 브랜치가 있다고 가정하자.이때 main 브랜치에는 새로운 커밋이 아예 없다. 그렇다면 develop브랜치가 최신 브랜치라고 할 수 있다.이때 main 브랜치에 그대로 develop브랜치의 이력을 가져오는 것이다(즉 main은 아무 커밋도 없어야한다.)  2.. 2024. 5. 17.
728x90