Spring/Redis

태태개발일지 - redis

태태코 2025. 1. 27. 14:06
반응형

근황

 

오랜만에 다시 글을 작성하게 되었다.

회사일이 바빠지기도 했고, 영어시험, spring boot 공부, 항해 redis, AI준비 등

다양한 것을 조금씩 준비하다보니 글을 작성할 시간이 부족했다.(사실 쓰려면 썼음)  

 

 

 

멀티모듈

데이터 베이스 설계부터 시작했는데. 이 부분은 DB부분에 DB설계하는 부분에 내용을 작성해 놓았다.

 

우선 멀티 모듈을 설계하기 위해서 선택해야할 것은 두가지였다.

 

1. domain 별 모듈로 설정.

2. Architecture 별 모듈로 설정.

 

나는 2번을 골랐다. 

 

이유: 원래 Spring 프로젝트를 할 때 계층별로 묶어서 객체지향적으로 프로젝트를 하는 것을 선호 하기 때문이다.
2번을 실행하면 Architecture구조는 "clean + Layered Architecture" 구조를 사용했다.

 

 

마찬가지로 원래 프로젝트를 할 때 이 구조를 선호하기 때문이다.

 

아키텍쳐 구조

 

최 상위 계층부터

  • presentation:표현계층(controller)
  • application:응용계층(facade)
  • domain:엔티티계층(entity,service, repository(interface) ) 
  • infrastructure:인프라계층(repository, jpa, mybatis)

로 나누었다.

모듈로 나누면서 느낀점

  • 혼자 간단한 프로젝트를 하는데 너무 많은 설정이 필요하다?? 였다. 하지만! 멀티모듈에 대한 감을 익히기 위해 사용하라고 했으니.
    장점만 바라보면서 모듈로 나누었다.
  • 하나의 단일 모듈로 Layered + clean Architecture를 구현했을 때와 비교했을 때 장점은 하나가 있었다. 모듈끼리의 의존성을 명시하지 않으면 의존자체를 할 수 없어서. 실수로 하는 역참조를 방지할 수 있다는 것이다.  (즉 개발자의 실수를 줄일 수 있음)
  • 아직 멀티 모듈이 처음이라 차차 적용해 나가겠지만, 가장 장점이라고 느낀 것은 이거였고, 설정이 너무 많아서 이것은 초기 비용이 높다는 단점이 느껴졌다.(단순한 개발이라면 단일 모듈, 복잡하고 여러명이 개발한다면 멀티모듈)
  • 의존성이 각각 나누어져있다보니깐 , 독립적인 테스트가 가능하고 서로의 오류에 영향을 줄일 수 있다.

아키텍쳐 설명

아키텍쳐는 기본적인 Layered Architecture의 구조는 presentation -> application -> domain -> infra인데 domain 계층에 repository interface를 구현체를  놓아서
presentation -> application -> domain(repository) <- infra(repositoryImpl)의 구조를 만들어서 domain계층을 완전히 분리시키는 방식을 통해서 DIP(의존성 역전)를 사용했다.

 

결과:

수많은 시행착오가 있었다. 

  1. root모듈과 서브 모듈들에 application.yaml을 따로 설정하는 방법을 몰라서 root모듈에 의존성을 다 모아서 사용했더니, 그냥 단일모듈과 별 다른 차이점이없었다.
    해결:  각각 프로퍼티와 의존성을 따로 설정하는 방법을 찾아서 아키텍쳐 구조대로 의존을 명시하여, 해결했다.
  2. query dsl이나 redis , aop 모듈의 위치를 각 계층중 어디에 넣어야될 까 고민을 많이했다.
    해결 : 이 글을 나중에 이후에 다루겠다.
  3. infra 계층에만 query dsl에 대한 의존성을 넣고 싶었는데.. entity계층에 jpa entity가 있어서 어려움을 겪었다.
    해결 : 이 글도 나중에 이후에 다룸
  4. 각각 프로퍼티설정
    해결: 이건 그냥 시행착오를 겪으면서 맞는 방식을 찾아가는 수 밖에 없다.

 

멀티모듈 구성하는법

 

  1. root 모듈을 만든다. 
    settings.gradle 파일에 하위의 모듈들을 선언해 준다.
rootProject.name = 'multi'
include 'presentation'
include 'application'
include 'domain'
include 'infrastructure'

 

2.  build.gradle파일에 모듈의 공통된 의존성을 추가해준다.

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.1' // Spring Boot 플러그인 추가
	id 'io.spring.dependency-management' version '1.1.7' // 의존성 관리 플러그인 추가
}

springBoot {
	mainClass = 'com.example.Application' // 실제 main 메서드가 있는 클래스 경로
}
allprojects {
	group = 'com.example'
	version = '1.0.0'

	repositories {
		mavenCentral()
	}

	java {
		sourceCompatibility = JavaVersion.VERSION_17
		targetCompatibility = JavaVersion.VERSION_17
	}

}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

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


	dependencies {
		implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
		implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
		compileOnly 'org.projectlombok:lombok'
		annotationProcessor 'org.projectlombok:lombok'
		testImplementation 'org.springframework.boot:spring-boot-starter-test'
		testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
	}

	tasks.named('test') {
		useJUnitPlatform()
	}
}

 

 

3.  하위 모듈은 계층 대로 의존할 계층을 build.gradle에 명시만 해주면된다.

 

ex)

dependencies {
    implementation project(':application')
    implementation project(':domain')
    implementation project(':infrastructure')
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

나머지 property 같은 경우에는 각 계층에 필요한 것을 명시해주면 된다.

 

 

궁금점 & 더 알아볼 점

아직도 Spring 을 실행하는 Main Method가 presentation 계층인지 application 계층에 있어야하는지 모르겠다. 

 

반응형

'Spring > Redis' 카테고리의 다른 글

태태개발일지 - redis  (0) 2025.01.27
태태개발일지 -REDIS  (1) 2024.11.12
Spring redis 총정리  (0) 2024.05.27
태태 개발일지(No sql)  (0) 2023.08.03
태태 개발일지 Redis편  (0) 2023.08.02