개발자
[멀티모듈 지옥 탈출기] 멀티 모듈 파헤쳐보기-2(JPA,Gradel,SpringBoot) 본문
[멀티모듈 지옥 탈출기] 멀티 모듈 파헤쳐보기-2(JPA,Gradel,SpringBoot)
GoGo개발 2023. 5. 22. 18:40저번 포스트에 이어서 이번포스팅에는 멀티모듈로 프로젝트 구조를 직접 바꿔보겠습니다
저번 글에 있듯이 저의 원래 프로젝트 구조는 이렇게 되어있습니다. 루트 모듈 하나만 존재하는 상태. 이제 모듈을 나누기 전에 루트 모듈에있는 build.gradle 파일을 변경해 줍니다!
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.8'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
repositories {
mavenCentral()
}
subprojects {
group = 'workFlow.WFrefactoring'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
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') {
exclude module: 'junit'
}
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-validation'
//값과 쿼리 같이보기
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
}
test {
useJUnitPlatform()
}
}
subprojects : 전체 서브 모듈 에 해당되는 설정 (전체 서브모듈에 적용될 설정들을 설정해줍니다)
그 다음 각 모듈을 만들어 줍니다
폴더를 우클릭 → New → Module을 클릭해서 새로운 모듈을 만들어 줍니다
저는 이렇게 api,domain,data 모듈을 만들었습니다. 그리고 여기서 부터는 모듈을 나누어 각 모듈별로 나누어서 짜줄 것이기 때문에 루트 모듈에 있는 src디렉토리는 사용하지않아 삭제해 주었습니다
이제 그럼 전체 root 모듈의 build.gradle로 들어가서 각 모듈의 설정을 해줍니다.
이부분은 각 모듈 안의 build.gradle에서 설정해주어도 되는데요, 저는 한번에 관리할 수 있도록 루트 모듈에 해주었습니다.
project(':employee-api') {
dependencies {
implementation project(':data')
implementation project(':domain')
}
}
project(':domain') {
dependencies {
implementation project(':data')
}
}
project(':data') {
dependencies {
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.32'
}
}
이렇게 3개의 모듈을 추가해주고, 각 모듈의 의존성을 설정해줍니다.(저는 이전 포스팅의 의존관계 대로 넣어줬어요!)
그런 뒤 또 루트 모듈의 setting.gradle 에서 프로젝트들이 제대로 include 되어있는지 확인해주어야 합니다
잘되어있네요! 안되어 있다면 직접 써주시면 됩니다! 그런뒤 빌드를 해보면
그리들에 각 모듈들이 잘 추가되어있는 것이 확인됐습니다~
이제 각 모듈의 build.gradle 에 들어가서 각 각의 모듈에 맞는 설정을 추가로 설정해주면 됩니다
저의 경우는 data 모듈안의 build.gradle에는
bootJar { enabled = true }
jar { enabled = true }
이런 설정을 추가했구요!
나머지 모듈안의 build.gradle에는
bootJar { enabled = false }
jar { enabled = true }
이 설정을 추가했습니다
이 설정들에 대한 설명은 이번주내로 추가하겠습니다~
여기서 고민이 있었습니다 DB와 관련 설정은 어느 모듈에서 해줘야하지? data가 entity와 repository를 다루는 모듈이고 현재 모든 모듈에서 의존을 해놓은 상태이니 data모듈에 DB설정을 하는게 맞는 것 같아 그렇게 진행했습니다. 다른 포스트에서 data가 아닌 api나 domain모듈에서 DB설정하는 포스팅도있었고, data모듈에 설정시 sql 로그가 안나온다는 우려가 있어 고민했지만 다행이 저는 문제없이 동작되었습니다!
자이제 완성된 프로젝트 구조를 살펴보겠습니다
data 모듈안에는 처음 설계한 대로 model(entity), respository, enums 이 들어가 있습니다
그리고 DB설정이 들어있는 yml파일도 data모듈에 설정해놓았습니다
그 다음 domail모듈의 구조입니다. 도메인별로 sevice클래스와 dto가 포함되어 있습니다
마지막 api모듈에는 도메인별로 controller와 main 메소드가 있는 클래스가 있습니다! 테스트와 어플리케이션 실행을 담당하는 모듈입니다
포스트맨으로 api 테스트도 해보았고, 테스트코드까지 돌려보니 모두 정상으로 작동했습니다!
지옥의 멀티모듈 탈출기! 탈출로 마무리!
'개발자 > workflow 리팩토링 프로젝트(SpringBoot,JPA,MySQL)' 카테고리의 다른 글
[Spring boot] Spring 처리단계(Filter,DispatcherServlet,InterCepter,controller) (0) | 2023.06.27 |
---|---|
[SpringSecurity]스프링 시큐리티란?/ PasswordEncoder 스프링 시큐리티를 사용해서 패스워드 암호화 하기 (0) | 2023.06.13 |
[멀티모듈 지옥 탈출기] 멀티 모듈 파헤쳐보기-1(JPA,Gradel,SpringBoot) (1) | 2023.05.19 |
[JPA] Lombok 어노테이션(@Data,) (0) | 2023.05.02 |
[class] 내부 클래스, 내부 static 클래스 (0) | 2023.05.02 |