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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Fumitaka Yokoyama
November 12, 2024
0
610
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
8
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
1
3.1k
Paper Plane
katiecoart
PRO
0
47k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
63
53k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
110
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
130
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
150
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
140
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How GitHub (no longer) Works
holman
316
140k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4k
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