HomeBlogGitHub

Lições aprendidas: desenvolvendo uma API com Spring

20 May, 2021 - 6 min read

Começar uma atividade que requer prática constante e que depende disso para evolução e resultados exige paciência, foco e persistência. Nesse sentido, aprender a programar é como correr uma corrida de rua, algo que já fiz (no passado) com maior dedicação e exigiu bastante treino.

A analogia da corrida de rua, de certa forma, me ajuda a entender e situar o que tenho feito neste momento que aprendo a programar. Na corrida, há o treino, as corridas de 3k, 5k, 10k, 21k e a maratona de 42k. Na programação, existem os estudos teóricos, a prática em projetos pessoais, a prática no ambiente de trabalho. Da mesma forma, existem os colegas de treino e prática, os treinadores que direcionam e realizam os ajustes de percurso nos treinos e/ou provas, os resultados em termos de tempo e entrega de valor.

Este post não é um conteúdo técnico (como o anterior sobre a criação de um projeto React). Ao invés disso, são lições aprendidas ao longo de um exercício de prática deliberada de código.

O projeto

Como parte da preparação para o processo seletivo do programa Orange Talents, procurei construir um projeto como se fosse um microsserviço e utilizando a stack Java, Hibernate, Spring. Para isso, escolhi de referência a playlist da API da Casa do Código do Dev Eficiente. O Alberto possui uma didática com a qual me identifico bastante, além de realizar um projeto na stack que eu estava buscando.

Ah, antes que esqueça, o repositório do projeto pode ser encontrado aqui.

Escolhas na configuração do projeto

Na criação do projeto, dois pontos tomaram mais tempo. O primeiro não foi necessariamente uma escolha, mas um aprendizado. Tanto no site spring.io quanto utilizando o plugin do Spring para o Eclipse, não foi possível criar um projeto com nome contendo espaços. No site, apresentava um erro de rede genérico e, ao testar dentro do Eclipse, a mensagem de erro indicou que era esse o problema. Isso não chegou a criar um problema futuro, foi apenas questão de ajustar o nome do projeto para apicasacodigo.

O segundo ponto foi uma escolha que teve impacto durante todo o processo de desenvolvimento subsequente: utilizei o banco de dados H2 que guarda as informações em memória. Enfrentei dificuldades para instalar tanto o MySQL quanto PostgreSQL na minha máquina e subir um banco utilizando o Docker é algo que não soube como fazer. Criar e subir o banco MySQL tudo bem, porém o problema apareceu na hora de configurar a aplicação Java para utilizar o container. Isso é algo que já fiz em Node, utilizando o PostgreSQL, porém em Java ainda não.

No fim, essa escolha se deu porque estava levando muito tempo na configuração e sem começar a desenvolver o projeto. Contudo, importante ressaltar que durante o desenvolvimento o banco H2 tornou as tarefas um pouco mais repetitivas. Então, acredito, o tempo que tentei economizar no começo acabou não se justificando. Esse foi um dos principais aprendizados deste projeto.

Aprendizados do desenvolvimento

Uma das coisas que o Alberto trabalha no processo de desenvolvimento e que busquei seguir, é sempre testar o código na medida em que ele vai sendo escrito. Ou seja, não esperar que toda a funcionalidade seja considerada pronta para que, então, seja feito um teste. Isso faz muito sentido, pois quanto mais você escreve um código sem executá-lo, maior se torna o contexto de execução dele - aumentando as possibilidades de um erro acontecer.

Validar os dados da aplicação, sobretudo aqueles que estão nas bordas do sistema, é algo que irei buscar adotar daqui para frente. Isso para garantir que os dados que serão repassados ao domínio tenham sido validados. Outro ponto é não ter medo de erros, especialmente das stacks enormes que o Java apresenta (rs). Refletindo, isso de certa forma conversa com o teste frequente do código, pois permite ter um contexto mais próximo do que foi alterado - e que pode ser uma causa provável de um erro de requisição, no caso de uma API.

Em determinado momento do processo, na implementação do markdown do sumário do livro para que fosse retornado como HTML, encontrei um erro java.lang.NoClassDefFoundError. Da documentação e de pesquisas no Google confirmei que é um erro quando a classe não é encontrada - mesmo que elas estivessem presentes no projeto. O que resolveu foi dar um restart no projeto, diferentes pacotes haviam sido adicionados, e a aplicação funcionou normalmente.

Sem querer me alongar nos aprendizados, que foram muitos, tive como foco nesse primeiro momento fazer o código funcionar, realizando os ajustes necessários, testando as funcionalidades e vendo-as funcionar. Isso representa uma mudança, e um desafio constante, para alguém como eu que sempre priorizou entender tudo antes de fazer (ainda sobre a época que era estudante de humanas). Confiar no processo de desenvolvimento, buscando um código simples e eficiente tem ajudado nessa mudança da forma de pensar.

Melhorias futuras

Objetivamente, são 3 pontos que buscarei melhorar nos próximos projetos. Primeiro, o projeto como estava apresentado não chegou a ser finalizado, tendo faltado as funcionalidades de compra a partir do carrinho, cupom de desconto e pagamento de uma nova compra. Acredito que isso entre na parte de planejamento da sprint de trabalho. As tarefas estavam definidas, porém estimei que levariam menos tempo do que o realizado.

Segundo ponto, aprender como configurar uma aplicação Java/Spring para utilizar o ambiente de desenvolvimento no Docker. Esse é um exercício a parte com seu próprio tempo e que ajudaria muito durante o desenvolvimento da aplicação, reduzindo o tempo de trabalho e permitindo avançar no trabalho de mais funcionalidades.

O último ponto é mais geral, mas não menos importante: estudar mais a fundo os conceitos de Java, Hibernate e Spring. Aqui, a ideia é adquirir uma bagagem teórica que permita maior autonomia na criação da solução, transformando em código as necessidades de negócio.

Referências

© 2021 por fpsaraiva. Feito com

Gatsby