From d2bb77ca33526fe58785ef19dcd58180f3d70b10 Mon Sep 17 00:00:00 2001 From: Elex Date: Wed, 28 Feb 2024 16:39:48 +0900 Subject: [PATCH] add jpa module --- buildSrc/src/main/kotlin/elex-base.gradle.kts | 4 +- .../main/kotlin/elex-spring-boot.gradle.kts | 1 - jpa/README.md | 29 ++++++++++++ jpa/build.gradle.kts | 34 ++++++++++++++ .../java/kr/pe/elex/examples/Application.java | 20 ++++++++ .../main/java/kr/pe/elex/examples/Config.java | 29 ++++++++++++ .../kr/pe/elex/examples/MyController.java | 42 +++++++++++++++++ .../main/java/kr/pe/elex/examples/Person.java | 33 +++++++++++++ .../java/kr/pe/elex/examples/PersonDto.java | 40 ++++++++++++++++ .../kr/pe/elex/examples/PersonRepository.java | 17 +++++++ .../kr/pe/elex/examples/package-info.java | 8 ++++ jpa/src/main/resources/application.yaml | 22 +++++++++ jpa/src/main/resources/banner.txt | 10 ++++ jpa/src/main/resources/logback-spring.xml | 47 +++++++++++++++++++ .../main/resources/templates/home.mustache | 1 + mvc/build.gradle.kts | 4 +- settings.gradle.kts | 2 +- 17 files changed, 337 insertions(+), 6 deletions(-) create mode 100644 jpa/README.md create mode 100644 jpa/build.gradle.kts create mode 100644 jpa/src/main/java/kr/pe/elex/examples/Application.java create mode 100644 jpa/src/main/java/kr/pe/elex/examples/Config.java create mode 100644 jpa/src/main/java/kr/pe/elex/examples/MyController.java create mode 100644 jpa/src/main/java/kr/pe/elex/examples/Person.java create mode 100644 jpa/src/main/java/kr/pe/elex/examples/PersonDto.java create mode 100644 jpa/src/main/java/kr/pe/elex/examples/PersonRepository.java create mode 100644 jpa/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 jpa/src/main/resources/application.yaml create mode 100644 jpa/src/main/resources/banner.txt create mode 100644 jpa/src/main/resources/logback-spring.xml create mode 100644 jpa/src/main/resources/templates/home.mustache diff --git a/buildSrc/src/main/kotlin/elex-base.gradle.kts b/buildSrc/src/main/kotlin/elex-base.gradle.kts index fd505d0..3b033ff 100644 --- a/buildSrc/src/main/kotlin/elex-base.gradle.kts +++ b/buildSrc/src/main/kotlin/elex-base.gradle.kts @@ -24,8 +24,8 @@ repositories { java { withSourcesJar() withJavadocJar() - sourceCompatibility = org.gradle.api.JavaVersion.VERSION_1_8 - targetCompatibility = org.gradle.api.JavaVersion.VERSION_1_8 + sourceCompatibility = org.gradle.api.JavaVersion.VERSION_17 + targetCompatibility = org.gradle.api.JavaVersion.VERSION_17 } configurations { diff --git a/buildSrc/src/main/kotlin/elex-spring-boot.gradle.kts b/buildSrc/src/main/kotlin/elex-spring-boot.gradle.kts index 21d0de7..7377f79 100644 --- a/buildSrc/src/main/kotlin/elex-spring-boot.gradle.kts +++ b/buildSrc/src/main/kotlin/elex-spring-boot.gradle.kts @@ -14,5 +14,4 @@ plugins { dependencies{ //implementation("org.jetbrains:annotations:24.0.0") - } diff --git a/jpa/README.md b/jpa/README.md new file mode 100644 index 0000000..072391b --- /dev/null +++ b/jpa/README.md @@ -0,0 +1,29 @@ +# spring-boot-validation-examples + +```kotlin +implementation ("org.springframework.boot:spring-boot-starter-validation") +``` + +## Annotations + +* @Digits +* @Email +* @Max +* @Min +* @Negative +* @NotBlank +* @NotEmpty +* @NotNull +* @Null +* @Pattern +* @Positive +* @Size + +https://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/ + + + +--- +developed by Elex + +https://www.elex-project.com diff --git a/jpa/build.gradle.kts b/jpa/build.gradle.kts new file mode 100644 index 0000000..2a2e0ea --- /dev/null +++ b/jpa/build.gradle.kts @@ -0,0 +1,34 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2024. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +plugins { + id("elex-spring-boot") + id("org.springframework.boot") version "3.2.3" + id("io.spring.dependency-management") version "1.1.4" +} +java { + sourceCompatibility = JavaVersion.VERSION_17 +} +dependencies { + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-thymeleaf") + implementation("org.springframework.boot:spring-boot-starter-web") + + // https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + runtimeOnly("org.mariadb.jdbc:mariadb-java-client") + + implementation ("org.springframework.boot:spring-boot-starter-validation") + + compileOnly("org.projectlombok:lombok") + developmentOnly("org.springframework.boot:spring-boot-devtools") + + annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") + annotationProcessor("org.projectlombok:lombok") + + testImplementation("org.springframework.boot:spring-boot-starter-test") +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/Application.java b/jpa/src/main/java/kr/pe/elex/examples/Application.java new file mode 100644 index 0000000..7ff4bbf --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/Application.java @@ -0,0 +1,20 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/Config.java b/jpa/src/main/java/kr/pe/elex/examples/Config.java new file mode 100644 index 0000000..035dd97 --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/Config.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024. Elex. All Rights Reesrved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import java.time.LocalDateTime; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Configuration +@EnableScheduling +public class Config { + @Autowired + private PersonRepository repository; + @Scheduled(fixedRate = 1, timeUnit = TimeUnit.MINUTES) + public void task1(){ + log.info("TASK executed."); + repository.deleteAllInBatch(repository + .findByCreatedAtLessThan(LocalDateTime.now().minusMinutes(2))); + } +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/MyController.java b/jpa/src/main/java/kr/pe/elex/examples/MyController.java new file mode 100644 index 0000000..a9df6b0 --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/MyController.java @@ -0,0 +1,42 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@RestController +public class MyController { + @Autowired + private PersonRepository repository; + + @GetMapping({"/"}) + public String index() { + return "home"; + } + @GetMapping({"/list"}) + public List list() { + return repository.findAll().stream() + .map(PersonDto::of) + .collect(Collectors.toList()); + } + + @GetMapping(value = {"/add/{name}"}) + public PersonDto addPerson(@PathVariable String name) { + + Person person = repository.save(Person.builder().name(name).build()); + return PersonDto.of(person); + } + +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/Person.java b/jpa/src/main/java/kr/pe/elex/examples/Person.java new file mode 100644 index 0000000..24925f9 --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/Person.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021-2024. Elex. All Rights Reesrved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDateTime; + +@Data +@Entity +@AllArgsConstructor@NoArgsConstructor +@Builder +public class Person { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column + private String name; + + @Column + @CreationTimestamp + private LocalDateTime createdAt; +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/PersonDto.java b/jpa/src/main/java/kr/pe/elex/examples/PersonDto.java new file mode 100644 index 0000000..e09a990 --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/PersonDto.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024. Elex. All Rights Reesrved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor@AllArgsConstructor +@Builder +public class PersonDto { + @JsonProperty + private Long id; + @JsonProperty + private String name; + @JsonProperty + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime createdAt; + + public static PersonDto of(Person person){ + return PersonDto.builder() + .id(person.getId()) + .name(person.getName()) + .createdAt(person.getCreatedAt()) + .build(); + } +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/PersonRepository.java b/jpa/src/main/java/kr/pe/elex/examples/PersonRepository.java new file mode 100644 index 0000000..f2a5a1a --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/PersonRepository.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2024. Elex. All Rights Reesrved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.List; + +@Repository +public interface PersonRepository extends JpaRepository { + public List findByCreatedAtLessThan(LocalDateTime date); +} diff --git a/jpa/src/main/java/kr/pe/elex/examples/package-info.java b/jpa/src/main/java/kr/pe/elex/examples/package-info.java new file mode 100644 index 0000000..ce9cc62 --- /dev/null +++ b/jpa/src/main/java/kr/pe/elex/examples/package-info.java @@ -0,0 +1,8 @@ +/* + * Spring-boot Examples + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; diff --git a/jpa/src/main/resources/application.yaml b/jpa/src/main/resources/application.yaml new file mode 100644 index 0000000..03fc46e --- /dev/null +++ b/jpa/src/main/resources/application.yaml @@ -0,0 +1,22 @@ +spring: + application: + name: My spring-boot project + datasource: + url: jdbc:mariadb://localhost:3306/test + driver-class-name: org.mariadb.jdbc.Driver + username: testuser + password: _test_ + jpa: + open-in-view: false + generate-ddl: true + show-sql: true + hibernate: + ddl-auto: update + properties: + hibernate: + dialect: org.hibernate.dialect.MariaDBDialect + thymeleaf: + prefix: classpath:/view/ + suffix: .html +server: + port: 8080 diff --git a/jpa/src/main/resources/banner.txt b/jpa/src/main/resources/banner.txt new file mode 100644 index 0000000..f7a35db --- /dev/null +++ b/jpa/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + ('-. ('-. ) (`-. + _( OO) _( OO) ( OO ). +(,------.,--. (,------.(_/. \_)-. + | .---'| |.-') | .---' \ `.' / + | | | | OO ) | | \ /\ +(| '--. | |`-' |(| '--. \ \ | + | .--'(| '---.' | .--' .' \_) + | `---.| | | `---. / .'. \ + `------'`------' `------''--' '--' +powered by ELEX diff --git a/jpa/src/main/resources/logback-spring.xml b/jpa/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..7267292 --- /dev/null +++ b/jpa/src/main/resources/logback-spring.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + UTF-8 + ${FILE_LOG_PATTERN} + + ${LOG_PATH} + + ${LOG_DIR}/sebastian_%d{yyyy-MM-dd}_%i.log.gz + + 10MB + + 60 + + + + + + + + + + + + + diff --git a/jpa/src/main/resources/templates/home.mustache b/jpa/src/main/resources/templates/home.mustache new file mode 100644 index 0000000..e583759 --- /dev/null +++ b/jpa/src/main/resources/templates/home.mustache @@ -0,0 +1 @@ +

Test

diff --git a/mvc/build.gradle.kts b/mvc/build.gradle.kts index b6071fc..2414bb5 100644 --- a/mvc/build.gradle.kts +++ b/mvc/build.gradle.kts @@ -8,8 +8,8 @@ plugins { id("elex-spring-boot") - id("org.springframework.boot") version "2.5.3" - id("io.spring.dependency-management") version "1.0.11.RELEASE" + id("org.springframework.boot") version "3.2.3" + id("io.spring.dependency-management") version "1.1.4" } dependencies { diff --git a/settings.gradle.kts b/settings.gradle.kts index 2e88da2..0748118 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,5 +10,5 @@ include( "file-upload", "security", "security-with-jpa", "validation", "testing", "mqtt", "websocket", "restful", "swing", "rest-doc", "cache", "security-with-jwt", "exception", "i18n", "i18n-mustache","mvc", - "thymeleaf", "interceptor" + "thymeleaf", "interceptor", "jpa" )