Spring Boot Backend Development Course, Writing GitHub Action Scripts, CD

Writing GitHub Action Scripts: Continuous Deployment (CD)

In modern software development, Continuous Deployment (CD) and Continuous Integration (CI) are essential elements. Automating these processes can significantly enhance developer productivity, especially when developing backend applications using Spring Boot. In this tutorial, we will explore how to automatically deploy a Spring Boot application using GitHub Actions.

1. What is Spring Boot?

Spring Boot is an open-source framework that extends the Spring Framework, making it easier to develop standalone Spring applications. It provides several useful features that simplify and expedite the use of the existing Spring Framework. Notably, it reduces the burden of initial setup and supports rapid application execution through built-in servers (e.g., Tomcat, Jetty).

2. What is GitHub Actions?

GitHub Actions is a CI/CD tool provided by GitHub that detects changes in the code and allows tasks to be executed automatically. Users can define and manage workflows in YAML file format, which can be triggered by various events (push, issue creation, etc.). This allows for the automation of tasks such as testing, building, and deployment.

3. Prerequisites

  • You should have already developed or created a Spring Boot application.
  • You need to create a GitHub repository for the project.
  • A GitHub account is required to use GitHub Actions.

4. Creating a Spring Boot Application

To create a Spring Boot application, you can use Spring Initializr. Set the appropriate meta information and add necessary dependencies to download the project. For example, you can select web (application), JPA, and H2 database.

 
// Example Maven dependency (pom.xml)
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

5. Creating a GitHub Repository

Access GitHub and create a new repository. Set the repository name according to the project, and you may select the ‘Initialize this repository with a README’ option. Then, push your local project to the GitHub repository.


# Run in the local project directory
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/username/repository.git
git push -u origin main

6. Writing a GitHub Actions Workflow

Now you need to create a GitHub Actions workflow file. Create a YAML file under the `.github/workflows` directory. For example, create a file named `ci.yml` and write the following:


name: CI

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Build with Maven
        run: mvn clean package

7. Writing the Deployment Workflow

After setting up the basic CI workflow, it is time to write the workflow for CD. Here, we will describe the process of deploying to AWS EC2 as an example. Create a new YAML file named `deploy.yml` and write the following:


name: Deploy to EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Build with Maven
        run: mvn clean package

      - name: Deploy to EC2
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          port: 22
          source: target/*.jar
          target: /path/to/deploy/

The `appleboy/scp-action` used here helps send files to the EC2 instance using SSH. Each item can be stored in GitHub Secrets to enhance security.

8. Setting Up GitHub Secrets

You now need to set up secret variables used in the CI/CD workflow. Go to the ‘Settings’ -> ‘Secrets and variables’ -> ‘Actions’ of the GitHub repository page and add the secret variables to be hidden. For example:

  • EC2_HOST: IP address of the EC2 instance
  • EC2_USER: SSH username
  • EC2_SSH_KEY: SSH private key

9. Checking GitHub Actions Execution

Once all configurations are complete, commit and push to the main branch of the repository. This will automatically trigger GitHub Actions, executing the configured CI/CD process. You can check the execution logs in the ‘Actions’ tab to verify the success of each step.

10. Conclusion

In this tutorial, we learned how to automatically deploy a Spring Boot backend application using GitHub Actions. GitHub Actions allows you to set up CI/CD processes with just a simple YAML file, making it a powerful tool for automating various tasks. This can enhance developer productivity and improve the reliability of deployments. Additionally, you might consider extensions such as integrating with other cloud providers or deploying with Docker.

References

Spring Boot Backend Development Course, Create a GitHub Repository and Push Code

Spring Boot is a framework that helps to easily develop web applications based on Java. In this tutorial, we will explain in detail how to build a simple backend application using Spring Boot and save it on GitHub. After developing the application, we will guide you through the process of creating a GitHub repository and pushing the code.

Table of Contents

  • 1. Introduction to Spring Boot
  • 2. Setting Up Development Environment
  • 3. Creating a Simple Spring Boot Application
  • 4. Creating a GitHub Repository
  • 5. Pushing Code
  • 6. Conclusion and Additional Resources

1. Introduction to Spring Boot

Spring Boot is a tool provided to build applications quickly and reliably based on the Spring Framework. Spring Boot simplifies configuration and helps developers run applications with minimal effort through auto-configuration.

The main features of Spring Boot are as follows:

  • Auto-configuration: Spring Boot automatically handles the basic configuration needed for the project.
  • Starter dependencies: Starter dependencies are provided to easily add various features.
  • Embedded web server: Servers like Tomcat and Jetty are embedded, allowing applications to run without separate installation.
  • Monitoring and management in production: Spring Boot offers various features to monitor and manage applications in production.

2. Setting Up Development Environment

Required Tools Installation

To configure a stable development environment, the following tools are required:

  • Java Development Kit (JDK): JDK is necessary to run Spring Boot. You need to install JDK version 8 or higher.
  • IntelliJ IDEA or Eclipse: These are IDEs for developing Spring Boot applications. IntelliJ IDEA is available in both free and paid versions, while Eclipse is a free IDE that can be used on all platforms.
  • Git: A tool for version control. You can use Git to track code changes and push changes to a remote repository.
  • GitHub account: A GitHub account is needed to create a GitHub repository for code storage. You can sign up here.

Installation Procedure for Development Environment

The methods for installing each tool are as follows:

1. Install JDK

The JDK can be downloaded from the Oracle website. Choose the version suitable for your operating system and install it.

2. Install IDE

IntelliJ IDEA can be downloaded from JetBrains’ official website, and Eclipse can be downloaded from the Eclipse website. After installing the IDE, set the JDK path in the IDE.

3. Install Git

Git can be downloaded and installed from the official website. After installation, run the command git --version in the Command Line or Terminal to verify that the installation is complete.

3. Creating a Simple Spring Boot Application

Now, let’s actually create a Spring Boot application. You can create the application through the following steps.

Step 1: Initialize Spring

To initialize a Spring Boot project, use Spring Initializr.

  • Project: Choose (‘Maven Project’ or ‘Gradle Project’)
  • Language: Select ‘Java’.
  • Spring Boot: Choose the latest Spring Boot version.
  • Group: Enter, for example, com.example.
  • Artifact: Enter the desired project name. For example, set it as my-spring-boot-app.
  • Dependencies: Select Spring Web. You can add other dependencies as needed.

After finishing the setup, click the Generate button to download the project as a ZIP file.

Step 2: Import Project in IDE

Import the downloaded ZIP file into the IDE. To do this, open the IDE and select File -> Open to open the ZIP file, or you can extract the ZIP file and open the folder.

Step 3: Write Basic Code

Once the project structure is set up, open the src/main/java/com/example/myspringbootapp/MySpringBootApp.java file and update it with the following code:

package com.example.myspringbootapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MySpringBootApp {

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApp.class, args);
    }
}

This is the starting point of a simple Spring Boot application. Now let’s create a simple REST API.

Step 4: Write REST Controller

First, create a new class file GreetingController.java. Write it as follows:

package com.example.myspringbootapp;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {
    
    @GetMapping("/greeting")
    public String greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return String.format("Hello, %s!", name);
    }
}

The above code creates a /greeting API endpoint that receives a name as a query parameter and returns a greeting message.

Step 5: Run the Application

You can run the main class (MySpringBootApp) in the IDE or execute the following command in the terminal to start the application:

./mvnw spring-boot:run

You can call the API by entering http://localhost:8080/greeting in the browser. If you enter http://localhost:8080/greeting?name=Alice, you will receive the message “Hello, Alice!”.

4. Creating a GitHub Repository

Now it’s time to save the Spring Boot application on GitHub. To upload the code we have created, we first need to create a GitHub repository.

Step 1: Log in to GitHub

First, log in to GitHub. If you don’t have an account, you need to sign up.

Step 2: Create a New Repository

After logging in, click the “+” button at the top right and select “New repository”. Enter the repository name and description, choose either Public or Private, and then click the Create repository button.

5. Pushing Code

Now let’s go through the process of pushing the code you have written locally to the GitHub repository.

Step 1: Initialize Git

Navigate to the project folder and initialize Git. Run the following command in the terminal:

git init

Step 2: Add GitHub Remote Repository

Next, add the address of the repository you created on GitHub. You can copy the repository’s URL from the top URL bar on GitHub:

git remote add origin https://github.com/USERNAME/REPOSITORY_NAME.git

Here, USERNAME is your GitHub username, and REPOSITORY_NAME is the repository name you created.

Step 3: Add and Commit Changes

To commit changes, run the following commands:

git add .
git commit -m "Initial commit"

Step 4: Push Code

Finally, push the local changes to GitHub:

git push -u origin master

6. Conclusion and Additional Resources

Congratulations! You have now learned how to create a simple Spring Boot application and how to push the code to a GitHub repository. This process is an important step in laying the foundation for backend development.

You can find additional materials and references through the following links:

I hope this tutorial was helpful. For those wishing to advance further, challenge yourselves to work on various projects utilizing Spring Boot and Git!

Spring Boot Backend Development Course, Understanding the Project with Illustrations

Hello! In this course, we will cover the basics to advanced topics of backend development using Spring Boot. This course is designed to be visually easy to understand with illustrations, making it accessible for beginners. This step-by-step project covers all the elements needed to develop a real web application.

1. What is Spring Boot?

Spring Boot is a modern lightweight framework based on the Spring Framework. It minimizes the time developers spend on setup and configuration tasks, fundamentally simplifying the bootstrap process of Spring applications.

Spring Boot Architecture

Figure 1: Spring Boot Architecture

The main advantages of Spring Boot are as follows:

  • Fast development: Provides an embedded Tomcat server and automatic configuration features.
  • Easy deployment: Can be easily deployed on various platforms.
  • Productive development: Powerful features can be accessed with simple setup.

2. Setting Up the Development Environment

To develop a Spring Boot application, you need to install JDK, Maven, and an IDE. Here’s how to set up each tool.

2.1 Installing JDK

To use Spring Boot, you need to install the Java Development Kit (JDK). Download and install the latest version of the JDK. After installation, set the JAVA_HOME environment variable.

2.2 Installing Maven

Maven is a tool for dependency management. After installing Maven, add the Maven bin path to the PATH environment variable.

2.3 Installing an IDE

You can conveniently manage Spring Boot projects using IDEs like IntelliJ IDEA or Eclipse. IntelliJ IDEA, in particular, is highly recommended due to its excellent support for integration with Spring Boot.

3. Creating Your First Spring Boot Project

Now let’s create a Spring Boot project. You can use Spring Initializr to generate the project. Follow the steps below:

  1. Access the Spring Initializr website.
  2. Enter the project metadata.
  3. Add dependencies. (Spring Web, Spring Data JPA, H2 Database, etc.)
  4. Download the project and open it in your IDE.

3.1 Understanding the Project Structure

The generated project has the following structure:

my-spring-boot-project/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── demo/
│   │   │               ├── DemoApplication.java
│   │   │               └── controller/
│   │   │               └── service/
│   │   │               └── repository/
│   │   └── resources/
│   │       ├── application.properties
│   └── test/
│       └── java/
└── pom.xml

In this structure, DemoApplication.java serves as the entry point of the application.

4. Developing a RESTful API

Now let’s create a basic RESTful API. Spring Boot supports building RESTful services very easily.

4.1 Creating the Model Class

First, let’s create a data model class. For example, we will create a User class to store user information.

package com.example.demo.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // getters and setters
}

4.2 Creating the Repository Interface

To query or modify data, let’s create a repository interface using JPA.

package com.example.demo.repository;

import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository {
}

4.3 Creating the Service Class

Let’s create a service class to handle business logic.

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List getAllUsers() {
        return userRepository.findAll();
    }

    public User createUser(User user) {
        return userRepository.save(user);
    }

    // Other methods
}

4.4 Creating the Controller Class

Now let’s create a controller class to handle HTTP requests.

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping
    public List getAllUsers() {
        return userService.getAllUsers();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.createUser(user);
    }
}

5. Database Configuration

Now let’s set up the H2 database. Modify the application.properties file to add the database configuration.

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update

6. Testing

Now everything is ready. When you run the Spring Boot application, you can create and query user data through the RESTful API using the embedded H2 database. Tools like Postman can be used to perform API testing.

Postman Usage Example

Figure 2: API Testing in Postman

7. Conclusion

In this course, you learned how to create a simple backend application using Spring Boot. Spring Boot helps you progress projects quickly without complex configurations and is very suitable for developing RESTful APIs. I hope this course has laid the foundation for you to delve deeper into backend development with Spring Boot.

8. Additional Resources

If you want to learn more, check out the resources below:

Spring Boot Backend Development Course, Git and GitHub

Hello! In this tutorial, we will explore how to utilize Git and GitHub while starting Spring Boot development. Let’s understand the importance of source code management and version control, and learn how to apply them in actual projects.

1. What is Spring Boot?

Spring Boot is a sub-project of the Spring framework, which is a Java-based web application development framework, and it helps to develop web applications faster and more easily. Its main features include:

  • Auto-configuration: Spring Boot automatically configures necessary settings without the need for the developer to define a configuration file.
  • Integration with the Spring ecosystem: Spring Boot can be easily integrated with various Spring projects (Spring MVC, Spring Data, etc.).
  • Standalone: It can be distributed as a standalone JAR file without requiring a separate web server when deployed on a server.

2. What are Git and GitHub?

2.1 Git

Git is a distributed version control system that records the history of code changes and allows multiple developers to work simultaneously. Git has several advantages, including:

  • Fast performance: All operations are performed locally, leading to smooth software performance.
  • Small size: The size of the repository is kept small, allowing effective management of multiple versions of code.
  • Distributed: Each developer’s local repository is managed independently, so it does not rely on a central server.

2.2 GitHub

GitHub is a platform that helps manage source code using Git, allowing for collaboration and public sharing. Its main features include:

  • Code hosting: You can store and manage project code in the cloud.
  • Issue tracking: It provides useful tools for tracking and managing bugs or improvement requests.
  • Collaboration: It enables multiple developers to work on the same project simultaneously.

3. Setting up the environment

3.1 Installing Java

To use Spring Boot, you need to install the Java Development Kit (JDK). You can install it from Oracle’s official website or OpenJDK.

sudo apt update
sudo apt install openjdk-11-jdk
java -version

3.2 Installing Spring Boot CLI

Using the Spring Boot CLI (Command Line Interface), you can easily create Spring Boot applications. The installation steps are as follows:

brew tap spring-io/tap
brew install springboot

3.3 Installing Git

If Git is not yet installed, you can install it using the following command:

sudo apt install git

3.4 Creating a GitHub account

Sign up for GitHub and create an account. Just go to the official GitHub website to sign up.

4. Creating a simple Spring Boot application

Now, let’s create a Spring Boot application. Use the following command to create a new project:

spring init --dependencies=web my-spring-boot-app

Once the project is created, navigate to the directory.

cd my-spring-boot-app

4.1 Creating a simple REST API

Let’s write a simple example that provides data using a REST API in a Spring Boot application. Create a file named `src/main/java/com/example/myapp/MyController.java` and write the following code:

package com.example.myapp;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

Now, let’s run the application. You can execute the following command to run the application:

./mvnw spring-boot:run

After running, check the result by accessing http://localhost:8080/hello in your web browser, where you should see the message “Hello, Spring Boot!”.

5. Version control using Git and GitHub

5.1 Initializing Git

Now, let’s initialize Git in the project. Move to the project folder and enter the following command:

git init

Executing this command will create a .git directory in the current directory, initializing a Git repository.

5.2 Adding files and committing

Let’s add files and commit. Use the following command to add all files to the staging area:

git add .

Then proceed with a commit.

git commit -m "Initial commit: Created Spring Boot application"

5.3 Creating a repository on GitHub

Go to GitHub and create a new repository. After creating the new repository, add the remote repository.

git remote add origin https://github.com/username/my-spring-boot-app.git

5.4 Pushing to the remote repository

Now, let’s push the project to GitHub. Push using the following command:

git push -u origin master

Now you can check the project code on GitHub.

6. Utilizing GitHub for team collaboration

As the project grows, you will collaborate with multiple team members, and you can utilize various collaboration features of GitHub at this time. There are many features, including merge requests (Pull Requests), code reviews, and issue management.

6.1 Issue management

Create issues to manage bugs or requests. Issues allow team members to share opinions and assign tasks.

6.2 Code review

After pushing the code, you can request a review from team members. Reviews help improve code quality and receive various feedback.

6.3 Merge requests (Pull Request)

After developing a new feature, use a pull request to merge that feature into the main branch. This option allows other team members to review and approve the changes.

7. Conclusion

In this tutorial, we created a simple backend application using Spring Boot and explored source code management and collaboration methods using Git and GitHub. Through this process, we hope you gain a basic understanding of Spring Boot and Git.

To further enhance your skills, search for additional resources and apply them to various projects. In the next tutorial, we will delve deeper into Spring Boot’s JSON processing, configuration management, and more.

References

Spring Boot Backend Development Course, Aspect-Oriented Programming

Efficiency in modern software development is achieved through the introduction of various programming paradigms. In particular, Spring Boot is a very popular framework in the Java ecosystem, primarily used for microservice architecture and RESTful API development. This article discusses the concepts and practicality of Aspect-Oriented Programming (AOP) in the backend development process based on Spring Boot.

1. What is Aspect-Oriented Programming (AOP)?

Aspect-Oriented Programming (AOP) is a programming paradigm that allows for the separation and management of cross-cutting concerns without affecting the core business logic of the program. It is used alongside Object-Oriented Programming (OOP) to clearly separate business logic from cross-cutting concerns, thereby improving code readability and maintainability and helping reduce code duplication.

  • Separation of Concerns: This separates the business logic of the application from common modules (e.g., security, logging, transaction management), making the code base more concise.
  • Reusability: Common functionalities can be written once and reused in multiple places.
  • Improved Maintainability: Since common logic is managed centrally, maintaining the code becomes easier when modifications are needed.

2. AOP Support in Spring

The Spring Framework provides several features to support AOP, allowing developers to easily define and apply various aspects. Spring AOP is proxy-based and primarily operates at method execution points.

2.1 Key Terms of AOP

  • Aspect: An element that modularizes a cross-cutting concern. For example, an aspect responsible for logging.
  • Join Point: A point where an aspect can be applied, usually at a method call.
  • Advice: The action to be taken at a join point. This is the core functionality of AOP.
  • Pointcut: An expression that defines which join points an advice should be applied to.
  • Weaving: The process of combining aspects with business logic. This can occur at runtime, compile time, or load time.

3. Applying AOP in Spring Boot

Setting up AOP in Spring Boot is relatively straightforward. It consists of the following steps.

3.1 Adding Dependencies

To use AOP in a Spring Boot application, you need to add the `spring-boot-starter-aop` dependency. Add the following code to your `pom.xml` file.

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

3.2 Creating an Aspect Class

Create a class that defines the aspect. This class will use the @Aspect annotation to indicate that it is an aspect. The example below implements an aspect that logs messages before method execution.

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod() {
        System.out.println("Before method execution: logging");
    }
}

3.3 Defining Pointcut

In the example above, the logBeforeMethod() method defines a pointcut that logs messages right before executing any method in the service package. You can specify the package and return type in the execution expression.

3.4 Testing

You can now log messages from your service methods. When you call a method in the service class, the log message will be printed by the aspect.

import org.springframework.stereotype.Service;

@Service
public class MyService {
    public void performTask() {
        System.out.println("Performing task...");
    }
}

3.5 Caution

When using AOP, performance degradation should be considered. Especially if the pointcut is broad, performance issues may arise, so it’s advisable to specify the necessary scope only.

4. Use Cases of AOP

AOP can be utilized in various fields. Here are some common use cases.

4.1 Logging

Logs can be recorded at the start and end of a method, allowing for tracking the flow of function calls. This is useful for debugging and performance monitoring.

4.2 Transaction Management

AOP can be used to define the transaction boundaries of business logic and commit only when completed successfully. This helps reduce duplicate transaction-related code within your codebase.

4.3 Security

Access control can be implemented for specific methods or classes. AOP can be employed to allow method execution only under certain conditions.

5. Optimizing AOP in Spring Boot

Since AOP operates based on proxies, poorly configured aspects may affect system performance. Here are some tips for optimizing AOP in Spring Boot.

5.1 Pointcut Optimization

Narrow the scope of pointcuts to minimize the targets of AOP application. For example, limiting to specific packages or classes can prevent performance degradation.

5.2 Performance Monitoring

Monitor the performance when using AOP in your application to prevent excessive time consumption. This will help continuously assess the impact of AOP.

5.3 Method Separation

Separate methods to allow common logic to be reused, preventing tight coupling between aspects and business logic. This benefits code reusability and readability.

Conclusion

Aspect-Oriented Programming is one of the important paradigms in backend development using Spring Boot. By effectively separating and managing cross-cutting concerns, developers can focus more on business logic. This approach leads to cleaner code that is easier to maintain and reduces redundancy.

I hope you will experiment and plan for various application areas of AOP in the future. I look forward to seeing you leverage common modules like AOP to contribute to the development of better software in your future development processes.