TIL_20250211_MSA 설정관리

Kim jisu·2025년 2월 11일

TIL

목록 보기
4/43

1. 강의에서 배운 내용

오늘 MAS(Microservices Architecture) 강의에서는 분산 시스템에서의 설정 관리와 분산 추적을 중심으로 여러 기술들을 학습했습니다.

  • Spring Cloud Config

    • 중앙 집중식 설정 관리:
      Git, 파일 시스템, JDBC 등 다양한 저장소를 활용하여 애플리케이션 설정을 중앙에서 관리할 수 있습니다.

    • 환경별 설정 관리:
      local, dev, qa, release 등 각 환경에 맞춘 설정 분리가 가능합니다.

    • 클라이언트 구성:
      • 오늘 실습해 본 것은 client에서 spring.profiles.active: local로 설정해 로컬에서 관리하는 법.
      • build.gradle 파일에 관련 의존성을 추가합니다.
      • 클라이언트의 application.yml 파일에 Config 서버의 URL과 관련 설정을 정의합니다.
  • Spring Cloud Bus

    • 설정 변경 전파:
      RabbitMQ, Kafka 등 메시징 시스템을 이용하여 Config 서버의 변경 사항을 각 클라이언트 애플리케이션에 실시간으로 전파할 수 있습니다.
    • 수동 갱신 대안:
      - 오늘 실습해본 것은 Spring Actuator의 /actuator/refresh 엔드포인트에 요청으로 호출하여 설정을 갱신한 수동 갱신 방법.
  • Spring Boot DevTools

    • 개발 생산성 향상:
      파일 변경 감지를 통해 자동으로 애플리케이션을 재시작, 빠른 개발 사이클을 지원합니다.
  • 분산 추적 (Distributed Tracing) 및 Zipkin

    • 서비스 호출 흐름 추적:
      서비스 간 호출 시 생성되는 트레이스와 스팬 정보를 Zipkin 서버에 전송하여, Zipkin 대시보드에서 시각화합니다.

    • 성능 병목 진단:
      각 스팬의 소요 시간과 호출 관계를 분석해 병목 구간을 파악할 수 있습니다.
      ....좋은데?.....모놀리식에도 적용해봐야지
      ㄴ간단한 기능에도 성능이 저하되는 것이 (속도가 느려지는 것이) 마음에 안 들었는데, 한번 추적해서 최적화를 해봐야겠다.

  • 이벤트 드리븐 아키텍처

    • 비동기 처리 및 느슨한 결합:
      이벤트 기반 처리를 통해 서비스 간 독립성을 확보하며, 시스템 확장성을 높입니다.
  • 쿠버네티스와 Docker

    • 쿠버네티스:
      컨테이너 오케스트레이션 도구로, 복잡한 분산 시스템의 배포와 관리를 자동화합니다. 아직 실습 경험은 없지만, 앞으로의 중요한 학습 대상입니다.
    • Docker:
      오늘은 Zipkin을 사용하기 위해 Docker를 설치하고 간단히 실행해보며 컨테이너 기술에 대한 기초를 익혔습니다.
  • Querydsl

    • 타입 안전 쿼리 작성:
      Querydsl을 사용하면, 컴파일 시점에 쿼리 문법 오류를 잡을 수 있어 보다 안전하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
    • 검색 구현의 간결성:
      JPA Criteria API를 사용할 경우, 간단한 검색 조건을 구현하더라도 코드가 많이 필요하지만, Querydsl은 직관적인 DSL 문법으로 간단하게 구현할 수 있습니다.
    • 예제 비교:
      • JPA Criteria API:
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Member> query = cb.createQuery(Member.class);
        Root<Member> member = query.from(Member.class);
        Predicate predicate = cb.equal(member.get("username"), "john");
        query.where(predicate);
        List<Member> result = em.createQuery(query).getResultList();
      • Querydsl:
        QMember member = QMember.member;
        List<Member> result = queryFactory
            .selectFrom(member)
            .where(member.username.eq("john"))
            .fetch();
    • 장점 요약:
      Querydsl을 사용하면 검색 구현 시 코드가 간결해지고 가독성이 높아지며, 유지보수 비용이 줄어드는 장점이 있습니다.

2. Tip

오늘 강의에서 얻은 Tip

  • 권한 통제 강화
    • JWT 기반 인증의 한계:
      단순히 JWT 토큰에 포함된 정보를 확인하는 방식만으로는 충분하지 않습니다.
    • 데이터 이동 시 권한 체크:
      실제 데이터가 이동하거나 조작되는 시점에, 서비스 계층이나 데이터 접근 레이어에서 추가적인 권한 검증을 수행해야 합니다.
      • 이를 통해 보안 취약점을 최소화하고, 보다 세밀한 권한 통제를 구현할 수 있습니다.

3. 에러 해결

강의 도중 Gradle 빌드 파일에서 다음과 같은 에러를 확인했습니다.

Build file '.../build.gradle' line: 41

A problem occurred evaluating root project 'product'.
> Could not find method providedRuntime() for arguments [org.springframework.boot:spring-boot-starter-tomcat] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
  • 문제 원인:

    • providedRuntime이라는 의존성 구성(configuration)은 Gradle에서 기본적으로 제공하지 않습니다.
    • 보통 WAR 플러그인을 적용할 경우에만 활성화되는데, 현재는 java 플러그인만 사용하고 있어 해당 구성이 존재하지 않습니다.
  • 해결 방법:

    • WAR 파일 패키징을 계획한다면:
      war 플러그인을 추가하여 providedRuntime 구성을 활성화합니다.
    • WAR 패키징이 불필요하다면:
      해당 의존성 구성을 제거하거나 다른 적절한 의존성 설정으로 대체합니다. -> providedRuntime 의존성을 runtimeOnly로 변경하거나, 필요에 따라 implementation에서 제외하는 방법을 고려
profile
Dreamer

0개의 댓글