Slide 1

Slide 1 text

Slide 2

Slide 2 text

• Java – DI 1 • ( ) • • • FaaS •

Slide 3

Slide 3 text

• • ICT ICTDX • :

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Spring Framework Hibernate • Web 10 20 • EOL

Slide 6

Slide 6 text

Web • • Spring+Hibernate/Quarkus+Hibernate/JAX-RS+Hibernate/JAX-RS+DbUtils • • 100 Entity 1 20 • 400 Service Entity CRUD • 400 Controller MPA Web • 900 • • Controller

Slide 7

Slide 7 text

※2025 / # DI 10 EntityManager 10 22 Spring Web MVC + Hibernate JVM /Native Image 20 Quarkus + Hibernate DI 8 JAX-RS/RestEasy + Hibernate ORM 2 JAX-RS/RestEasy + Commons DbUtils Quarkus 20 Quarkus

Slide 8

Slide 8 text

DI ORM DI ORM DI DI ORM

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

1 DI • • •

Slide 11

Slide 11 text

SOLID D DIP Dependency Inversion Principle • • DIP ( ) NG OK OK

Slide 12

Slide 12 text

• DI •

Slide 13

Slide 13 text

// DI public class OrderService { // // DI public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } }

Slide 14

Slide 14 text

// public class OrderService { private final PaymentService paymentService; // // ServiceLocator public OrderService() { this.paymentService = ServiceLocator.get(PaymentService.class); } }

Slide 15

Slide 15 text

DI DI DIP FW FW DI

Slide 16

Slide 16 text

DiRegistry Dependency Inversion Registry • ID • • DiRegistry DI Dependency Injection DIP Dependency Inversion Principle Composition Root

Slide 17

Slide 17 text

24

Slide 18

Slide 18 text

DiRegistry // ID public enum AppResources { APP_ENGINE_CONFIG, DB_SESSION_FACTORY, }

Slide 19

Slide 19 text

// DiRegistryBase extends public class AppRegistry extends DiRegistryBase { // // public final static DiProfile PROFILE = DiProfile.builder() // .resource( AppResources.DB_SESSION_FACTORY, // ID "com.example.fw.db.SessionFactoryImpl", // new String[] { "hikaricp.properties" // } ) .resource(……) .build(); }

Slide 20

Slide 20 text

public class AppRegistry extends DiRegistryBase { // …… public AppRegistry() { this(PROFILE); } public static AppRegistry getInstance() { return INSTANCE; } public static AppRegistry setProfile(DiProfile profile) { PROFILE = profile; } }

Slide 21

Slide 21 text

var factory = (SessionFactory) AppRegistry.getInstance().get(AppResources.DB_SESSION_FACTORY); var session = factory.openSession(); AppRegistry AppRegistry get Object AppRegistry

Slide 22

Slide 22 text

public interface DiRegistry { T get(R key) throws SystemException; } public abstract class DiRegistryBase implements DiRegistry { // // ConcurrentHashMap private final DiProfile profile; public DiRegistryBase(DiProfile profile) { this.profile = profile; } @Override public T get(R key) throws SystemException { return (T) getResource(key); } } DiRegistry

Slide 23

Slide 23 text

public abstract class DiRegistryBase implements DiRegistry { // private Object getResource(R key) throws SystemException { var diResource = profile.getResources().stream() .filter(resource -> resource.getResource().equals(key)) .findFirst() .orElse(null); try { // return Class.forName(diResource.getClassName()). getConstructor(String[].class). newInstance(diResource.getArgs()); } catch (Exception e) { throw new SystemException(e); } } }

Slide 24

Slide 24 text

public abstract class AppTestBase { // static { AppRegistry.setProfile( // DiProfile.builder() // ...... .resource( AppResources.DB_SESSION_FACTORY, "com.example.fw.db.MockSessionFactoryImpl", new String[] {} ) .build() ); } } DiRegistry DiRegistry

Slide 25

Slide 25 text

DIP 900 20 2 1 DiRegistry DI DIP FW FW 1-2

Slide 26

Slide 26 text

• • • • • Spring Framework Spring Framework Hibernate Web jar 150MB 20MB

Slide 27

Slide 27 text

DiRegistry Spring Framework DI DiRegistry ConfigFactory ScopeManager AOP InterceptorChain

Slide 28

Slide 28 text

Spring Framework DiRegistry • Auth • JDBC • Batch/OnBach • Appserver • Template • FaaS • ……

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

EOL DiRegistry

Slide 31

Slide 31 text

• EOL DiRegistry • JPMS Java Platform Module System • JPMS • DiRegistry

Slide 32

Slide 32 text

v2 v1 EOL v1 v2

Slide 33

Slide 33 text

src/main/java/ ├─ module-info.java // JPMS ├┬ com.example.fw.mail/ // │├─ MailFactory (interface) │└─ Mail (interface) ├┬ com.example.fw.mail.javamail/ // JavaMail │├─ MailFactoryImpl │└─ MailImpl └┬ com.example.fw.mail.sesv2/ // AmazonSES ├─ MailFactoryImpl └─ MailImpl JavaMail AmazonSES Mail

Slide 34

Slide 34 text

// module-info.java module com.example.fw.mail { exports com.example.fw.mail; // // exports com.example.fw.mail.javamail // // exports com.example.fw.mail.sesv2 // opens com.example.fw.mail.javamail to com.example.fw.core; // DiRegistry javamail opens com.example.fw.mail.sesv2 to com.example.fw.core; // DiRegistry sesv2 requires jakarta.mail; requires software.amazon.awssdk.services.sesv2; } module-info.java

Slide 35

Slide 35 text

// com.example.fw.mail public interface MailFactory { Mail newMail(String mailId); } // com.example.fw.mail public interface Mail { void addTo(String mailAddress); void setSubject(String subject); void setBody(String body); void send() throws SystemException; } MailFactory Mail

Slide 36

Slide 36 text

public class MailFactoryImpl implements MailFactory { private final MailConfig config; public MailFactoryImpl(String[] args) { this.config = ConfigFactory.getConfig(args[0], MailConfig.class); } @Override public Mail newMail(String mailId) { return new MailImpl(this, mailId); } } public class MailImpl implements Mail { @Override public void send() throws SystemException { var mail = render(getMailRenderer()); getMailSender().sendMail(mail); } } JavaMail MailFactoryImpl MailImpl

Slide 37

Slide 37 text

dependencies { // Core dependencies implementation(libs.slf4j.api) // CompileOnly dependencies compileOnly(libs.jakarta.mail) compileOnly(libs.angus.mail) compileOnly(platform(libs.awssdk2.bom)) compileOnly(libs.awssdk2.ses) // RuntimeOnly dependencies runtimeOnly(libs.logback.core) runtimeOnly(libs.logback.classic) } Gradle dependencies JavaMail AmazonSES compileOnly runtimeOnly

Slide 38

Slide 38 text

public class AppRegistry extends DiRegistryBase { public final static DiProfile PROFILE = DiProfile.builder() // ...... .resource( AppResources.MAIL_FACTORY, // JavaMail Amazon SES "com.example.fw.mail.javamail.MailFactoryImpl", // "com.example.fw.mail.sesv2.MailFactoryImpl", new String[] { // "mail-config.yaml", } ) .build(); } DiRegistry MailFactory

Slide 39

Slide 39 text

// DiRegistry // JPMS var mailFactory = (MailFactory) AppRegistry.getInstance().get(AppResources.MAIL_FACTORY); var mail = mailFactory.newMail("HELLO_WORLD"); mail.addTo("[email protected]"); mail.setSubject("Hello,world"); mail.setBody("Hello,world!"); mail.send(); // JavaMail

Slide 40

Slide 40 text

• • • • • • • •

Slide 41

Slide 41 text

• Java interface • Java • JPMS record enum • • • Javadoc

Slide 42

Slide 42 text

getUnsafeContext(contextName) var httpClient = AppRegistry.getInstance().get(AppResources.HTTP_CLIENT); // apacheHttpClient var apacheHttpClient = httpClient.getUnsafeContext("apacheHttpClient");

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

REST API FaaS AWS Lambda DB 1 S3 1 ( FW/Python/SpringBoot) REST API SnapStart SnapStart Lambda

Slide 45

Slide 45 text

SnapStart 30 ms 3,500 ms SnapStart 12MB 512MB FW 300 ms 1,500 ms SnapStart 0.8MB 512MB Python 30 ms 9,000 ms SnapStart 34MB 512MB SpringBoot ※ SnapStart DiRegistry 2MB JDBC 2

Slide 46

Slide 46 text

JDBC S3Client :100 400 400

Slide 47

Slide 47 text

• FaaS static • DB S3 • DiRegistry DataSource • DiRegistry • JDBC SnapStart

Slide 48

Slide 48 text

DataSource SnapStart DB TCP Stale

Slide 49

Slide 49 text

public class Application implements RequestHandler<……> { static { warmUpAndRestart(); } // static private static void warmUpAndRestart() { // Map input = Map.of(……); // /system/dbS3Ping getFunctionDispatcher().dispatch(input, Map.of()); // AppRegistry.getInstance().restart(); } } static warmUpAndRestart SnapStart static

Slide 50

Slide 50 text

FW Lambda 2 Python 30 ms 3,500 ms → 1,700 ms SnapStart 12MB 512MB FW 300 ms 1,500 ms SnapStart 0.8MB 512MB Python 30 ms 9,000 ms SnapStart 34MB 512MB SpringBoot ※ SnapStart DiRegistry DiRegistry

Slide 51

Slide 51 text

Java REST API Web FaaS • Tomcat AP • AP FaaS • DB AWS RDS Proxy • Java FaaS

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

• • • • • (JPMS) • FaaS •

Slide 54

Slide 54 text

• • •

Slide 55

Slide 55 text

No content