Pular para o conteúdo

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
Guilherme Araujo de Oliveira
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.

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

  1. 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.
  2. 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

  1. Bacharelado em Ciência da Computação, Universidade Anhembi Morumbi2025 a 2028
  2. Técnico em Processamento de Dados, Hashtag Treinamentos2026
  3. Técnico Integrado em Tecnologia da Informação, Senac São Paulo2023 a 2024

02 contrato / o que eu sei fazer

201 Created

Trê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

05
  • Lince, 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.

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

  1. 01Autenticação e permissão eu desenho antes do primeiro endpoint.
  2. 02Regra de negócio fica no domínio. Controller só traduz HTTP.
  3. 03Teste de integração passando pelo caminho real da requisição, com banco subindo.
  4. 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.

  • 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

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.

  1. out 2026Publicar as três APIspronto quandoRepositório público com README e CI verde.feito
  2. 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
  3. 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
  4. dez 2026Métrica e log estruturadopronto quandoActuator e Micrometer com um painel, e o print no README.na fila
501 Not Implemented

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:

  1. 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.

  2. 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ê.

  3. 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.

  4. 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 OK

Me 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.