DEV Community

Maitri Tyagi
Maitri Tyagi

Posted on

How I Built a Blog Recommendation Engine Using Spring Boot & MySQL

Introduction

Most blog platforms have thousands of articles, but finding the right article isn't always easy.

A user might be interested in Java and Spring Boot, while another might prefer AI and machine learning. Showing both users the same list of articles isn't necessarily useful.

This made me curious about a simple question:

Can we build a backend that learns from a user's interactions and recommends articles based on their interests?

In this project, I built a simple Blog Recommendation Engine using Java, Spring Boot, Spring Data JPA, and MySQL.

The goal wasn't to build a production-level recommendation system or use a complicated machine learning model. Instead, I wanted to understand how a recommendation idea could actually be turned into a working backend system.


What Are We Building?

The basic idea is simple.

A user interacts with different blog posts by viewing, liking, or bookmarking them.

We store those interactions in our database and use them to estimate the user's interests.

The flow looks like this:

User
  ↓
Reads / Likes / Bookmarks blogs
  ↓
Store interactions in MySQL
  ↓
Calculate user's interests
  ↓
Score available blogs
  ↓
Sort blogs by score
  ↓
Return recommended blogs
Enter fullscreen mode Exit fullscreen mode

For example, imagine a user has interacted with these topics:

Java          → 5 interactions
Spring Boot   → 4 interactions
Backend       → 3 interactions
Python        → 1 interaction
Enter fullscreen mode Exit fullscreen mode

If a new article is about Java, Spring Boot, and Backend, it should receive a higher recommendation score than an unrelated article.


Tech Stack

For this project, I used:

  • Java — backend programming
  • Spring Boot — building the REST API
  • Spring Data JPA — database interaction
  • MySQL — storing users, blogs, and interactions
  • Maven — dependency management
  • Postman — testing APIs

I chose Spring Boot because I wanted to understand how a real Java backend is structured instead of keeping everything inside a single Java program.


System Architecture

I followed a simple layered architecture.

                Client
                  ↓
             Controller
                  ↓
               Service
                  ↓
             Repository
                  ↓
                MySQL
Enter fullscreen mode Exit fullscreen mode

Each layer has a different responsibility.

Controller

The controller handles HTTP requests.

For example:

GET /api/recommendations/1
Enter fullscreen mode Exit fullscreen mode

means that we want recommendations for user 1.

Service

The service contains the actual recommendation logic.

This is where we calculate scores and decide which blogs should be recommended.

Repository

The repository communicates with the database using Spring Data JPA.

This separation makes the application easier to understand and maintain.


Designing the Database

The first step was deciding what information we actually needed to store.

At a basic level, we need:

users
blogs
user_interactions
Enter fullscreen mode Exit fullscreen mode

Users

id
name
email
Enter fullscreen mode Exit fullscreen mode

Blogs

id
title
content
category
Enter fullscreen mode Exit fullscreen mode

User Interactions

id
user_id
blog_id
interaction_type
created_at
Enter fullscreen mode Exit fullscreen mode

The interaction_type field can contain values such as:

VIEW
LIKE
BOOKMARK
Enter fullscreen mode Exit fullscreen mode

The important relationship is:

User
  |
  | 1
  |
  | *
UserInteraction
  |
  | *
  |
Blog
Enter fullscreen mode Exit fullscreen mode

A user can have many interactions, and a blog can have interactions from many users.


How Does the Recommendation Algorithm Work?

This is the most interesting part of the project.

I didn't start with machine learning.

Instead, I used a simple weighted scoring approach.

Different interactions represent different levels of interest.

For example:

VIEW       → 1 point
BOOKMARK   → 3 points
LIKE       → 5 points
Enter fullscreen mode Exit fullscreen mode

So if a user views a Java article, they receive 1 Java-related interest point.

If they like another Java article, they receive 5 points.

Over time, these scores can give us an approximation of what the user is interested in.


Example

Suppose a user has interacted with the following articles:

Article 1
Category: Java
Action: LIKE

Article 2
Category: Java
Action: VIEW

Article 3
Category: Spring Boot
Action: BOOKMARK
Enter fullscreen mode Exit fullscreen mode

Using our weights:

LIKE       = 5
VIEW       = 1
BOOKMARK   = 3
Enter fullscreen mode Exit fullscreen mode

The user's interest becomes:

Java          → 6 points
Spring Boot   → 3 points
Enter fullscreen mode Exit fullscreen mode

Now suppose we have three new articles:

Article A → Java
Article B → Spring Boot
Article C → Python
Enter fullscreen mode Exit fullscreen mode

Their scores become:

Article A → 6
Article B → 3
Article C → 0
Enter fullscreen mode Exit fullscreen mode

Therefore, the recommendation engine would rank:

1. Article A
2. Article B
3. Article C
Enter fullscreen mode Exit fullscreen mode

This is a simple approach, but it demonstrates the basic idea behind personalized ranking.


Implementing the Backend

I used Spring Boot to expose the recommendation functionality through a REST API.

The controller can look like this:

@RestController
@RequestMapping("/api")
public class RecommendationController {

    private final RecommendationService recommendationService;

    public RecommendationController(
            RecommendationService recommendationService) {
        this.recommendationService = recommendationService;
    }

    @GetMapping("/recommendations/{userId}")
    public List<Blog> getRecommendations(
            @PathVariable Long userId) {

        return recommendationService
                .getRecommendations(userId);
    }
}
Enter fullscreen mode Exit fullscreen mode

The controller doesn't contain the recommendation algorithm itself.

Instead, it passes the request to the service layer.

This keeps the controller focused on handling HTTP requests.


Recommendation Service

The main logic belongs in the service layer.

A simplified version looks like this:

@Service
public class RecommendationService {

    public List<Blog> getRecommendations(Long userId) {

        // 1. Get user's interactions
        // 2. Calculate interest scores
        // 3. Score available blogs
        // 4. Sort blogs by score
        // 5. Return the highest-ranked blogs

        return recommendedBlogs;
    }
}
Enter fullscreen mode Exit fullscreen mode

The actual implementation can be expanded step by step.

The important design decision here is that the controller should not be responsible for business logic.


Why Use Spring Data JPA?

Instead of writing SQL queries for every operation, Spring Data JPA allows us to work with Java entities and repositories.

For example:

public interface BlogRepository
        extends JpaRepository<Blog, Long> {
}
Enter fullscreen mode Exit fullscreen mode

Now we can use methods provided by JpaRepository for common database operations.

This is one of the things I found useful while working with Spring Boot because it reduces a lot of repetitive database code.


Testing the API

Once the backend is running, we can test the recommendation endpoint using Postman.

For example:

GET /api/recommendations/1
Enter fullscreen mode Exit fullscreen mode

The server could return:

[
    {
        "id": 12,
        "title": "Building REST APIs with Spring Boot",
        "category": "Java"
    },
    {
        "id": 18,
        "title": "Understanding Spring Data JPA",
        "category": "Spring Boot"
    }
]
Enter fullscreen mode Exit fullscreen mode

The important thing is that these aren't simply random articles.

They are ranked according to the user's previous interactions.


What About a New User?

This introduces an interesting problem.

Imagine a user creates an account today.

They haven't read or liked anything yet.

How can we recommend something to them?

This is known as the cold-start problem.

For a new user, there isn't enough information to personalize recommendations.

A simple solution is to temporarily recommend:

  • Popular articles
  • Recently published articles
  • Trending categories

Once the user starts interacting with content, we can gradually switch to personalized recommendations.


Time Complexity

Algorithmic complexity is also important.

Suppose we have N available blog posts.

If we calculate a score for every blog, the scoring process depends on how many tags/interests we compare for each blog.

If we then sort all the blogs by their score, the sorting operation is:

O(N log N)
Enter fullscreen mode Exit fullscreen mode

If we only need the top few recommendations, we could improve this further using a priority queue instead of sorting the entire list.

This is an interesting example of how a seemingly simple backend feature can also involve data structures and algorithmic decisions.


Problems I Would Need to Solve

A recommendation system sounds simple at first, but several problems appear as soon as we think about real users.

1. Cold Start

New users have no interaction history.

2. Repeated Recommendations

The system shouldn't keep recommending the same article forever.

3. Popularity Bias

If popular articles always receive higher scores, newer but potentially better articles might never get discovered.

4. Large Amounts of Data

With millions of interactions, calculating recommendations every time a user sends a request could become expensive.

This means we would eventually need caching, optimized queries, precomputed recommendations, or more advanced ranking systems.


How Could This Be Improved?

The scoring system I described is intentionally simple.

A real recommendation engine could become much more sophisticated.

For example, the next version could use:

Content-Based Filtering

Recommend articles based on similarity between their content and the user's interests.

Techniques such as TF-IDF and cosine similarity could be used here.

Collaborative Filtering

Instead of only asking:

"What does this user like?"

we could also ask:

"What do users similar to this user like?"

Machine Learning

A machine learning model could eventually learn how different features influence the probability that a user will interact with an article.

Embeddings

A more advanced system could represent users and articles as vectors and calculate semantic similarity.

This could eventually lead to a much more powerful recommendation engine.


What I Learned From This Project

The biggest lesson from this project was that building a backend feature isn't just about writing code.

There are several different pieces that have to work together:

Database Design
      +
Backend Architecture
      +
Business Logic
      +
Algorithms
      +
API Design
      +
Performance
Enter fullscreen mode Exit fullscreen mode

Working on this project also helped me understand why separating controllers, services, and repositories is useful.

More importantly, it showed me that even a simple recommendation problem can introduce interesting challenges around algorithms, databases, scalability, and user behavior.


Conclusion

I started this project with a simple question:

Can I build a backend that recommends blogs based on what a user actually reads and likes?

The answer is yes — even without starting with a complicated machine learning model.

A simple weighted scoring system can already demonstrate the core idea of personalization.

What makes the project interesting is that it can grow.

The same system could eventually evolve from a simple rule-based recommendation engine into a system using content-based filtering, collaborative filtering, and eventually machine learning.

For me, this project was a good way to connect the concepts I'm learning in Java, Spring Boot, MySQL, and DSA into one practical backend problem.

And that's probably the biggest takeaway:

You don't always need a complicated algorithm to build an interesting project. Sometimes a simple idea, implemented properly, is enough to start learning how real systems are designed.


What's Next?

In the next version of this project, I want to explore how the recommendation algorithm can be improved using content similarity and machine learning, while also making the backend more scalable.

If you're also learning Spring Boot, Java, or backend development, I'd love to hear what kind of recommendation system you would build.

Top comments (0)