Project Structure & Conventions
Standard Maven/Gradle layout follow hota hai — src/main/java (application code), src/main/resources (application.properties, static files, templates), src/test/java (test code). Main application class (jisme @SpringBootApplication hai) ROOT PACKAGE mein rehti hai, taaki COMPONENT SCANNING SAHI se saare sub-packages COVER kare.
CONVENTIONAL organization — controller/, service/, repository/, model/ (ya entity/), config/ — packages HAR "LAYER" ke hisaab se organize hote hain (layered architecture). BADE projects mein, FEATURE-based organization bhi common hai (order/, user/, payment/ — HAR feature APNI complete slice, controller+service+repository ke saath).
bookstore/
├── src/main/java/com/example/bookstore/
│ ├── BookstoreApplication.java ← @SpringBootApplication, ROOT
│ ├── controller/
│ │ └── BookController.java
│ ├── service/
│ │ └── BookService.java
│ ├── repository/
│ │ └── BookRepository.java
│ ├── model/
│ │ └── Book.java
│ └── config/
│ └── SecurityConfig.java
├── src/main/resources/
│ ├── application.properties
│ ├── static/ ← CSS, JS, images
│ └── templates/ ← Thymeleaf (agar server-rendered views)
├── src/test/java/com/example/bookstore/
└── pom.xml- Layered organization: controller/, service/, repository/, model/
- Main class ROOT package mein — component scanning ke liye zaroori
- static/ aur templates/ resources folders mein — automatically served
LAYERED organization (controller/, service/, repository/) CHHOTE projects ke liye SIMPLE hai — SAB "similar TYPE" ki cheezein EK JAGAH. FEATURE-based (order/, user/, payment/ — HAR ek APNI controller+service+repository ke saath) BADE projects mein BEHTAR SCALE karta hai — EK FEATURE ka SAARA code EK JAGAH milता hai.
- Layered = chhote projects ke liye simple, "similar type" grouped
- Feature-based = bade projects mein behtar scale karta hai
- Bade teams/microservices mein, feature-based zyaada COMMON hai
Main class (@SpringBootApplication wali) ka PACKAGE location, COMPONENT SCANNING ka STARTING POINT DEFINE karta hai. Agar main class com.example.app package mein hai, LEKIN EK controller com.example.other package mein hai (SIBLING, NOT sub-package), WO controller SCAN NAHI hoga — "bean not found" errors ka COMMON REASON.