O projeto Tech Challenge proposto para a pós-graduação FIAP em Arquitetura e desenvolvimento Java consiste, na primeira fase do curso, no desenvolvimento de uma API para o cadastro e gerenciamento de informações relacionadas a eletrodomésticos, endereços e pessoas. Essa API será desenvolvida utilizando as tecnologias Spring Boot, Java 17 e o banco de dados PostgreSQL. O objetivo é criar uma solução eficiente e segura, fornecendo endpoints para operações de criação, atualização, recuperação e exclusão de registros.
As tecnologias utilizadas durante o desenvolvimento do projeto.
Linguagem de programação escolhida para implementar a lógica do sistema, garantindo confiabilidade, segurança e escalabilidade.
Utilizado como framework para agilizar o desenvolvimento da API, oferecendo recursos como injeção de dependências, mapeamento de URLs, tratamento de requisições HTTP e muito mais.
Banco de dados utilizado para armazenar e gerenciar as informações relacionadas a eletrodomésticos, endereços e pessoas. O PostgreSQL é conhecido por sua robustez e confiabilidade, adequado para aplicações de larga escala.
Gerenciador de dependências utilizado para facilitar a configuração e o gerenciamento das bibliotecas e dependências do projeto.
Sistema de controle de versão utilizado para rastrear alterações no código-fonte, facilitando o trabalho em equipe, o versionamento e a colaboração no projeto.
Biblioteca que permite reduzir a quantidade de código boilerplate, como getters, setters e construtores, através de anotações, melhorando a produtividade do desenvolvimento.
Biblioteca utilizada para mapear automaticamente objetos de uma classe para outra, facilitando a conversão de DTOs (Data Transfer Objects) para entidades e vice-versa.
Ambiente de desenvolvimento integrado (IDE) utilizado para escrever, depurar e testar o código-fonte do projeto. O Intellij IDEA oferece recursos avançados de produtividade, facilitando o desenvolvimento em Java e agilizando o processo de construção da API.
Plataforma de colaboração e testes de API que permite enviar e receber solicitações HTTP, testar os endpoints da API, verificar as respostas e realizar a depuração de forma eficiente.
Plataforma de hospedagem de repositórios de controle de versão Git, utilizada para armazenar e gerenciar o código-fonte do projeto. O GitHub permite o trabalho colaborativo, controle de versões, rastreamento de alterações e facilita a integração com ferramentas de desenvolvimento.
Plataforma de comunicação por voz, vídeo e chat, utilizada para facilitar a colaboração e a comunicação em equipe durante o desenvolvimento do projeto.
Ferramenta de gerenciamento de projetos baseada em quadros Kanban, utilizada para organizar e acompanhar as tarefas do projeto.
Estes são os passos para a execução do projeto num ambiente local.
- Clone este repositório git na sua máquina local
git clone https://github.com/samuelclinton/techchallenge.git - Instale e configure o PostgreSQL:
- Crie o database com o nome:
techchallenge; - Por padrão as credenciais são
postgrespara usuário e senha, porém isso pode ser configurado através das variáveis de ambienteDB_USEReDB_PASSWORD;
- Crie o database com o nome:
- Faça a build do projeto utilizando o Maven (saiba como) e execute o JAR do projeto.
- Execute as chamadas HTTP utilizando o endereço base padrão
http://localhost:8080
O desenvolvimento do projeto por enquanto foi simples e sem grandes dificuldades, mas como resolvemos implementar a persistência (que era opcional nessa fase) logo de início, nos deparamos com o relacionamento de Pessoas com Pessoas, no caso o parentesco. No nosso entendimento isso é mais uma questão de vínculo entre clientes do que o grau de parentesco em sí (filhos, pais, sobrinhos, tios). Com isso em mente, fizemos um relacionamento de autorreferência, onde uma pessoa pode ou não ser vinculada a um parente. O parente que for vinculado a esse parente tem sua "conta" na aplicação vinculada, sendo essa excluída caso o parente da conta principal resolva excluir a sua. A nova feature da Netflix de contas subsidiárias foi uma inspiração aqui. Outro conhecimento interessante, que o Junior trouxe de um projeto prévio, foi a criação de um mapeador genérico de classes utilizando o ModelMapper, isso agilizou muito o desenvolvimento dos mapeadores, onde antes teríamos diversos mapeadores "repetidos", apenas com suas classes de origem e destino alteradas, agora temos uma implementação genérica (utilizando a Generics API do Java) que pode ser instanciada para diversas classes com a mesma implementação. Isso aumenta um pouco a complexidade do código porém a produtividade é beneficiada.
A segunda fase apresentou diversas novas dificuldades, começando por coincidir com as minhas férias e uma mudança de grupo, gerou problemas de planejamento e prazo. Falando de dificuldades técnicas, escolhi uma abordagem de modelagem do recurso de Pessoa com um auto-relacionamento, e inicialmente gerar relacionamentos entre as pessoas com grau de parentesco. Essa abordagem se mostrou complicada num nível desnecessário, especialmente quando introduzi mais de duas gerações familiares. Simplifiquei essa abordagem com a criação de uma nova entidade Familia que guarda os membros da familia hierarquizados pra exibição futuramente. Outro problema enfrentado foi pra cumprir os requisitos da fase, que sempre pediam consultas que geram relacionamentos bi-direcionais e mapeamentos não tão performáticos. Isso é uma coisa que espero alterar na fase três quando o escopo do projeto for afunilando e ficar mais claro o desenho do sistema que consumiria a API. Como próximo passo e um extra para a próxima fase, vou implementar também uma documentação Swagger/OpenApi.
Um agradecimento ao Junior Martins e Matheus Dias que deixaram o grupo mas contribuíram com o projeto na primeira fase e ao Eric Moraes que fez parte do grupo até a metade da segunda fase.
Licença MIT: permite o uso, a modificação e a distribuição do software sem restrições significativas.