Alura > Cursos de Programação > Cursos de Java > Conteúdos de Java > Primeiras aulas do curso Live Coding com Java: desenvolvendo APIs RESTful com Spring Boot

Live Coding com Java: desenvolvendo APIs RESTful com Spring Boot

Live Coding - Live Coding com Java

Introdução ao Projeto

Olá a todos, sejam bem-vindos a mais um episódio da nossa websérie Hipsters Portfólio Dev. Neste projeto, desenvolvemos uma aplicação do zero até a publicação, criando um portfólio que pode ser seguido passo a passo. O objetivo é que, ao final, possamos publicar o projeto no GitHub, com as devidas personalizações.

Detalhes do Projeto e Participação Especial

Neste mês, o projeto será desenvolvido em Java, e contamos com a participação de Alexandre Aquiles, um dos principais instrutores de Java na Alura e autor de livros pela Casa do Código.

Descrição da Aplicação

O projeto consiste em criar uma rede social minimalista, inspirada nas origens do Twitter, chamada de "1,42 avos do X". A aplicação será uma API, não uma interface gráfica, e terá funcionalidades básicas como um feed de tweets, que serão carregados em lotes de cinco. Os tweets podem ser originais, repostados (retweets) ou citações (quotes). Para promover um ambiente pacífico, limitaremos a postagem a dois tweets por usuário a cada 24 horas.

Funcionalidades e Regras de Negócio

Os próximos passos incluem implementar autenticação, autorização, cadastro, perfil de usuários e seguidores. As entidades principais serão o usuário, com um username alfanumérico de até 10 caracteres, e o tweet, que terá no máximo 42 caracteres. Os tweets não poderão ser removidos ou atualizados após a postagem.

Modelagem do Projeto

Para iniciar, vamos modelar o projeto utilizando a ferramenta Excalidraw para desenhar o modelo de dados. Começaremos com as entidades usuário e tweet. O usuário terá um username e um ID como chave primária. O tweet terá um ID, conteúdo, tipo, autor e data de criação. O tipo de tweet pode ser original, retweet ou quote. A relação entre usuário e tweet será de um para muitos.

Tecnologias e Ferramentas Utilizadas

Vamos utilizar Spring Boot 3, Java 23, MySQL e Docker para a infraestrutura. O projeto será iniciado no Start Spring IO, onde configuraremos as dependências necessárias, como Spring MVC, Spring Data JPA, MySQL Connector e Flyway para migrações de banco de dados.

Configuração Inicial do Projeto

Após configurar o projeto no Spring IO, clonaremos o repositório do GitHub e iniciaremos a implementação. Utilizaremos o IntelliJ como IDE e seguiremos boas práticas de versionamento com Git, criando uma nova branch para a funcionalidade de feed e modelagem inicial.

Implementação Inicial e Testes

Iniciaremos com um teste simples, criando um easter egg que retorna um caractere de passarinho ao acessar a rota /piu. Utilizaremos o MockMvc para simular chamadas à API e validar o comportamento esperado.

Configuração do Banco de Dados

Configuraremos o banco de dados MySQL utilizando Docker Compose, criando as tabelas usuário e tweet com as devidas restrições e chaves estrangeiras. Utilizaremos o Flyway para gerenciar as migrações de banco de dados.

Desenvolvimento do Controlador e API

Com o banco de dados configurado, implementaremos o controlador para a rota /piu, garantindo que o teste passe e a aplicação funcione conforme esperado. Em seguida, avançaremos para a implementação do feed de tweets, criando as tabelas necessárias e configurando a API REST para listar e cadastrar novos tweets.

Criação das Entidades no Java

Ele executou a versão 1, e a versão 2 tem até a data de execução. Agora, temos o banco de dados. O próximo passo é criar a entidade, pois focamos bastante no modelo de dados. No Java, utilizamos o JPA, o Jakarta Persistence, que é o modelo de dados. Vamos criar duas classes, na verdade, um pacote para nossas entidades, as entities. Não dentro do "controllers". Vamos mover para que fiquem ao lado do "controllers", onde estarão nossas entities. Uma das entities será a User. A entidade User será uma @Entity do Jakarta Persistence. Terá um ID, que no banco de dados estava como BigInt, mas no Java será Long. Será um campo gerado pelo banco de dados, com a estratégia Identity, que é o auto-incremento gerado pelo banco de dados. Também terá o username e o createdAt. No banco de dados, usamos underscore, mas aqui utilizamos camelCase. No Java, será um LocalDateTime, que representa uma data e hora.

Definição de Restrições e Construtores

É interessante definir o que é nulo e o que não é. O @ID obviamente não será nulo. Queremos que o LocalDateTime não seja nulo, para indicar ao JPA as restrições. O username tem um tamanho máximo de 10 caracteres, não pode ser nulo nem vazio, e deve ser alfanumérico. Vamos usar @Pattern para definir uma expressão regular, uma regexp, que será algo como \w+, permitindo um ou mais caracteres alfanuméricos.

Implementação da Entidade Tweet

Seguindo o padrão do JPA, precisamos de um construtor padrão no Java, que deve ser no mínimo protected. Não queremos que ele seja usado, então o marcaremos como @Deprecated. Também criaremos outro construtor com os parâmetros necessários para criar um usuário. O createdAt será a data e hora de execução do código, usando LocalDateTime.now. Vamos criar getters para o ID e o username, simplificando o código.

Criação do Repositório e Testes

Vamos criar um pacote para os repositórios usando Spring Data JPA. Criamos uma interface UserRepository que estende JpaRepository para User com ID do tipo Long. Também criamos TweetRepository da mesma forma. O próximo passo é fazer o feed. Vamos criar testes orientados por testes (test-driven).

Desenvolvimento do Controlador de Feed

Criamos uma nova classe FeedControllerTest no pacote de testes. Usamos @SpringBootTest e @AutoConfigureMockMvc. Injetamos MockMvc com @Autowired. Criamos um teste shouldReturnFeedOfTweets, usando MockMvc.perform para fazer um GET em /feed, esperando que o status seja OK. O teste deve falhar inicialmente, pois ainda não temos o GET implementado.

Implementação do FeedController

Vamos criar a classe FeedController como @RestController, com um método feed anotado com @GetMapping("/feed"). Rodamos o teste novamente, e ele passa. Agora, precisamos de alguns tweets para serem mostrados. Usamos UserRepository e TweetRepository para criar um usuário e tweets para testes integrados. Criamos um banco de dados de teste separado do de produção, usando @ActiveProfiles("test").

Configuração do Ambiente de Teste

Criamos um arquivo application-test.properties com a configuração do banco de dados de teste. Criamos um usuário e tweets no início do teste, usando UserRepository.save e TweetRepository.save. Esperamos que o feed retorne uma lista de tweets com content, type, authorUsername e ID. Usamos MockMvc para verificar que a lista não é vazia e tem tamanho 2.

Mapeamento de Respostas e Testes Finais

Implementamos o método feed no FeedController, injetando TweetRepository e usando findAll para retornar uma lista de Tweet. Criamos uma classe TweetResponse para mapear os dados do tweet para a resposta, evitando retornar a entidade diretamente. Usamos @JsonProperty para definir os nomes das propriedades no JSON.

Conclusão e Próximos Passos

Rodamos os testes e todos passam. Verificamos o feed na aplicação, inserindo dados diretamente no banco de dados. O projeto ainda tem muito a ser feito, como criar o post, login, cadastro de usuário e seguidores. É um projeto interessante, começando do zero e seguindo o conceito de TDD (Test Driven Development), criando uma base sólida para um projeto maior.

Recomendações Finais

Para quem deseja aprender mais sobre Java, recomendamos se inscrever na Alura, que oferece formações desde o básico até partes mais avançadas. Além disso, o livro sobre SOLID na Casa do Código é uma ótima leitura. Nos vemos no próximo episódio da websérie Hipsters Portfólio Dev. Até mais!

Sobre o curso Live Coding com Java: desenvolvendo APIs RESTful com Spring Boot

O curso Live Coding com Java: desenvolvendo APIs RESTful com Spring Boot possui 103 minutos de vídeos, em um total de 3 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Java acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas