Construindo APIs em Java e telas em React, em São Paulo
Ciência da Computação, Anhembi, formatura em 2028
Guilherme
Oliveira
Comecei pela tela, no design. Fui para o backend porque queria entender o que acontece depois do clique. Hoje faço as duas pontas: Java e Spring no servidor, React e Next.js na tela.
- 24
- endpoints REST
- 32
- testes no CI
- 3
- APIs Spring Boot

- hoje
- UX/UI no time de CRO da Lojas Marisa
- estudo
- Ciência da Computação, Anhembi, até 2028
- onde
- São Paulo, Brasil
01 interface / de onde eu vim
Eu entregava a tela. O resto era de outra pessoa.
01 interface / de onde eu vimEu entregava a tela. O resto era de outra pessoa.
Eu entregava a tela. O resto era de outra pessoa.
Entrei na Lojas Marisa em março de 2025 no time de cadastro, tratando imagem de produto. Hoje estou no time de CRO, com UX/UI: olho o comportamento da cliente, decido o que muda na página de produto, no checkout e nas landing pages, e monto as visões que mostram se a mudança funcionou. É um trabalho em que toda mudança na tela vira número, e foi isso que me deixou curioso pelo outro lado: como o dado chega até ali, como é guardado, validado e devolvido.
Fui estudar essa parte. Estudo Ciência da Computação na Anhembi Morumbi e escolhi Java e Spring porque é o que a maioria das empresas grandes daqui roda, e porque eu queria uma linguagem que não me deixasse ser vago.
O que veio do design eu não larguei. Quando desenho uma resposta de erro, penso em quem vai ler ela às duas da manhã tentando descobrir por que a integração quebrou. Isso não é firula. É a diferença entre um 400 que resolve e um 400 que gera um ticket.
Toda API tem interface. A maioria dos devs não desenha a dela.
Trabalho
nov 2025 a hoje
Assistente de UX/UI Pleno na Lojas Marisa
- No time de CRO, cuido do UX/UI de página de produto, checkout e landing pages, decidindo pelo comportamento da cliente.
- Administro o conteúdo do site e faço pequenos desenvolvimentos web: protótipo, ajuste de componente e e-mail marketing em HTML.
- Construo e atualizo as visões de análise de resultado de onde o time tira insight de performance e comportamento. Automatizei em Python a rotina diária de uma planilha, anexando dado novo sem apagar histórico.
mar a nov 2025
Assistente de E-commerce Jr na Lojas Marisa
- No time de cadastro, cuidei da frente de tratamento de imagem dos produtos que entram no site.
Formação
- Bacharelado em Ciência da Computação, Universidade Anhembi Morumbi2025 a 2028
- Técnico em Processamento de Dados, Hashtag Treinamentos2026
- Técnico Integrado em Tecnologia da Informação, Senac São Paulo2023 a 2024
02 contrato / o que eu sei fazer
201 CreatedTrês APIs em Java, com o contrato à mostra.
Uma resolve autenticação, uma resolve dinheiro somado no banco, uma resolve disciplina de camadas. Em cada case eu conto o problema, o que escolhi e o que a API responde.
console: 6 endpoints para testarfechar
Escolhe um endpoint e vê o que ele devolve.
Requisição
{
"email": "ana@exemplo.com",
"senha": "senha-forte-aqui"
}Resposta
Clica num endpoint aí em cima.
O token já vem com a validade dele na resposta. Isto é um replay, não uma chamada de rede: as APIs em Java rodam na minha máquina, não em produção. O par que você vê é o que o controller devolve.
o mesmo 400, antes e depoisfechar
O mesmo erro, antes e depois de alguém desenhar.
É aqui que o design aparece no meu backend. Um 400 que diz qual campo está errado evita um ticket.
POST /api/produtos 400 validação falhou
{
"timestamp": "2026-07-30T14:02:11.482+00:00",
"status": 400,
"error": "Bad Request",
"path": "/api/produtos"
}- Diz o que aconteceu para a máquina, não para quem integra.
- Não diz qual campo está errado. Quem integra descobre por tentativa.
- Formato diferente do resto da API: quem trata erro precisa de dois parsers.
outros 5 projetos, sem casefechar
Outros projetos, sem case escrito
05Lince, inteligência de preço
Full-Stack
Plataforma B2B multi-tenant que eu fiz sozinho, do nome ao produto no ar. Coletores plugáveis com job agendado, motor de regras que sugere preço e nunca aplica sozinho, alerta por SSE.
FastAPI, SQLAlchemy, JWT, React, Tauri, Capacitor
Monitoramento preditivo de energia
Dados
Série histórica de 19 usinas entre 2000 e 2024, detecção de anomalia em tempo real e previsão de consumo de sensor por regressão.
Python, FastAPI, Pandas, React
Auditoria de uma carteira digital
Segurança
Trabalho em grupo da faculdade: auditamos um e-wallet aberto em Spring Boot. Ele passava em todas as ferramentas e deixava transferir dinheiro da carteira de outra pessoa (IDOR).
Java 17, Spring Security, JUnit 5, Mockito
Cinco plugins de Figma
Produto
Um gera os estados de vazio, carregando e erro a partir da tela pronta, lendo o contrato da API. Outros dois exportam GIF offline, com dither e transparência.
TypeScript, Figma Plugin API
Forja
Full-Stack
Landing, app mobile em Expo e backend Node/Express com MFA, verificação por e-mail e trilha de auditoria.
Node.js, Express, PostgreSQL, Expo
03 domínio / como eu penso quando trava
Quando trava, eu anoto.
Mantenho um log de todo erro que me custou tempo, com sintoma, diagnóstico, o que fiz e como não cair de novo. Estas quatro entradas são recorte fiel dele.
03 domínio / como eu penso quando travaQuando trava, eu anoto.
Quando trava, eu anoto.
Mantenho um log de todo erro que me custou tempo, com sintoma, diagnóstico, o que fiz e como não cair de novo. Estas quatro entradas são recorte fiel dele.
ERR-JAVA-00310 minUm import do Spring que sumiu, e o jeito de achar o novocannot find symbol: class AutoConfigureMockMvc
Diagnóstico
No Spring Boot 4 a auto-configuração do MockMvc saiu do módulo genérico de test-autoconfigure e foi para o módulo webmvc. O pacote antigo simplesmente não existe mais no classpath.
O que eu fiz
Em vez de chutar o pacote novo por tentativa, abri o jar: unzip -l spring-boot-webmvc-test-4.1.0.jar e procurei a classe. Achar o caminho real levou menos tempo que a primeira tentativa de adivinhar levaria.
Para não repetir
Quando um import de framework desaparece, a resposta está dentro do jar em ~/.m2. O Stack Overflow vai te contar sobre a versão anterior.
ERR-JAVA-00410 minJackson 2 para 3: a correção que virou decisão de testecannot find symbol: class JsonNode
Diagnóstico
O Boot 4 adota Jackson 3, e o pacote raiz mudou de com.fasterxml.jackson para tools.jackson. O conserto óbvio era trocar o import.
O que eu fiz
Não troquei o import: tirei o Jackson do teste. Passei a ler o id pelo header Location do 201 Created e a seguir pela URL. O teste ficou mais robusto e deixou de depender de qual parser de JSON o framework usa por dentro.
Para não repetir
Teste de API afirma sobre o contrato: status, header, jsonPath. Se ele afirma sobre a biblioteca de serialização, a próxima major cobra a conta.
ERR-JAVA-00710 minA dependência de JWT que arrastava a stack velha inteiraRisco de duas versões de Jackson no mesmo classpath
Diagnóstico
O módulo jjwt-jackson depende de Jackson 2 databind. Ele traria a stack antiga de volta só para serializar as claims do token, convivendo com o Jackson 3 que o Boot 4 já usa.
O que eu fiz
Troquei o serializador em vez de aceitar o conflito: jjwt-api + jjwt-impl + jjwt-gson. Gson é isolado e pequeno, e não toca no Jackson. A alternativa era gerenciar exclusão de dependência transitiva para sempre.
Para não repetir
Antes de adicionar biblioteca, olhar o que ela arrasta. Quando a lib deixa escolher o serializador, escolher o que não duplica o que o framework já traz.
ERR-JAVA-00115 minO gerador oficial produziu uma versão que não existeNon-resolvable parent POM: spring-boot-starter-parent:4.1.0.RELEASE (absent)
Diagnóstico
O Initializr publica o id da versão como 4.1.0.RELEASE. No Maven Central o artefato é só 4.1.0. O sufixo é herança de um esquema de versão que o Spring abandonou anos atrás.
O que eu fiz
Conferi a coordenada na fonte da verdade em vez de tentar variações: curl no maven-metadata.xml do Central resolve em segundos qual versão de fato existe.
Para não repetir
O id de uma ferramenta de scaffold não é a coordenada do repositório. Quando o build não resolve, validar contra o metadata do Central antes de mexer em qualquer outra coisa.
Regras que eu sigo antes de travar
- 01Autenticação e permissão eu desenho antes do primeiro endpoint.
- 02Regra de negócio fica no domínio. Controller só traduz HTTP.
- 03Teste de integração passando pelo caminho real da requisição, com banco subindo.
- 04Se eu fiz duas vezes na mão, viro script.
04 persistência / o que eu sei
O que eu sei, e onde dá para conferir.
Lista de tecnologia sem nível é o que todo portfólio tem. Aqui cada item diz onde foi usado. Se um deles subir de nível, eu mudo o quadrado.
04 persistência / o que eu seiO que eu sei, e onde dá para conferir.
O que eu sei, e onde dá para conferir.
Lista de tecnologia sem nível é o que todo portfólio tem. Aqui cada item diz onde foi usado. Se um deles subir de nível, eu mudo o quadrado.
- produçãoalguém dependeu disso rodando
- projetocódigo meu, com teste
- estudoainda sem artefato
Backend
- Java 21, nível projetoas três APIs
- Spring Boot 4, nível projetoas três APIs
- Spring Security + JWT, nível projetoE-commerce API
- FastAPI, nível projetoLince, energia preditiva
- Node.js / Express, nível projetoForja
Front-end e interface
- Figma / design system, nível produçãotrabalho, desde 2025
- React / Next.js, nível produçãoeste site
- TypeScript, nível projetoplugins de Figma
Dados
- PostgreSQL / SQL, nível projetoresumo mensal com group by
- JPA / Hibernate, nível projetoas três APIs
- Python + Pandas, nível produçãoautomação diária no trabalho
Qualidade e operação
- JUnit 5 + MockMvc, nível projetotestes de integração das APIs
- Docker / Compose, nível projetosubida local em um comando
- GitHub Actions, nível projetoCI das APIs
- Linux + systemd, nível produçãocoletor rodando em VM
Ainda não
- AWS, nível estudona fila, out a nov 2026
- Kafka, nível estudonovembro de 2026
- Spring AI / pgvector, nível estudo2027
05 fila / o que estou aprendendo e o que falta
202 AcceptedAceito e em processamento.
O que eu estou estudando agora, com o critério de pronto de cada item, e o que eu ainda não sei, dito por mim antes que alguém descubra na entrevista.
05 fila / o que estou aprendendo e o que faltaAceito e em processamento.
Aceito e em processamento.
O que eu estou estudando agora, com o critério de pronto de cada item, e o que eu ainda não sei, dito por mim antes que alguém descubra na entrevista.
- out 2026Publicar as três APIspronto quandoRepositório público com README e CI verde.feito
- out a nov 2026E-commerce API no ar na AWSpronto quandoSwagger respondendo numa URL pública, deploy pelo GitHub Actions com OIDC e nenhuma chave guardada no repositório.na fila
- nov 2026Kafka, mesmo que pequenopronto quandoPedidoCriado baixa o estoque uma vez só, mesmo se a mensagem chegar duas vezes. Um teste com Testcontainers prova.na fila
- dez 2026Métrica e log estruturadopronto quandoActuator e Micrometer com um painel, e o print no README.na fila
O que eu ainda não fiz.
Nenhuma API minha roda em produção
O código é público e o CI passa, mas elas só sobem no Docker da minha máquina. O console desta página é replay do contrato, não chamada de rede, e diz isso.
Zero AWS
É o que as vagas de júnior Java mais pedem e o que eu menos tenho. Por isso é o segundo item da fila.
Nunca usei mensageria
Sei o que é fila e por que o consumidor precisa ser idempotente. Ainda não escrevi um. Kafka entra na E-commerce API em novembro.
Pouco teste fora do Java
Forja e o projeto de energia têm zero teste. CI sem teste só prova que compila, e eu sei disso porque escrevi essa frase no meu próprio inventário.
06 rota / onde eu quero chegar
As duas pontas primeiro. IA em Java depois, medida.
Quero ser o dev que desenha a API pensando em quem vai integrar, e que mede antes de dizer que algo funciona. O caminho até lá, com data:
06 rota / onde eu quero chegarAs duas pontas primeiro. IA em Java depois, medida.
As duas pontas primeiro. IA em Java depois, medida.
Quero ser o dev que desenha a API pensando em quem vai integrar, e que mede antes de dizer que algo funciona. O caminho até lá, com data:
até dez 2026você está aqui
Publicar e colocar no ar
As três APIs públicas, uma delas na AWS com deploy automático e Kafka. Candidatura de dev toda semana, anotando em que etapa cada uma parou.
1º semestre 2027
Primeira vaga de dev
Estágio ou júnior, fullstack ou backend. Os primeiros seis meses de emprego são do emprego: domínio, deploy, plantão, quem decide o quê.
2027 a 2028
Busca semântica em Java, medida
Embeddings com pgvector num catálogo público, comparados com o dicionário de sinônimos que eu já construí para uma busca real. Quase todo projeto de RAG mostra que funciona. Eu quero mostrar quando ele perde para a alternativa barata.
2028
Rumo a pleno
Ser dono de um sistema no trabalho. Aí sim escolher entre backend sênior com cloud ou engenharia de IA em Java, pelo que o trabalho real estiver puxando.
07 resposta / fala comigo
200 OKMe chama.
Estágio em desenvolvimento ou vaga júnior. Remoto, híbrido ou presencial em São Paulo. Eu respondo em até um dia útil.
- Telefone
- +55 (11) 97172-7565
- Currículo
- PDF, 1 página