# pratikchandorkar/library-management architecture

> Architecture diagram of the GitHub repository pratikchandorkar/library-management, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-06-23). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/pratikchandorkar/library-management
- Repository: https://github.com/pratikchandorkar/library-management

## Overview

This repository is a classic layered Spring Boot monolith for a library management system. The main architectural boundary is:
HTTP controllers → business services → Spring Data JPA repositories → MySQL database, with Thymeleaf rendering server-side pages back to the browser.

1. **Core runtime and framework**
The app runs as a Java 17+ Spring Boot application (`LibraryManagementApplication`). It uses Spring MVC for routing, Spring Data JPA/Hibernate for persistence, Spring Security for login/session protection, and Thymeleaf for server-rendered UI pages.

2. **Domain model**
The main persisted concepts are:
- `Book` — catalog item and issue status
- `Student` — library user/member record
- `IssueRecord` — links a book to a student, tracks issue/return dates and status
- `User` — authentication account for application access

These entities define the app’s functional data model and likely map directly to MySQL tables as described in the README.

3. **Controller layer**
There are two controller entry points:
- `AuthController` handles login/registration/auth-related pages and submissions
- `MainController` handles the library workflow pages such as dashboard, books, students, issue, and return screens

Controllers are thin request/response adapters; they prepare model data for Thymeleaf templates and delegate all state changes to services.

4. **Service layer**
Business logic is concentrated in:
- `BookService` for book creation, listing, search, deletion, and status updates
- `IssueService` for issuing and returning books, and likely calculating overdue fines
- `UserService` for registration and authentication-related user operations

This layer is where domain rules live, such as preventing re-issuing an already issued book or marking a return and updating the corresponding records.

5. **Repository layer**
Persistence is isolated in:
- `BookRepository`
- `StudentRepository`
- `IssueRecordRepository`
- `UserRepository`

These are the database access boundary. The application likely relies on Spring Data query methods rather than hand-written SQL, which keeps data access simple and tightly aligned to the entity model.

6. **Security architecture**
`SecurityConfig` indicates a session-based Spring Security setup. The README states authentication and authorization are enabled, with BCrypt password encryption. That means:
- unauthenticated users are redirected to login
- protected pages require a valid session
- credentials are stored hashed, not plaintext
- the `User` entity and `UserService` are part of the auth flow

The default admin account mentioned in the README is probably created at startup or via seed data.

7. **Startup data seeding**
`DataInitializer` suggests the application preloads data on startup. In architecture terms, this is an initialization path separate from normal user-driven flows. It likely creates the default admin account and may optionally add sample records so the UI is usable immediately after first launch.

8. **Presentation layer**
The UI is server-rendered with Thymeleaf templates under `src/main/resources/templates`:
- `index.html` dashboard
- `books.html`, `add-book.html`
- `students.html`, `add-student.html`
- `issue-book.html`, `return-book.html`
- `login.html`, `register.html`

Static CSS and JS live under `src/main/resources/static`. This is a form-driven CRUD interface, not a SPA.

9. **Key business flows**
The important end-to-end flows are:
- **Book management**: browser form → controller → `BookService` → `BookRepository` → MySQL → updated list view
- **Student management**: browser form → controller → `StudentRepository`
- **Issue book**: select book and student → `IssueService` creates `IssueRecord`, marks book as issued
- **Return book**: select issued record/book → `IssueService` closes the record, updates book availability, and computes any fine

10. **Data consistency boundaries**
The `IssueRecord` table is the transactional record of lending activity. It acts as the bridge between books and students and is the source of truth for whether a book is currently checked out. This is the most important domain boundary in the system because it coordinates state across multiple tables.

11. **Database and deployment assumptions**
The README configures MySQL as the backing store and uses `spring.jpa.hibernate.ddl-auto=update`, so schema evolution is handled automatically at startup. The app runs on port 8080 by default and is built with Maven. This is a single-process, database-backed deployment model.

12. **What to show in an architecture diagram**
A clear diagram should show:
- Browser users accessing Thymeleaf pages through Spring MVC
- Security intercepting requests before protected controllers
- Controllers calling service classes
- Services reading/writing via repositories
- Repositories persisting `Book`, `Student`, `IssueRecord`, and `User` to MySQL
- Startup initializer seeding initial data
- Static CSS/JS supporting the rendered pages

13. **Scale and separation**
This is not a microservices system; it is a single deployable application with clean internal layering. The architecture is intentionally simple: presentation, business logic, persistence, and security are separated, but all live in one Spring Boot codebase.

Main entry points: [`src/main/java/com/library/library_management/controller/MainController.java`](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/controller/MainController.java) (Library API), [`src/main/java/com/library/library_management/service/IssueService.java`](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/IssueService.java) (Issue Service), [`src/main/java/com/library/library_management/repository/BookRepository.java`](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/BookRepository.java) (Book Repo), [`src/main/java/com/library/library_management/config/SecurityConfig.java`](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/config/SecurityConfig.java) (Security)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_presentation["Presentation"]
  node_templates["Thymeleaf Views<br/>server pages"]
  node_assets["Static Assets<br/>css/js"]
end

subgraph group_application["Application"]
  node_app(("Library App<br/>Spring Boot app"))
  node_security["Security"]
  node_initializer["Initializer<br/>Startup seeder"]
  node_authctl["Auth API<br/>MVC controller"]
  node_mainctl["Library API<br/>MVC controller"]
  node_booksvc["Book Service<br/>business service<br/>[BookService.java]"]
  node_issuesvc["Issue Service<br/>business service<br/>[IssueService.java]"]
  node_usersvc["User Service<br/>business service<br/>[UserService.java]"]
end

subgraph group_persistence["Persistence"]
  node_bookrepo[("Book Repo<br/>JPA repository")]
  node_studentrepo[("Student Repo<br/>JPA repository")]
  node_issuerepo[("Issue Repo<br/>JPA repository")]
  node_userrepo[("User Repo<br/>JPA repository")]
  node_book{{"Book<br/>JPA entity<br/>[Book.java]"}}
  node_student{{"Student<br/>JPA entity<br/>[Student.java]"}}
  node_issue{{"IssueRecord<br/>JPA entity<br/>[IssueRecord.java]"}}
  node_user{{"User<br/>JPA entity<br/>[User.java]"}}
end

node_app -->|"loads"| node_security
node_app -->|"runs"| node_initializer
node_security -.->|"permits auth"| node_authctl
node_security -.->|"protects"| node_mainctl
node_authctl -->|"uses"| node_usersvc
node_mainctl -->|"uses"| node_booksvc
node_mainctl -->|"uses"| node_issuesvc
node_mainctl -->|"reads"| node_studentrepo
node_usersvc -->|"persists"| node_userrepo
node_booksvc -->|"persists"| node_bookrepo
node_issuesvc -->|"persists"| node_issuerepo
node_issuesvc -->|"updates"| node_bookrepo
node_issuesvc -->|"checks"| node_studentrepo
node_userrepo -->|"maps"| node_user
node_bookrepo -->|"maps"| node_book
node_studentrepo -->|"maps"| node_student
node_issuerepo -->|"maps"| node_issue
node_authctl -->|"renders"| node_templates
node_mainctl -->|"renders"| node_templates
node_mainctl -->|"serves"| node_assets
node_initializer -->|"seeds"| node_userrepo
node_initializer -->|"seeds"| node_bookrepo

click node_app "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/LibraryManagementApplication.java"
click node_security "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/config/SecurityConfig.java"
click node_initializer "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/config/DataInitializer.java"
click node_authctl "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/controller/AuthController.java"
click node_mainctl "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/controller/MainController.java"
click node_booksvc "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/BookService.java"
click node_issuesvc "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/IssueService.java"
click node_usersvc "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/UserService.java"
click node_templates "https://github.com/pratikchandorkar/library-management/tree/main/src/main/resources/templates"
click node_assets "https://github.com/pratikchandorkar/library-management/tree/main/src/main/resources/static"
click node_bookrepo "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/BookRepository.java"
click node_studentrepo "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/StudentRepository.java"
click node_issuerepo "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/IssueRecordRepository.java"
click node_userrepo "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/UserRepository.java"
click node_book "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/Book.java"
click node_student "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/Student.java"
click node_issue "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/IssueRecord.java"
click node_user "https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/User.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_templates,node_assets toneBlue
class node_app,node_security,node_initializer,node_authctl,node_mainctl,node_booksvc,node_issuesvc,node_usersvc toneAmber
class node_bookrepo,node_studentrepo,node_issuerepo,node_userrepo,node_book,node_student,node_issue,node_user toneMint
```

## Components

### Presentation

Thymeleaf pages and browser-facing assets

- [Thymeleaf Views](https://github.com/pratikchandorkar/library-management/tree/main/src/main/resources/templates): server pages · Rendered HTML templates for UI screens · `src/main/resources/templates`
- [Static Assets](https://github.com/pratikchandorkar/library-management/tree/main/src/main/resources/static): css/js · Browser styling and client-side scripts · `src/main/resources/static`

### Application

Spring Boot runtime, web layer, services, and security

- [Library App](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/LibraryManagementApplication.java): Spring Boot app · Application entrypoint and bootstrap · `src/main/java/com/library/library_management/LibraryManagementApplication.java`
- [Security](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/config/SecurityConfig.java): Spring Security config · Session protection, login flow, password hashing · `src/main/java/com/library/library_management/config/SecurityConfig.java`
- [Initializer](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/config/DataInitializer.java): Startup seeder · Boot-time data and default account setup · `src/main/java/com/library/library_management/config/DataInitializer.java`
- [Auth API](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/controller/AuthController.java): MVC controller · Login and registration request handling · `src/main/java/com/library/library_management/controller/AuthController.java`
- [Library API](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/controller/MainController.java): MVC controller · Dashboard and library workflow pages · `src/main/java/com/library/library_management/controller/MainController.java`
- [Book Service](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/BookService.java): business service · Catalog CRUD, search, and book state updates · `src/main/java/com/library/library_management/service/BookService.java`
- [Issue Service](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/IssueService.java): business service · Issue and return workflows with lending rules · `src/main/java/com/library/library_management/service/IssueService.java`
- [User Service](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/service/UserService.java): business service · Registration and account operations · `src/main/java/com/library/library_management/service/UserService.java`

### Persistence

JPA entities and repository boundary

- [Book Repo](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/BookRepository.java): JPA repository · Persistence access for books · `src/main/java/com/library/library_management/repository/BookRepository.java`
- [Student Repo](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/StudentRepository.java): JPA repository · Persistence access for students · `src/main/java/com/library/library_management/repository/StudentRepository.java`
- [Issue Repo](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/IssueRecordRepository.java): JPA repository · Persistence access for lending records · `src/main/java/com/library/library_management/repository/IssueRecordRepository.java`
- [User Repo](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/repository/UserRepository.java): JPA repository · Persistence access for users · `src/main/java/com/library/library_management/repository/UserRepository.java`
- [Book](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/Book.java): JPA entity · Catalog item and availability state · `src/main/java/com/library/library_management/entity/Book.java`
- [Student](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/Student.java): JPA entity · Library member record · `src/main/java/com/library/library_management/entity/Student.java`
- [IssueRecord](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/IssueRecord.java): JPA entity · Loan and return ledger · `src/main/java/com/library/library_management/entity/IssueRecord.java`
- [User](https://github.com/pratikchandorkar/library-management/blob/main/src/main/java/com/library/library_management/entity/User.java): JPA entity · Authentication account · `src/main/java/com/library/library_management/entity/User.java`

## Connections

- Library App → Security: loads · Bootstraps security configuration
- Library App → Initializer: runs · Executes startup seeding
- Security → Auth API: permits auth · Allows unauthenticated access to login and registration
- Security → Library API: protects · Secures library pages behind session login
- Auth API → User Service: uses · Delegates registration and account lookup
- Library API → Book Service: uses · Delegates catalog operations
- Library API → Issue Service: uses · Delegates issue and return workflows
- Library API → Student Repo: reads · Fetches student lists for views
- User Service → User Repo: persists · Stores and loads user accounts
- Book Service → Book Repo: persists · Stores and loads books
- Issue Service → Issue Repo: persists · Stores and loads lending records
- Issue Service → Book Repo: updates · Marks books issued or returned
- Issue Service → Student Repo: checks · Resolves the selected student for lending
- User Repo → User: maps · JPA mapping for user accounts
- Book Repo → Book: maps · JPA mapping for books
- Student Repo → Student: maps · JPA mapping for students
- Issue Repo → IssueRecord: maps · JPA mapping for issue records
- Auth API → Thymeleaf Views: renders · Returns login and registration pages
- Library API → Thymeleaf Views: renders · Returns dashboard and workflow pages
- Library API → Static Assets: serves · Uses CSS and JS for the UI
- Initializer → User Repo: seeds · Creates default admin or sample users
- Initializer → Book Repo: seeds · Optionally preloads books
