Skip to content
Open

Dev #12

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM openjdk:17-oracle
WORKDIR /app
COPY . /app
COPY target/SpringToDo-0.0.1-SNAPSHOT.jar app.jar
CMD ["java", "-jar", "app.jar"]
3 changes: 3 additions & 0 deletions HowToUse
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
mvn clean install
docker build -t spring-to-do .
docker compose up
32 changes: 32 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
version: '3'
services:
spring-to-do:
image: spring-to-do
depends_on:
- db
- redis
environment:
- "SERVER_URL=jdbc:postgresql://db:5432/spring_todo_db"
- "SERVER_USERNAME=user"
- "SERVER_PASS=pass"
- "REDIS_HOST=redis"
- "REDIS_PORT=6379"
- "FLYWAY_ENABLED=true"
- "REDIS_ENABLED=true"
ports:
- "8088:8088"
db:
image: postgres:latest
container_name: db
restart: always
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=spring_todo_db
ports:
- "5432:5432"
redis:
container_name: redis
image: redis:7.0.12
ports:
- "6379:6379"
157 changes: 155 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<version>3.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.emobile</groupId>
Expand All @@ -15,20 +15,113 @@
<description>SpringToDo</description>

<properties>
<java.version>21</java.version>
<java.version>17</java.version>
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
<org.projectlombok.version>1.18.34</org.projectlombok.version>
<org.opencsv.version>5.7.1</org.opencsv.version>
<org.checkstyle.version>3.6.0</org.checkstyle.version>
<org.springdoc-openapi.version>2.7.0</org.springdoc-openapi.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-database-postgresql</artifactId>
<version>11.3.3</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${org.springdoc-openapi.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.redis.testcontainers</groupId>
<artifactId>testcontainers-redis-junit</artifactId>
<version>1.6.4</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand All @@ -37,7 +130,67 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
</plugin>
</plugins>
</build>

<profiles>
<profile>
<id>coverage</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

@SpringBootApplication
public class SpringToDoApplication {

public static void main(String[] args) {
SpringApplication.run(SpringToDoApplication.class, args);
}
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/emobile/springtodo/aop/LazyLogger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.emobile.springtodo.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LazyLogger {
}
94 changes: 94 additions & 0 deletions src/main/java/com/emobile/springtodo/aop/LazyLoggerAdvice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.emobile.springtodo.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.CodeSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
* {@link LazyLogger} Advice.
*/
@Aspect
@Component
@Slf4j
public class LazyLoggerAdvice {
/**
* true - {@link #printErrorMessage(String)} use slf4j.
* false - {@link #printErrorMessage(String)} use s.out.
*/
@Value("${app.logger.slf4j}")
private boolean slf4jLog;

@Before(value = "@annotation(LazyLogger)")
public void beforeLazyLogger(JoinPoint joinPoint) {
String loggerMessage = getLoggerMessage(joinPoint, "Before ");
printInfoMessage(loggerMessage);
}

@AfterThrowing(value = "@annotation(LazyLogger)")
public void afterLazyLogger(JoinPoint joinPoint) {
String loggerMessage = getLoggerMessage(joinPoint, "AfterThrowing ");
printErrorMessage(loggerMessage);
}

@AfterReturning(value = "@annotation(LazyLogger)", returning = "result")
public void afterReturnLazyLogger(JoinPoint joinPoint, Object result) {
String loggerMessage = getLoggerMessage(joinPoint, "AfterReturning ", result);
printInfoMessage(loggerMessage);
}

private String getLoggerMessage(JoinPoint joinPoint, String type) {
CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
StringBuilder sb = new StringBuilder();

sb.append(type)
.append(joinPoint.getTarget().getClass().getSimpleName())
.append(".")
.append(codeSignature.getName())
.append("(");

for (int i = 0; i < joinPoint.getArgs().length; i++) {
if (i != 0) {
sb.append(",");
}
sb.append(codeSignature.getParameterNames()[i])
.append(" = ")
.append(joinPoint.getArgs()[i]);
}
sb.append(")");
return sb.toString();
}

private String getLoggerMessage(JoinPoint joinPoint, String type, Object result) {
StringBuilder sb = new StringBuilder(getLoggerMessage(joinPoint, type));

if (result != null) {
sb.append(" with value : ")
.append(result);
} else {
sb.append(" with null as return value");
}
return sb.toString();
}

private void printInfoMessage(String loggerMessage) {
if (slf4jLog) {
log.info(loggerMessage);
} else {
System.out.println(loggerMessage);
}
}

private void printErrorMessage(String loggerMessage) {
if (slf4jLog) {
log.error(loggerMessage);
} else {
System.err.println(loggerMessage);
}
}
}
Loading