Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Multi-Project Build の魅力 / JJUG CCC 2024 Fall - LT
Search
Fumitaka Yokoyama
November 12, 2024
0
590
Multi-Project Build の魅力 / JJUG CCC 2024 Fall - LT
JJUG CCC 2024 Fall の夜の部で LT した内容です。
Multi-Project Build の魅力について発表しました。
Fumitaka Yokoyama
November 12, 2024
Tweet
Share
More Decks by Fumitaka Yokoyama
See All by Fumitaka Yokoyama
変更を操る Agent Coding
fm_yokoyama
0
7
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
0
2k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
740
Why Our Code Smells
bkeepers
PRO
340
58k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
250
The Mindset for Success: Future Career Progression
greggifford
PRO
0
240
Darren the Foodie - Storyboard
khoart
PRO
2
2.4k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
920
How to Talk to Developers About Accessibility
jct
2
130
Designing Experiences People Love
moore
144
24k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
750
A Tale of Four Properties
chriscoyier
162
24k
Transcript
© 2024- atWare Inc. Multi-Project Build の魅力 株式会社アットウェア 横山 史尭
© 2024- atWare Inc. こんなことありませんか?
© 2024- atWare Inc. package org.example.presentation.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;
... import org.example.repository.user.UserDataModel; @RestController public class UserController { ... @GetMapping("/users") public List<UserView> getUsers(UsersSearchParams params) { ... List<UserDataModel> userDataModels = searchUsersService.invoke(params); List<UserView> userViews = converter.convert(userDataModels); return userViews; } } \ できました! /
© 2024- atWare Inc. package org.example.presentation.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;
... import org.example.repository.user.UserDataModel; @RestController public class UserController { ... @GetMapping("/users") public List<UserView> getUsers(UsersSearchParams params) { ... List<UserDataModel> userDataModels = searchUsersService.invoke(params); List<UserView> userViews = converter.convert(userDataModels); return userViews; } }
© 2024- atWare Inc. そこで、
© 2024- atWare Inc. Multi-Project Build in Gradle @see https://docs.gradle.org/current/userguide/intro_multi_project_builds.html
© 2024- atWare Inc. Multi-Project Build の魅力 - 依存関係の制御 -
sub-project の独立性 - domain, application の再利用性 - パフォーマンス向上
© 2024- atWare Inc. Project structure
© 2024- atWare Inc. Project structure (all) - buildSrc build
conventions - app bootable (AppMain.class) - lib: - presentation - application-service-interface - application-service - application-data-interface - data-adaptor - domain - composite project: - util
© 2024- atWare Inc. Project structure (simplified) - presentation *Controller,
view - application-service-interface interface *Service application I/O - application-service *ServiceImpl - application-data-interface interface *Repository - data-adaptor *RepositoryImpl
© 2024- atWare Inc. dependencies { implementation(project( ":lib:application-service-interface" )) implementation(project(
":lib:domain" )) implementation( "org.springframework.boot:spring-boot-starter-web" ) implementation( "org.springframework.boot:spring-boot-starter-thymeleaf" ) } ./lib/presentation/build.gradle
© 2024- atWare Inc. dependencies { implementation(project( ":lib:application-service-interface" )) implementation(project(
":lib:application-data-interface" )) implementation(project( ":lib:domain" )) implementation( "org.springframework.boot:spring-boot-starter" ) } ./lib/application-service/build.gradle
© 2024- atWare Inc. dependencies { implementation(project( ":lib:application-data-interface" )) implementation(project(
":lib:domain" )) implementation( "org.springframework.boot:spring-boot-starter-data-jpa" ) } ./lib/data-adaptor/build.gradle
© 2024- atWare Inc. package org.example.presentation.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;
... import org.example.repository.user.UserDataModel; @RestController public class UserController { ... @GetMapping("/users") public List<UserView> getUsers(UsersSearchParams params) { ... List<UserDataModel> userDataModels = searchUsersService.invoke(params); List<UserView> userViews = converter.convert(userDataModels); return userViews; } } import できねえ、、
© 2024- atWare Inc. まとめ アーキテクチャをハウスルールだけでなく、 実際に強制力のあるものにすることができます。 暴れまわる若手の手綱を握って快適な開発を! 参考: https://docs.gradle.org/current/userguide/userguide.html