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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
É 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.
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.
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).
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.
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").
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.
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.
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.
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!
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:
O Plano Plus evoluiu: agora com Luri para impulsionar sua carreira com os melhores cursos e acesso à maior comunidade tech.
2 anos de Alura
Matricule-se no plano PLUS 24 e garanta:
Jornada de estudos progressiva que te guia desde os fundamentos até a atuação prática. Você acompanha sua evolução, entende os próximos passos e se aprofunda nos conteúdos com quem é referência no mercado.
Programação, Data Science, Front-end, DevOps, Mobile, Inovação & Gestão, UX & Design, Inteligência Artificial
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
Acesso à inteligência artificial da Alura.
No Discord, você participa de eventos exclusivos, pode tirar dúvidas em estudos colaborativos e ainda conta com mentorias em grupo com especialistas de diversas áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Luri Vision chegou no Plano Pro: a IA da Alura que enxerga suas dúvidas, acelera seu aprendizado e conta também com o Alura Língua que prepara você para competir no mercado internacional.
2 anos de Alura
Todos os benefícios do PLUS 24 e mais vantagens exclusivas:
Chat, busca, exercícios abertos, revisão de aula, geração de legenda para certificado.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Para quem quer atingir seus objetivos mais rápido: Luri Vision ilimitado, vagas de emprego exclusivas e mentorias para acelerar cada etapa da jornada.
2 anos de Alura
Todos os benefícios do PRO 24 e mais vantagens exclusivas:
Catálogo de tecnologia para quem é da área de Marketing
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais de forma ilimitada.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Conecte-se ao mercado com mentoria individual personalizada, vagas exclusivas e networking estratégico que impulsionam sua carreira tech para o próximo nível.