AULA 02 MÓDULO 0 arquitetura ⏱ 50 min

Arquitetura em Camadas

Arquitetura em camadas: apresentação, serviço, domínio, infraestrutura. Regra de dependência. Hexagonal com Ports e Adapters.

camadaslayereddomínioinfraestruturaportsadaptersDIP

Arquitetura em camadas

A arquitetura em camadas (layered architecture) divide um sistema em camadas horizontais com responsabilidades bem definidas. Cada camada só se comunica com a camada imediatamente abaixo — separação de preocupações.

Apresentação
UI, rotas HTTP, serialização de respostas. O que o usuário vê.
Aplicação / Serviço
Regras de negócio, casos de uso, orquestração. O que o sistema faz.
Domínio
Entidades, value objects, invariantes. O que o sistema é.
Infraestrutura
Banco de dados, APIs externas, email. Como os dados persistem.

Regra de Dependência

As dependências só apontam para dentro — camadas externas dependem das internas, nunca o contrário. Isso garante que a lógica de negócio não é contaminada por detalhes técnicos.

🔄
inversão de dependência
Camada de domínio define interfaces; infraestrutura implementa. O banco não dita como o domínio funciona — é o contrário.

Arquitetura Hexagonal (Ports & Adapters)

Uma variação popular: o núcleo (domínio) é cercado por ports (interfaces) e adapters (implementações). HTTP, banco, email são adapters que plugam nos ports do domínio.

🔌
ports e adapters
Port: interface que o domínio define (ex: UserRepository). Adapter: implementação concreta (ex: PostgresUserRepository). Você pode trocar o banco sem tocar no domínio.
javascript
// Arquitetura em camadas — Express + Service + Repository

// Camada de infraestrutura — implementação concreta
class PostgresUserRepository {
  async findById(id) {
    return db.query('SELECT * FROM users WHERE id = $1', [id])
  }
}

// Camada de domínio — regras de negócio
class UserService {
  constructor(userRepo) { this.repo = userRepo }
  async getUser(id) {
    const user = await this.repo.findById(id)
    if (!user) throw new Error('User not found')
    return user
  }
}

// Camada de apresentação — HTTP (Express)
app.get('/users/:id', async (req, res) => {
  const user = await userService.getUser(req.params.id)
  res.json(user)
})
quiz · aula 02
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
Na arquitetura em camadas, em que direção as dependências apontam?
QUESTÃO 02
Qual é o papel da camada de domínio?
QUESTÃO 03
No padrão Ports & Adapters, o que é um Port?
0/3