간단한 MSA 설계 (24.05.27)

YJ·2024년 5월 27일
post-thumbnail

블로그 작성법
목표 > 공부한 내용 > 얻었고, 앞으로 이걸 해봐야지 적기

✋ 수업 목표

  • Reflection API에 대해 공부하자.
  • MSA에 대해 공부하자.

🤔 공부한 내용

MSA

게이트웨이

  • 프로토콜을 사용해서 두 시스템(소프트웨어)이 통신할 수 있게 도와주는 컴퓨터(또는 소프트웨어)

  • 통로 역할

  • 어떻게 알고, A / B로 나눠서 보내주는 걸까?

  1. 수동으로 하나하나 알려주면 되세요.
    = 뭔가 더 추가되면, 매번 다 알려줘야 하는 구나.

분리된 어플리케이션끼리 통신하는 방식

  1. Rest Template
  2. Web Client
  3. OpenFeign
  4. Message Broker

4번째 방식을 가장 많이 사용한다.
ex. Rabbit MQ, Kafka, ActiveMQ 등

GlobalExceptionHandler 같은 공통 패키지는 어떻게 해야할까?

같은 코드를 모든 프로젝트에 복붙 해야하나?
ex. Exception 추가 되면, 모든 프로젝트 다 켜놓고 다 복붙

공통된 클래스는 다 같이 가져가는 방법

MSA 실습

  1. Start.spring.io 프로젝트 : multi-module

module: 독립적으로 배포할 수 있는 단위

루트모듈 - 서브모듈

  1. 루트모듈의 build.gradle을 잡고 프로젝트를 킨다.

  2. 서브모듈을 압축을 풀고, 드래그앤드롭으로 루트 모듈 안으로 move 시켜 온다.

  3. multi-module의 settings.gradle을 설정한다.

    -> a-module, b-module을 intellij가 인식 (파란 네모 생성)

  4. multi-module build.gradle을 아래와 같이 바꿉니다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.0'
	id 'io.spring.dependency-management' version '1.1.5'
}

allprojects {
	group = 'com.shoppingmall'
	version = '0.0.1-SNAPSHOT'

	java {
		sourceCompatibility = '17'
	}

	apply plugin: 'java'
	apply plugin: 'org.springframework.boot'
	apply plugin: 'io.spring.dependency-management'

	repositories {
		mavenCentral()
	}

	dependencies {
		implementation 'org.springframework.boot:spring-boot-starter-web'
		testImplementation 'org.springframework.boot:spring-boot-starter-test'
		testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
	}

	tasks.named('test') {
		useJUnitPlatform()
	}
}
  1. a-module, b-module의 build.gradle, settings.gradle 삭제
    주의사항
    a-module, b-module 폴더 밑에 바로 src.. 등이 존재해야함

여기까지하면 각 Application 실행 가능

다른 모듈의 클래스를 가져다 사용하려고 하면 사용이 안된다.

다른 프로젝트이기에 인식이 되지 않는 것 이다.

해결하기 위해서는 루트 프로젝트의 build.gradle에 추가해줘야한다.

:은 서브 모듈이라는 뜻이다.

나 b-module인데 a-module 사용할 거야.

이제 b-module에서 a-module을 사용할 수 있다.


다음과 같이 실행되는 것을 확인할 수 있다.

jar 차이

build를 하면 2가지 jar가 생긴다.
jar는 java에 대한 알집 파일이라고 생각.
사용 용도
1. 배포
2. 라이브러리화

  • Gradle 명령어

    • Bootjar: {project-name}.jar - 단독 실행 가능, 어플리케이션 배포용
    • Jar: {project-name}-plain.jar - 단독 실행 불가, 라이브러리 배포용
    • Build: 두 가지 jar를 모두 다 생성 + 테스트 코드 실행, 코드 분석, ...

    배포용으로는 plain이 없는 이름을 사용해야 한다.

그러면 다음과 같은 위치에 jar파일이 생성된다.

java -jar {project-name}.jar
ex> java -jar b-modlue-0.0.1.SNAPSHOT.jar

다음과 같이 실행이 되는 것을 확인할 수 있다.

알쓸송잡

😉 앞으로 이걸 해봐야지

오늘은 모듈을 여러 개 만들어서 간단하게 MSA를 구축해보았다.
앞으로 도메인 별로 모듈을 생성하여 루트 모듈과 서브 모듈로 MSA 아키텍처를 구축하고 배포해볼 것 이다.
또한, jar 파일을 생성하여 서버를 실행하는 것이 신기하였다.

profile
dev

0개의 댓글