전체 글 (40) 썸네일형 리스트형 마켓 백엔드 엔진 8 : 검색 쿼리 튜닝 (EXPLAIN ANALYZE, Index, Page, Slice) PostgreSQL에서 쿼리 성능을 분석할 때 EXPLAIN을 사용합니다. EXPLAIN은 쿼리를 실제로 실행하지 않고, 옵티마이저가 계산한 예상 실행 계획만 보여줍니다. EXPLAIN ANALYZE는 쿼리를 실제로 실행한 뒤, 예측치와 실제 통계를 비교해서 보여줍니다. 데이터 변경시 실제로 변경되므로 주의해야 합니다. 보통 BEGIN - ROLLBACK 사이에서 사용합니다. EXPLAIN (ANALYZE, BUFFERS) 형태로 사용 시 데이터를 어디서 가져왔는지(메모리 vs 디스크) 상세히 보여줍니다.성능 최적화의 핵심 지표입니다. Actual Time: 각 단계에서 실제로 걸린 시간(ms).Actual Rows: 실제로 처리된 행의 수.Loops: 해당 작업이 반복된 횟수.Shared Hit: Po.. 마켓 백엔드 엔진 7 : Prometheus + Grafana 모니터링 k6로 부하테스트를 진행 할 예정입니다.이를 위해서 Prometheus로 서버 상태를 수집하고Grafana를 이를 시각화하여 모니터링합니다. 먼저 Docker로 Prometheus를 설치합니다. 데이터를 수집하려면 백엔드에서 스프링부트 액추에이터에서 /prometheus를 열어야 합니다. 변경한 파일build.gradlespring-boot-starter-actuator 추가micrometer-registry-prometheus 추가application.yml에서 스프링부트 액추에이터 엔드포인트 개방 health앱 상태 확인용 (/actuator/health)서버 살아있는지 체크할 때 사용info앱 정보 노출용 (/actuator/info)버전/설명 같은 메타 정보(설정했을 때)prometheusProm.. 마켓 백엔드 엔진 6 : QueryDSL로 동적 쿼리 적용 product search 쿼리를 JPA Specification -> QueryDSL로 변경했습니다.쿼리를 함수형태로 가공하기 때문에 가독성 측면에서 코드가 더 깔끔하고, 쿼리 튜닝이 쉬워집니다. 의존성 추가dependencies { implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'jakarta.annotation:jakarta.annotation-api'} JpaS.. 마켓 백엔드 엔진 5 : product DB 구체화, 대용량 더미 데이터 생성, 검색 기능 개발 운영 및 배포 테스트를 위해서 Docker에 모든 환경을 컨테이너에 올렸으나, Next.js를 통한 빠른 프론트엔드 및 API 개발을 위해서는 로컬 개발환경에서 코드를 빠르게 수정하고 결과물을 보는 것이 효율적입니다.개발환경 설정을 Docker postgre로 하였기 때문에, 백과 프론트 서버는 로컬 개발환경에서 구동하고 도커 컨테이너에서는 postgres만 구동하면 됩니다. 통합 운영 테스트는 컨테이너에 올려서 진행:도커 컨테이너 실행 docker compose up --build -d 빠른 개발을 위해 로컬 개발환경에서 진행:로컬 개발환경 실행 cd c:\Users\chlwl\workspace\backend-engineering docker compose up -d postgres cd c:\User.. 마켓 백엔드 엔진 4 : Next.js 프론트 생성, Docker Compose로 통합 배포, 더미 데이터 생성 이번 단계에서는 개발 환경을 단일 명령으로 재현하기 위해 Docker Compose로 프론트엔드 + 백엔드 + PostgreSQL 통합 구성했습니다. Next.js 프론트엔드 초안 생성상품 리스트 검색 및 주문 생성만 가능한 첫 페이지를 만들었습니다. docker-compose.yml로컬에서 postgres + backend + frontend를 한 번에 실행하는 오케스트레이션 파일입니다.backend는 DB 주소를 postgres 서비스로 연결하고, frontend는 BACKEND_ORIGIN=http://backend:8080으로 백엔드와 연결됩니다.Postgres 데이터는 marketengine-pgdata 볼륨에 저장해 컨테이너 재생성 후에도 유지됩니다. backend/DockerfileSpri.. 마켓 백엔드 엔진 3 : flyway, JPA, CRUD API, Swagger, Filter flyway로 초기 스키마 생성설정값 세팅 Flyway 의존성 추가: backend/build.gradleorg.flywaydb:flyway-coreorg.flywaydb:flyway-database-postgresql 테스트 안정화: backend/src/test/resources/application.propertiesspring.flyway.enabled=false 추가(H2 테스트와 PostgreSQL 전용 SQL 충돌 방지)CREATE TABLE members ( id BIGSERIAL PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255), name VARCHAR(100) NOT NULL, .. 마켓 백엔드 엔진 2 : Github Actions 테스트 자동화 및 Docker Compose로 local PostgreSQL DB 설정 Github Actions 워크플로우 추가.github/workflows에 backend 모듈에서 ./gradlew test를 실행하는 워크플로를 추가합니다. on: push, pull request 시 실행concurrency: 동시 실행시 가장 최신 실행만 진행 (효율성 증가)jobs: ubuntu이용, backend 디렉터리로 이동해 ./gradlew test steps: 1. checkout: 코드를 VM으로 가져옴2. setup jdk: java 21 설치 (캐싱)3. gradle wrapper 검증4. gradlew 실행 권한 획득5. run test6. 실패시 report 생성 github push 테스트 자동화 확인 Docker Compose로 postgresSQL 로컬 띄우기spring.. 마켓 백엔드 엔진 1 : 스프링부트 프로젝트 생성 및 전역 예외 설정, 공통 응답 형식 지정 인텔리제이에서 스프링부트 프로젝트를 생성했습니다.런타임: Java 21, Spring Boot 3.5.13 빌드: Gradle - Groovy DSL 패키징: JAR패키지 네이밍: com.marketengine.backend 런타임과 빌드 설정은 학습 자료가 가장 많고 안정적인 버전으로 설정했습니다.첫번째 구현 : 전역 예외 + 공통 응답 형식API 스타일이 고정되면 이후 컨트롤러 - 도메인 코드가 훨씬 편해지기 때문에 먼저 구현했습니다.ApiResponse: 성공, 실패를 감싸는 공통 래퍼JsonInclude.Include.NON_NULL // 응답에서 NULL 제외ApiError: 에러 래퍼 public static ApiError of(String code, String message) // of.. 이전 1 2 3 4 5 다음