Here's a quickie video describing the application layers of a RestExpress application when one of the Maven Archetypes is used to create a new RestExpress project.
To summarize: Visibility or "awareness" goes down. Meaning that a layer can call (or know about) the layer immediately below it, but an application layer cannot call the layer above it or a layer deeper than the next immediately lower. In other words, if there's database orchestration code in the Service Layer or Controller, that's poor design. And conversely, if there's HTTP header, request or response manipulation in the ServiceLayer or Persistence Layer, that'd be bad.
Layer #1: Controller/HTTP Layer
- HTTP layer where requests, headers and responses are manipulated and processed.
- Handles serialization of request body to domain model.
- And deserialization from domain model to response.
- Makes call to only the Service Layer (layer #2).
Layer #2: Service Layer
- Business logic.
- Calls methods on domain model to orchestrate business logic and domain functionality.
- Calls Persistence Layer to store and read domain model instances.
- Returns domain model instances to the Controller/ HTTP Layer.
Layer #3: Persistence Layer
- Sometimes call DAL (data access layer) or DAO (data accessor object).
- Called Repository by Eric Evans in his Domain Driven Design (DDD) book.
- Creates an interface to perform queries and database operations.
- "Serializes" and "deserializes" domain model instances to/from the database.