MSA 적용 - 공통 라이브러리

박수민·2024년 6월 16일
0

공통 라이브러리란?

MSA 구조에서 공통 클래스를 다루는 방법은 다양합니다. 일반적으로는 공통 클래스를 별도의 모듈 또는 라이브러리로 분리하여 관리하는 방법을 많이 사용합니다. 이렇게 분리된 공통 모듈은 각각의 MS 서버에서 필요할 때마다 참조하여 사용할 수 있습니다.

또한, 다른 MS 서버들과의 통신을 위한 API 인터페이스를 정의하고 공통 클래스를 활용하여 데이터를 교환하는 경우도 있습니다. 이렇게하면 복붙으로 인한 중복코드를 피하고 재사용성을 높일 수 있습니다.

실무에서는 각 팀이 독립적으로 개발하거나 유지 보수를 하기 때문에 공통 클래스를 분리하여 관리하는 것이 일반적입니다. 이를 통해 코드의 일관성과 유지보수성을 높일 수 있습니다.

공통 라이브러리 장단점

장점

  • 코드 재사용

    • 공통 라이브러리를 사용하면 비슷한 기능을 구현하는 데 필요한 코드를 반복해서 작성할 필요가 없습니다. 이는 시간을 단축하고 일관성을 유지할 수 있는 장점을 제공합니다.
  • 일관성 유지

    • 공통 라이브러리를 사용하면 동일한 기능이 동일한 방식으로 동작하도록 보장할 수 있습니다. 이는 시스템의 일관성을 유지하는 데 도움이 됩니다.
  • 버그 수정 및 업데이트 용이성

    • 공통 라이브러리를 사용하면 해당 라이브러리에 발생한 버그를 한 곳에서 수정할 수 있습니다. 또한, 새로운 기능을 추가하거나 업데이트하는 것이 용이합니다.
  • 효율성 증가

    • 공통 라이브러리를 사용하면 개발자들이 동일한 기능을 반복해서 구현하는 시간을 절약할 수 있으므로 개발 효율성을 증가시킬 수 있습니다.

단점

  • 의존성 관리

    • 공통 라이브러리를 사용하면 해당 라이브러리에 의존성이 생기게 됩니다. 이는 라이브러리의 버전 관리와 호환성을 유지하는 것이 중요하며, 때로는 업그레이드나 변경이 어려울 수 있습니다.
  • 유연성 감소

    • 공통 라이브러리를 사용하면 해당 라이브러리가 제공하는 기능에 제한되어 있을 수 있습니다. 따라서 특정 요구사항을 충족하기 위해 추가적인 개발이 필요할 수 있습니다.
  • 코드 복잡성 증가

    • 공통 라이브러리를 사용하면 해당 라이브러리의 내부 동작을 이해하고 이에 맞게 사용해야 합니다. 때로는 라이브러리의 복잡성으로 인해 코드가 더 복잡해질 수 있습니다.
  • 오버헤드 발생

    • 모든 프로젝트에서 공통으로 사용하는 라이브러리를 만들어 유지하는 것은 추가적인 시간과 노력이 필요합니다. 또한, 해당 라이브러리의 사용으로 인한 오버헤드가 발생할 수 있습니다. ex) 추가적인 메모리 사용, 실행 시간 지연 등 문제 발생하게된다.
  • 경험에서 나오는 단점

    • 모든 경우에 있어서 공통 라이브러리가 좋다고는 할 수 없습니다. MSA에서도 Product MS 서버의 경우 User와 관련된 Entity 내용정도는 가지고 있을 필요가 있는 경우가 있습니다. 그렇게 Entity에 대해서 내용이 필요한 것을 공통 라이브러리에 담으면 특정 MS 서버에서는 필요없는 코드를 가지고 있게 될 수 있습니다.

공통 라이브러리 적용

생성 방법

  • build.gradle 작성
    • plugins => apply false : 공통 라이브러리 생성에 스프링부트 프로젝트를 빌드할 필요가 없습니다.
    • dependencyManagement : 다른 애플리케이션에서도 동일한 버전의 스프링 부트 및 관련 라이브러리를 사용할 수 있도록 하기 위함입니다.
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.4' apply false
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'org.example'
version = '0.0.6' // 새로운 jar 파일로 만들고 싶으면 버전 수정

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencyManagement {
	imports {
		mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
	}
}

dependencies {
	// 공통 라이브러리로 만들 코드에 필요한 의존성 작성
}

tasks.named('test') {
	useJUnitPlatform()
}
  • 파일 구성하기

    • global 내에 있는 모든 코드는 공통 라이브러리로 만들 코드를 작성

    • recources 아래 파일 구성
      - 다른 스프링부트 프로젝트에서는 해당 라이브러리를 Bean에 자동 등록해주지 않아 등록해주도록 만들어주는 파일이다 아래 코드는 파일 내용이다.

      org.example.share.config.AutoConfig
      - AutoConfig 코드
      @Configuration
      @ComponentScan("org.example.share")
      public class AutoConfig {
      
      }

      위와 같이 파일을 구성하고 build 하면 지정한 버전으로 jar파일이 생긴다.

적용 방법

위에서 생긴 jar파일을 필요한 프로젝트의 로컬 위치에 넣어주고 build.gradle 수정

dependencies {
	implementation files('share-0.0.1-SNAPSHOT.jar')
}

아래와 같이 jar 파일의 내용을 화살표로 열 수 있다면 성공이다

위에서와 같이 공통 라이브러리를 생성하는데 성공하고 적용까지 해보았다. 다만 Nexus나 Jenkins를 이용해서 파일을 배포하거나 하지 않아서 추가 공통 라이브러리가 필요할 때마다 다시 만들어서 넣어줘야 하는 불편함이 생겼다.

0개의 댓글