Spring Boot
-
멀티모듈 잘 설계해보기Spring Boot 2024. 4. 18. 01:35
배경 사내에 MSA를 도입 해보자는 이야기가 있어서, 이왕이면 제대로 해보고 싶어 요즘 열심히 스터디 중이다. MSA를 공부하려고 강남 교보문고에 들려서 MSA 관련 책 5권을 훑어봤는데 선수지식이 필요하다고 느껴서 이론 공부는 잠시 미루기로 했다. 내가 필요하고 판단한 선수지식은 다음과 같다. 멀티모듈 DDD (https://yeoon.tistory.com/147) port-adapter pattern (https://yeoon.tistory.com/148) Spring Cloud event-consistency, 카프카 AWS EKS 그중 가장 먼저 만들어보면서 해볼만한 멀티모듈 부터 다뤄본다. 결론부터 말하면 아래처럼 구성했다. 이런 구조에 다다른 이유를 기록 해본다. 멀티모듈 실무에서 처음 경험한..
-
Kafka 기본개념 정리Spring Boot/DB 2024. 4. 16. 01:29
1. Kafka 기본 용어 Producer의 messge 저장 대상 Broker는 기본 라운드로빈 방식으로 결정됨 Key를 지정해서 원하는 Broker에만 저장하는 방식도 제공 2. Kafka란? 링크드인에서 2010년 아래와 같은 문제 해결하기위해 개발, 2011년 아파치 오픈소스로 공개 실시간 데이터 처리 문제 데이터 파이프라인 구축 및 확장 문제 다양한 시스템과의 연동 분산 이벤트 스트리밍 플랫폼이라고 공식 페이지에서 소개하고 있음 포츈 100대 기업 80% 이상이 사용 중 (제조업, 은행, 보험, 통신사 . . . 광범위한 산업군) 3. Kafka 특징/사용용도 카프카 핵심 특징 빠른 데이터 전송, 높은 처리량, 낮은 지연 시간 파티션 파일 OS 페이지 캐시 사용 Zero Copy (디스크 버퍼 ..
-
DB Replication이란? 사용 이유Spring Boot/DB 2024. 3. 19. 19:44
1. 배경 사내 프로젝트는 단일 RDS를 Database로 사용중 RDS 장애 발생시 모든 서비스가 멈춘다. (가용성이 낮다) 부하, 트래픽 증가로 DB의 자원이 부족할때 확장이 어렵다. 단일 RDS 사용시 수직확장 수직 확장은 가격 대비 성능 비율이 선형적이지 못하다. 수직 확장이나, DB 업데이트를 위해서는 서비스를 중단해야한다. DB의 쓰기와 읽기 요청은 비대칭 적이다. 대부분 읽기가 더 많다. 2. Replication 도입 Replication이란? DB 백업이나, 성능 향상을 위해 DB를 여러대의 서버로 복제하는 행위 Replication을 도입하면 확장하기 쉽고 고가용성의 DB 구조를 구성할 수 있다. 데이터 저장소의 읽기와 쓰기로 분리 부하 분산 → DB 성능 향상 쓰기 속도 향상, 읽기 ..
-
[springboot] Datasource Proxy로 SQL query logging 하기Spring Boot/환경설정 2024. 1. 11. 21:17
1. Hibernate 기본 쿼리 로그 기본적으로 JPA를 사용하면 쿼리가 어떻게 찍히는지 확인이 필요하다. application.yml에 hibernate 옵션을 넣어주면 가독성 좋은 query를 찍어보며 개발할 수 있다. 아래는 쿼리찍히는 예시 2. Datasource Proxy 운영 환경에서 유용한 확장 기능을 제공하는 Datasource proxy(https://github.com/jdbc-observations/datasource-proxy)를 사용하면 더 풍부한 SQL query를 찍을 수 있다. [대표적으로 쓸만한 기능] slow query가 발생하면 INFO대신 WARN이나 ERROR로 로그를 찍수 있다. 쿼리 호출 앞뒤로 어떤 작업 하도록 설정 할 수 있다. hibernate에서는 ?표로..
-
artillery로 부하테스트 하기Spring Boot/환경설정 2023. 10. 29. 01:49
1. 설치 // 설치 npm install -g artillery@latest // 설치 확인 artillery version 2. 사용법 : https://www.artillery.io/docs/reference/cli/run // 터미널에서 바로 실행하기 artillery quick --count 100 -n 50 http://localhost:8080/health // script로 실행하기 artillery run test.yaml // json 파일로도 실행할 수 있다. artillery run test.json // 테스트 결과 report로 만들기 artillery run --output test-run-report.json test.json // 테스트 결과 report html로 보기 a..
-
[docker] docker compose로 데이터베이스 한번에 N개 띄우기Spring Boot/환경설정 2023. 10. 23. 15:53
하나의 프로젝트에서 N개의 DB 연결이 필요한 상황 Local 실행환경 구축을 위해서 아래와 같이 구성했다. 1. Docker 이미지를 띄울때 SQL문으로 DB를 생성한다. 2. MYSQL_TCP_PORT 값 설정으로 컨테이너 내부 port 설정을 변경 해준다. version: '3' services: mysql: platform: linux/amd64 image: "public.ecr.aws/docker/library/mysql:5.7.38" environment: - MYSQL_ALLOW_EMPTY_PASSWORD=yes - MYSQL_TCP_PORT=33060 - autoReconnect=true - characterEncoding=UTF-8 - sslMode=DISABLED - TZ=Asia/Se..
-
[JPA] 간단하게 OneToMany 데이터 API 구현하기 - @Embeddable, @Embedded, @ElementCollection 활용하기Spring Boot/JPA 2023. 10. 15. 23:14
요구사항 레시피를 저장하고 조회, 삭제할 수 있는 API를 구성한다. JPA 연관관계 설정 없이 OneToMany 데이터 모델링 방법을 정리한다. API Spec 레시피 저장 api POST localhost:8881/api/recipe/new # requestBody { "name": "Fresh Mint Tea", "description": "Light, aromatic and refreshing beverage, ...", "ingredients": ["1 inch ginger root, minced", "1/2 lemon, juiced", "1/2 teaspoon manuka honey"], "directions": ["Place all ingredients in a mug and fill wit..
-
[JPA] Repository단에 Transactional을 선언하는 이유Spring Boot/JPA 2023. 10. 5. 22:37
적어도 일년 이상 궁금했던 의문이 풀려서 정리해본다. Mybatis를 쓰다가 처음로 JPA를 실무에 도입을 할때,위에 코드처럼 Repository단에 @Transcational를 선언하는 경우가 있었다. Service단에 @Transcational을 선언하면 Spring이 AOP로 하나의 Transcation으로 전파되는데왜 굳이 Repository에 선언해야할까?Github에 유명하신 분들 코드를 뜯어봐도,새로 이직한 회사의 코드를 뜯어봐도,ChatGPT, 구글, 공식문서 다 찾아봤지만 알 수 없었는데... 드디어 알게 되었다. 요약하면 Transaction이 너무 긴 Long Transaction이고 동시적인 요청을 받고 있을때 성능적으로 단점이 있기 때문이다. 스프링은 Transaction이 시작..