Project Structure

Standard Maven/Gradle Layout

shop-app/
├── pom.xml
└── src/
    ├── main/java/com/careeroza/shop/
    │   ├── ShopApplication.java
    │   ├── model/       Product.java, Order.java
    │   ├── service/     OrderService.java
    │   ├── repository/  OrderRepository.java
    │   └── util/        PriceUtils.java
    └── test/java/com/careeroza/shop/
        └── service/     OrderServiceTest.java

Two common ways to organise packages:

StylePackagesGood for
By layercontroller, service, repository, modelsmall apps, tutorials
By featureorder, product, payment, userlarger apps; related code stays together

Package-private for Hiding

package com.careeroza.shop.payment;

public class PaymentService {            // public API of the package
    private final SignatureHelper helper = new SignatureHelper();

    public boolean verify(String payload, String signature) {
        return helper.sign(payload).equals(signature);
    }
}

class SignatureHelper {                   // package-private: invisible outside com.careeroza.shop.payment
    String sign(String payload) {
        return Integer.toHexString(payload.hashCode());
    }
}

Tip: Classes without public are an easy way to keep implementation details inside a package.