🚀 Oferta especial: 60% OFF no CrazyStack - Últimas vagas!Garantir vaga →
Back-end

Desafio de Vaga Java Spring Boot: Mini CRM de Clientes e Contatos

Veja passo a passo como solucionar um desafio técnico real usando Java Spring Boot e construa seu mini CRM para se destacar em processos seletivos para desenvolvedor júnior.

CrazyStack
17 min de leitura
JavaSpring BootDesafio de VagaAPI RESTBack-end Junior

Por que isso é importante

Desenvolver um mini CRM usando Java Spring Boot é uma das formas mais eficientes de demonstrar domínio dos fundamentos exigidos em desafios de vagas para desenvolvedor júnior. Essa prova prática avalia design de entidades, manipulação de relacionamentos e domínio das principais bibliotecas do ecossistema Spring, todos altamente valorizados em processos seletivos reais.

O Desafio: Contexto e Objetivo

O objetivo central é criar, do zero, uma API simples simulando um mini CRM — gerenciando clientes e seus contatos — utilizando a stack Java Spring Boot, uma das mais procuradas pelo mercado. Ideal para quem está entrando na área de desenvolvimento, o desafio elimina complexidade excessiva, foca no domínio do CRUD básico, modelagem de entidades relacionais e exposição de endpoints REST conforme padrões profissionais.

Requisitos: Modelagem e Funcionamento

O sistema precisa controlar duas entidades principais: Cliente (com ID, nome, e-mail) e Contato (ID, tipo, valor, cliente). A relação é de um para muitos: um cliente pode ter vários contatos. Tudo isso deve ser feito sem camadas intermediárias como DTO ou Service, para garantir aprendizado puro de controller e repositório.

⚠️Atenção

Não utilize camadas de serviço (service) ou transformação de objetos (DTO). A entrega dos dados será feita diretamente pelo corpo das entidades via request/response!

Stack e Dependências Utilizadas

Java 17+

Versão da linguagem para base do Spring Boot

Maven

Gerenciador de dependências do projeto Java

Spring Boot 3.5+

Framework para criação da API REST

Spring Web

Módulo para criação dos endpoints HTTP

Spring Data JPA

ORM de persistência e consultas

Banco H2

Banco de dados em memória, ideal para testes

Lombok

Simplifica geração de getters/setters/construtores

Spring Boot DevTools

Auto-reload e melhorias no dev

ℹ️Dica

Use o Spring Initializr para gerar rapidamente seu projeto e as dependências principais!

Passo a Passo: Montando o Projeto na Prática

1
Passo 1: Gere o projeto no Spring Initializr, selecionando Java 17+, Maven, Spring Boot 3.5+, Spring Web, Data JPA, H2, Lombok e DevTools.
2
Passo 2: Extraia e abra o projeto em sua IDE favorita (ex: IntelliJ, VS Code).
3
Passo 3: Configure o application.properties para conectar ao banco H2 em memória, habilitando o console web (spring.h2.console.enabled=true).
4
Passo 4: Crie os packages model para as entidades e repository para os repositórios JPA.
5
Passo 5: Modele as entidades Cliente e Contato com as anotações JPA/Lombok necessárias.
6
Passo 6: Implemente as interfaces ClienteRepository e ContatoRepository estendendo JpaRepository.
7
Passo 7: Crie o ClienteController para expor endpoints POST e GET de clientes e contatos diretamente.
8
Passo 8: Utilize @RequestBody, @PathVariable e @ResponseEntity para recebimento/retorno dos dados e status HTTP corretos.
9
Passo 9: Teste a API com ferramentas da IDE ou pelo console H2/Web, garantindo que os endpoints respondem como esperado.
10
Passo 10: Verifique que regras de resposta HTTP (201, 200, 404) estão corretas para cada cenário.

Atenção

Proibido vincular contatos na criação do cliente! O contato é sempre cadastrado depois, usando o ID do cliente já existente.

Modelagem das Entidades: Cliente e Contato

O Cliente possui: ID (auto-incrementado), nome e e-mail; O Contato possui ID, tipo, valor e uma associação a um cliente. Use anotações @Entity, @Table, @Id, @GeneratedValue, @OneToMany/@ManyToOne conforme a direção do relacionamento. Recomenda-se fetch = FetchType.EAGER no lado do cliente para carregar contatos juntos e LAZY no contato.

Importante

Lembre-se de também colocar as anotações @JsonManagedReference e @JsonBackReference nos relacionamentos para evitar loops de serialização nas respostas JSON.

Endpoints REST: Estrutura Essencial

Rode sua API com os seguintes endpoints básicos:

1
POST /clientes: cria um cliente (sem contatos!) - retorna 201 Created
2
GET /clientes: lista todos os clientes com seus contatos
3
POST /clientes/id/contatos: adiciona contato a um cliente existente, via body (retorna 404 se o cliente não existir)
4
GET /clientes/id/contatos: lista contatos de um cliente pelo seu ID

⚠️Atenção ao Status HTTP

Use sempre ResponseEntity para controlar o status de resposta: 201 para criação, 200 para busca com sucesso e 404 quando não encontrado.

Comparando Abordagens para Vincular Contatos ao Cliente

POST /clientes/{id}/contatos

Contato criado passando ID do cliente na URL via PathVariable.

Prós
  • URL clara e intuitiva
  • Facilita identificação do cliente
  • Adere a boas práticas REST
Contras
  • Pouco flexível para casos futuros de múltipla associação

POST /contatos?clienteId=

Contato criado usando request param na query string.

Prós
  • Facilita consumo via formulários simples
  • Menos verbosidade na rota
Contras
  • Menos intuitivo em APIs RESTful
  • Pode confundir em rotas semânticas

Recomendação

Prefira a abordagem POST /clientes/{id}/contatos; ela segue o padrão de agrupamento de recursos e deixa o endpoint mais semântico.

Testando Endpoints: Boas Práticas e Cuidados

Use funcionalidades da IDE, ferramentas como Postman, Insomnia ou até o próprio console do H2 para criar, buscar e validar as respostas dos endpoints. Garanta que cada resposta HTTP está correta, e que buscas por cliente inexistente retornam 404.

⚠️Atenção

Não deixe dados mockados em código: teste sempre trabalhando com a requisição HTTP real, simulando uso na prática!

Critérios de Avaliação em Desafios de Vaga

O desafio avaliará:

  • Modelagem correta das entidades (relacionamentos e integridade)
  • Endpoints REST funcionais e claros
  • Status HTTP adequados nas respostas
  • Boas práticas no código, evitando anti-patterns
Aqui, clareza de código, simplicidade e aderência aos requisitos contam mais do que soluções complexas.

ℹ️Atenção ao Detalhe

Capriche na nomeação de métodos, rotas, campos e comentários. A clareza conta pontos!

Pontas Extras: Diferenciais e Melhoria

Para além do básico, você pode surpreender adicionando validações simples com @NotNull, mensagens de erro amigáveis, e organização do código pensando em fácil escalabilidade (ex: modularização dos packages). Use o Lombok moderadamente e mantenha o foco na robustez e clareza.

⚠️Cuidado

Não aumente a complexidade com patterns ou recursos avançados: respeite sempre o escopo júnior quando indicado no desafio!

Conclusão: Pronto para Desafios de Vaga com Java?

Seguindo este guia, você demonstrará domínio prático de CRUD com relacionamentos em Java Spring Boot, manipulando endpoints REST, entendendo erros e aplicando boas práticas essenciais. Este tipo de entrega sólida aumenta sua visibilidade entre recrutadores e prepara para desafios ainda mais complexos em back-end.

Dica para sua entrevista

Tenha o código rodando em local ou repositório público (ex: GitHub) e prepare explicações claras sobre decisões de modelagem e arquitetura.

Checklist de Implementação

Projeto criado e dependências instaladas pelo Spring Initializr
Banco de dados em memória H2 configurado e acessível
Entidades Cliente e Contato modeladas corretamente
Repositories JPA criados e funcionando
Controller expõe todos os endpoints obrigatórios
Status HTTP atendem aos critérios (201, 200, 404)
API testada via ferramentas externas ou IDE
Código limpo, sem camadas extras, no padrão do desafio

Domine React e Node com o CrazyStack

Aprenda técnicas avançadas de React com nosso curso completo