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
450
Multi-Project Build の魅力 / JJUG CCC 2024 Fall - LT
JJUG CCC 2024 Fall の夜の部で LT した内容です。
Multi-Project Build の魅力について発表しました。
Fumitaka Yokoyama
November 12, 2024
Tweet
Share
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
54
11k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Six Lessons from altMBA
skipperchong
28
4k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Into the Great Unknown - MozCon
thekraken
40
2k
Art, The Web, and Tiny UX
lynnandtonic
302
21k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Visualization
eitanlees
148
16k
BBQ
matthewcrist
89
9.8k
4 Signs Your Business is Dying
shpigford
184
22k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
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