Dominando o Springboot - Parte 2: Dicas e Boas Práticas | PPT Não Compila Podcast
Convidados
Marcello Ribeiro
Master Arquiteto @ VMBears
Jhonny Lopes
VMBears
Valdir Scarin
Arquiteto de Soluções @ VMBears
Explore o episódio
Neste episódio do PPT Não Compila, nos aprofundamos no poderoso framework Java - o Springboot! Recebemos três especialistas do mundo Java: Marcello Ribeiro, Jhonny Lopes e Valdir Scarin da VMBears, especialistas renomados em modernização de aplicações. Neste episódio, navegamos pelas melhores práticas no desenvolvimento com Springboot, garantindo um gerenciamento eficaz de dependências e utilizando configurações automáticas para impulsionar sua eficiência. Já ouviu falar dos Spring Boot Starters ou quer aprender a criar auto-configurações? Nós te guiamos nisso! Dive conosco também nas 12-fatores, uma metodologia para construção de aplicações escaláveis e manuteníveis. E não paramos por aí; abordamos as maravilhas do Lombok, e te entregamos dicas cruciais sobre tratamento de exceptions e logs. Não perca este episódio recheado de insights e dicas práticas. Se você é um desenvolvedor Java ou tem interesse em otimizar suas habilidades no Springboot, este episódio é imperdível! #Springboot #Java #PPTNãoCompila 0:56 Abertura e Apresentação 4:23 Organizando as dependências dentro do Springboot e diferenças com o Maven 14:31 Starters 19:36 Profiles 26:23 12 fatores 32:01 Caso em que o uso do Springboot não foi a melhor opção 40:56 O Springboot deixa o programador acomodado? 43:08 Arquitetura hexagonal 49:42 Springboot e o processo de modernização 54:33 Testes automatizados 1:02:30 Estrutura interna e design do Springboot 1:05:36 União do Spring com o Lombock 1:14:02 Exceções 1:29:35 Caso de problema de solução 1:39:30 Assuntos para próximo episódio 1:41:24 Agradecimentos e Considerações finais Convidados: Marcello Ribeiro - https://www.linkedin.com/in/marcello-ribeiro/ Valdir Scarin - https://www.linkedin.com/in/valdir-scarin/ Johnny Lopes Spotify: https://spoti.fi/45hwAmD Outras plataformas: https://linktr.ee/pptnaocompila Acompanhe nas redes Instagram e Twitter: @pptnaocompila LinkedIn: https://www.linkedin.com/company/pptnaocompila Produção: Voz e conteúdo | https://www.vozeconteudo.com.br - @estudiosvoz
- Apresentação e Tema do Episódio
- Continuidade do Podcast e Spring Boot Parte 2
- Introdução dos Convidados
- Gerenciamento de Dependências no Spring
- Desafios de Dependências e Java Legado
- Spring Boot e Modernização de Aplicações
- Starters e Configurações Default
- Externalização de Propriedades e Perfis
- Spring Boot e 12 Factor App
- Microserviços, Cloud e Escolha de Banco de Dados
- Filosofia do Spring Boot: Simplificando o Excepcional
- Spring Boot: Não é Bala de Prata (Case Study)
- Acomodação do Desenvolvedor e Clean Code
- Arquitetura Hexagonal e Adapters
- Discussão sobre Ferramentas e Modernização Legada
- Patrocínio: Clever
- Boas Práticas e Testes Automatizados
- Design de Adapters e Camada de Negócio
- Spring Data e Lombok
- Boas Práticas: Tratamento de Exceções
- Case de Problema: Singletons e Concorrência
- Conclusão e Próximos Episódios
o episódio mais assistido desse podcast por isso estamos aqui com esse Revival Spring o retorno para falar sobre boas práticas Spring são os projetos né que dão solução para diversos problemas recorrentes né que o programador tem no dia a dia PR filas para tudo que você imaginar E o Spring boot ele é um organizador disso a invés de eu simplesmente liberar essa biblioteca e tip D uma uma documentação e falar ó configura essas 25 propriedades eu já te dou um defo nesse contexto eu preciso de uma classe se conecta com um banco de dados H2 em memória memória é um banco diferente de um h com que é o que eu ando que eu utilizo do banco de desenvolvimento acho que a gente poderia ficar mais algumas horas aqui falando sobre Como assim Wel Como assim tem tanta coisa pra gente falar que eu tinha anotado na pauta [ __ ] que que ficou faltando aí ô cara tem a parte avançada do Spring ainda [ __ ] será que a gente vai ter que fazer um outro Episódio Ah com certeza bicho muito bem muito bem meus amigos do PPT não compile estamos aqui para mais um episódio E hoje é o episódio mais esperado desse podcast cara eu não tenho dúvida eu tenho é o episódio mais mais esperado vamos falar sobre Spring boot parte do se você não viu o primeiro episóde sobre Spring boot eu nunca sei se é desse lado desse lado vai tá aqui ó o link para que você assista a primeira parte do episódio so Spring né se já assistiu assiste de novo se é faz um recap previously em Spring boot exatamente como as séries da Netflix exatamente assista novamente a gente já falou sobre Spring aqui o link vai ficar aqui e hoje a gente vai aprofundar um pouco mais vai ser um episódio um pouco mais cabeçudo um pouco mais técnico vamos entrar no nas nuances aqui das boas práticas do sping boot a gente achou que o último foi muito descolado sabe muito surfista isso foi muito n agora a gente vai entrar um pouco mais nesse nesse contexto Faria lier Faria li muito Faria lier né então agora a gente vamos entrar no no no hard né vamos falar sobre todas as boas características e as boas práticas do Spring boot para você que é desenvolvedor para você que tá começando para você que já conhece para você que como eu não é Spring boeiro e programa em linguagem boa vamos lá aqui do meu lado direito está mdes carim Obrigado por est aqui novamente nosso grande Parceiro aqui de sempre Spring boeiro de primeira e nosso parceiro da VMB boa VMB em peso aqui né VMB emeso em peso a massa dos ursos isso aí e aqui do meu lado direito Marcelo Ribeiro também Master arquiteto da VM Bears dá um oi obrigado novamente por estar aqui com vocês oportunidade de falar de tecnologia aqui e aqui do lado esquerdo meu grande parceirinho Johnny tava pensando quem eu era né velho tipo Zé comé obviamente catatal também obviamente Pimpão Sei lá irmão urso fico são são você como é que vocês assina um Git Vocês podiam usar esses pseudônimos no Git né odeia mesmo é é uma boa o assunto obviamente adoro demais né até falaria que eu entendo bastante mas não a mesa que o Valdir os Carinho acho que é o o Valdir ele a gente tem a gente tem que manter as nossas sabe o credenciais no o criador do o o satochi nakamoto do do de Bitcoin que ninguém sabe quem é o Valdir é tipo cara só que do Spring sabe os caras do Spring estão lá lá em Washington a gente foi dar uma a tudo que eu aprendi do Spring foi aprendi por osmos quando apertei a mão do rog Johnson É verdade tenho foto disso os caras são demais o criador do Spring tirei uma foto abraçado com ele assim eu falei os caras não lavam a mão desde então Exatamente é igual indiano né [ __ ] corta essa Fan Boy Fany completamente fy Total Então galera se você quer aprender sobre but segue aqui o episódio que ele tá recheado de boas práticas e aprendizados e vamos lá [Música] [Aplausos] bora No primeiro episódio que a gente fez sobre Spring que a gente fez mais uma geral sobre que caro como que funcionava E que é até hoje o episódio mais assistido desse podcast por isso estamos aqui com esse Revival parte dois Spring o retorno para falar sobre boas práticas né Eh eu queria começar para fazer já um gancho lá com o primeiro episódio que a principal característica do Spring aqui é o gerenciamento de dependências etc né O que que eu posso e o que eu não devo fazer em relação a isso como eu organizo melhor essas dependências Qual é o jeito certo de fazer isso como é o nome do da featur que gerencia as dependências do então a a gente tem lá né dependência você pode entender que são os jars né que a sua aplicação depende e a você tem o Spring putut Starter né que que que são a as capacidades que você coloca dentro da Sea da sua aplicação né você tem também o springboot parent que é quem avalia quer dizer quem traz a a as versões corretas e mantém a compatibilidade né então isso é um um uma gestão de dependências eh de de infraestrutura ali da da sua aplicação né das bibliotecas mas aí quando você tá falando de de Lib externa né isso isso isso é aí beleza isso é uma coisa só que o Spring ele ele também faz né inversão de controle e a gestão do ciclo de vida dos seus objetos de negócio enfim de tudo né que aí também a gente acaba chamando de dependência Então são as dependências internas das classes do próprio projeto certo isso E aí fica fica até um pouco dúbio aí quando a gente vai falando né Acho que o bom entendedor aqui já que é um episódio já para para intermediário né O próximo vai ser o futuro do Spring aí que a gente já tá na na no roadmap né mas é é é legal a gente a gente entender essa essa parte aqui da daing Independente da tecnologia de de organização né pode ser maven pode ser gradle exatamente pref Grove é isso que que eu queria perguntar eu já já deixando claro aqui que nesse Episódio eu tô na cadeira de aluno né porque eu não sou jave vero e sempre que eu puder eu vou fazer uma piada para agredir um pouquinho o Java mas não se sintam ofendidos cara pega você pegou Você trouxe o o Johnson trouxe o Johnson é o bastão que o Marcelo anda viu o bastão de baseball é é a psicologia minha psicologia tá guardada aqui embaixo na mesa exato o quando a gente fala do desse gerenciamento de de de bibliotecas e dependências do Spring o que que ele resolve que o maven não resolve por exemplo ele garante né Valdir a compatibilidade né então se você tá na mesma versão e assim bom separar Spring de spring boot né quem tem essa isso é inerente do Spring boot isso a gente falou no primeiro episódio Mas é bom relembrar Qual que é a diferença Spring são os projetos né que dão solução para diversos problemas recorrentes né que programador tem no dia a dia então são Spring mvc nvc n é para para filas para tudo que você imaginar E o Spring boot ele é um organizador disso ele tem né Essa essa inerente dele isso que é garantia compatibilidade então se você tá debaixo de um projeto Spring 3xx e você não precisa no no maven no no gerenciador de dependência você não precisa nem passar a versão da biblioteca que você tá usando Porque você só coloca a biblioteca quando você usa aquela biblioteca ele já traz a biblioteca do pacote Spring gerenciado já e ali eh você garante que todas elas são compatíveis entre si então aquilo que o programador I lá colocava qualquer versão ele colocava um sei lá um um pacote qualquer lá para dar um suporte aí coloca o outro aí tem duas eh duas classes em dois pacotes diferentes Às vezes tem no mesmo pacote em dois jares diferente a mesma classe uma com implementação a outra com implementação B começa a dar aquela maluqui o programador Java tiver vendo a gente que falar que nunca adicionou dois Framework num projeto e não deu pau no log forj no SL Ford a isso Class cast Exception Class C Exception o é básico né É exatamente por isso então e por que que o mavin ele promove isso porque as dependências elas trazem outras end Então você tem uma uma transitividade entre as dependências né pô eu tenho lá o o vamos falar do próprio Spring né então eu trago o Spring data o Spring data por trás ele traz o hibernate só que eu não vejo isso certo Então essa é a magia do maven a magia do Spring boot que o Marcelo tá falando aqui né é que a versão das dependências elas são todas organizadas por um pai só n que é o tal do Spring e bicho e para quem trabalhava com servidor de aplicação no passado era começa né Valdir para te dar um gancho do que você tá falando pela a própria dinâmica de ser uma aplicação autocontida como eu não tenho servidor de aplicação eu não tenho por exemplo dependências dentro daquele servidor né todas as minhas dependências estão dentro da minha própria aplicação dentro do meu jar gerado no passado meu você tem lá um servidor de aplicação e cara você tinha várias versões é várias versões diferentes porque porque a gente colocava eh aplicação a no mesmo a Logic que o aplicação B que a aplicação c e elas er muito isso no jboss que você tinha que instalar as bibliotecas no próprio e E aí então você você tinha estratégias né para gerir as dependências você tinha lá ah vou deixar as dependências dentro do War vou deixar as dependências no servidor Class Loader né exato exatamente você tem eh eh e tem benefícios nas duas Pô você deixa tudo no servidor Pô legal fica mais leve mais comum nessa época era você ter um conjunto de bibliotecas homologadas corporativamente né quando tô falando de de Claro não é não tô falando de eboss que você instala na sua casa mas no no nível enterprise você vamos falar de uma empresa gigante tipo TIM Claro eh ou Eletropaulo isso então você tem aquelas libs homologadas E aí até por eficiência né você deixa isso no já já pré ladada dentro do do application server ex aí sua aplicação sobe e desce mais rápido né é mais enxuta né E você tem um certo controle sobre qual biblioteca que é homologado ou não né E você não vai ter nenhum WR com 50 GB exato mas mas tinha né assim depende depende da Estratégia da empresa Pô você tem WR com 100 me né E pior né você tem ears né que são aquelas aplicações que tem vários módulos tal grupos de de módulos né j jars e Wars na mesma é você tem JBS você tem jms você tem é Wars você tems vezes client tudo isso puf deixa a aplicação gordinha e e Poxa gerir a dependência disso era um parto então o programador de hoje em dia né sei lá dos últimos 4 5 anos não sabe nem do que nós estamos falando aqui Class loader para que que eu tenho não faz nem ideia do queer aí é o gancho que você deu no passado né ô Johnny Pô hoje as aplicações são autocontidas a gente pensa no num no microsserviço sobe um contêiner com com o jar lá dentro mas é importante assim pro programador Java mediano pro pleno já começar a pensar nisso porque cada dia mais a gente vem a gente vem tendo e novas oportunidades de usar as capacidades do Java né para ter performance para ter economia e aí a gente tá falando de um tema tão técnico tão estrutural assim e a gente viu há um tempo atrás até num num uma notícia que você trouxe aqui na na no podcast né que Poxa a WS ela tava mudando a estrutura das aplicações para para voltar a ser ali um pouco não monolítica mas modular né E então assim a gente precisa conhecer o Java B para programar o Spring B né o Spring que a gente tava falando aqui o Spring boot né ele melhora muito a produtividade de um time várias coisas que que a gente sabe que a gente teve que aprender com Java Class Loader questão de gestão de dependências de múltiplos módulos você para fazer uma aplicação trivial e até além do trivial não precisa mais saber mas a partir do momento que você entende desses conceitos e que você entende do Framework do Spring do Spring boot você destrava oportunidades de tecnologia muito interessantes você começa a construir coisas soluções na no Framework que você ganha uma aí a gente não pensa só em em performance do ponto de vista de de agilidade Mas você ganha produtividade flexibilidade também nas soluções que você faz quando vocês falaram aqui sobre a já está tudo amarrado numa grande árvore aí de de versões de acordo com conversão do projeto etc me lembrou muito a própria forma como o Linux gerencia suas dependências né com APT etc é então você tá naquela versão lá do do Kernel tal tô no Kernel 612 você vai dar um APT na aplicação você não precisa definir qual é a versão da aplicação que você vai porque você já tem um repositório que é atrelado a versão do kerne E aí ele busca todas as dependências daquela versão dos pacotes que são compilados para aquela versão do k né aí aí eu vou dar um gancho no que você tá falando V Um direto um gancho não dá um direto de dá um Direto você me D um gancho eu eu vou pro ti vai passar por cima d oaker é eu vou cair do outro lado da rua direto não ti mas ó se liga pô nós estamos falando muito da estrutura dependências né Outra coisa que o Spring boot traz aqui que também é uma boa prática que a gente tem que lembrar né os starters certo sim tava pensando tem a ver com configurações né que que são os starters a gente falou disso no primeiro episódio Mas é bom relembrar e falar do jeito certo de fazer é os starters no spring no spring boot né são pacotes algo que você pode importar no no no próprio P né da aplicação como uma dependência e ele por si só já traz uma configuração pronta para você você não precisa se preocupar já tem ali e configurações e você pode melhorar ajustar customizar só que ali você já coloc o simples fato de você colocar um jar n como dependência aquilo já te traz um mundo de compatibilidade por exemplo com vamos pegar aqui um cashing redis você põe o Starter do redis lá você não fazer mais nada ele já carrega driver tudo que você imaginar já tá e se vacilar ele já conecta direto numa porta Direta do primeiro que aparecer já é tão simples oerto aqui parece até Óbvio como é por que a gente não faz isso antes sabe em vez de você ter lá aqui Você tem 25 propriedades que você pode customizar o projeto Spring redis por exemplo exemplo que o Marcelo Deu ao invés de eu simplesmente liberar essa biblioteca e tipo dar uma uma documentação e falar ó configura essas 25 propriedades eu já te dou um defo ó isso aqui funciona para 80% dos casos assim assim assado o que eu preciso customizar é o que eu seto de fato nessas variáveis ah ah cara mas Python tem isso há muito tempo pronto mas mas o cara valendo mas o cara não mas o Spring boot ele ele não é de hoje né o Spring boot é de 2014 Isso já é antigo mas o cara da infra mudou a porta do Servidor lá você põe só essa propriedade o resto tá tudo na manga né ah o host Lógico que não vai ser o local host né mas aí você coloca só aquilo que você precisa o restante tá tudo já vem pronto né então E aí pegando o gancho que você tá falando né Marcelo porque assim o Spring Ele criou uma estrutura que vai beneficiando os próprios componentes dele né então propriedades né o Marcelo tá falando Poxa propriedade você coloca a propriedade aonde pô você pode colocar dentro de um arquivo texto no jar não é uma boa prática você pode colocar num um repositório Centralizado de de propriedades que o Spring gerencia a conexão para você com isso tipo um Key volt exatamente ele vai lá ele tem lá um no próprio Starter de Mas aí você precisa ter o o Spring Cloud para isso não é é o Spring Cloud é um conjunto for se for externalizado assim né se isso se for externalizado sim eh Spring Cloud ele vai ter lá um um eu esqueci o nome do Starter que faz isso mas ele se conecta nesse servidor de propriedades né É o mesmo servidor de propriedades do até no Git ele vai buscar do Z Keeper ele é el vai no e o e o próprio paradigma de programação eh por convenção é muito forte nesse ponto então você injeta por exemplo uma propriedade que você precisa utilizar que você quer externalizar dentro de um serviço primeiro ele procura num arquivo de propriedades interno depois ele procura no outro arquivo de propriedades externalizado e por fim ele procura no nas variáveis de ambiente que é por exemplo a gente tá trabalhando com containers é um é uma abordagem interessante procurando System também né então se você então se você entende como é que funciona essa hierarquia você não precisa configurar nada não tem tem que ter nada de application Loader sa Ele tem ele vai procurar aquele arquivo naquele formato por essa ordem eu posso colocar Def por exemplo a minha aplicação de valores que rodam pra maior parte das coisas mas quando eu preciso rodar num ambiente diferente que eu tenho preciso de mais memória por exemplo eu injetar essa variável de ambiente todos os ambientes tem 10 propriedades são comuns você coloca um segundo arquivo com um sufixo PR d de produção por exemplo um outro com hml o outro com dsv e ali naqueles caras você só você só sobrepõe o que você precisa para cada ambiente então ele meio que faz um merge né E além disso ele também tem uma como ele disse o o o Johnny né sabiamente aqui ele também vai buscar no System cara então você imagina o seguinte a WS hoje quando você seta aquelas propriedades ele joga no System do da VM lá do do da máquina Ah é É aquilo você coloca propriedade lá na WS já tá dentro do Spring o Spring já automaticamente sabe que aquilo é propriedade eu achava que mas tá falando do lambda ou de contêiner lambda Ah tá o lambda contêiner também serve tá é porque contêiner Você joga com variável de ambiente né e ele porque aí cai dentro do s l também tem a lâmbda também tem os enves dela lá que são iguais parece você coloca lá eh sei lá é pega uma propriedade aí server underline host host é beleza você jogar aqui o ele vai cair no System da máquina da maquininha né o sping já pega a gente então assim essa boa prática que a gente tá falando aqui né questão da da da externalização de propriedades né e a gente também falou que o Spring ele constrói várias capacidades ali para para ele mesmo utilizar no dia a dia né Outra capacidade muito legal é a questão de profiles então a gente tem a aplicação sendo construída lá no pelo desenvolvedor é isso é mágico falei eu falei e não expliquei profile né Fala aí F é não é justamente isso então o Marcelo tava falando da questão das propriedades né Ele falou que faz o merge mas ele faz o merge baseado o quê no profile que você ativa então o profile é uma uma um conjunto de propriedades que a sua aplicação vai avaliar em função do ambiente que ela está que faz sentido em determinado ambiente é como se fosse o escopo geral da aplicação né exato estou no na máquina do desenvolvedor aí eu vou como é que como é que o Spring identifica lá o profile Pô você passa uma variável de ente né menos d eh Spring Active profile acho que é isso aí você passa lá local pronto você consegue falar para teus beins olha mas se eu não passar nada aí você tem o defo né aí ele pega lá o o o
Cloud que a gente trabalha ambiente distribuído é teste você vai rodar um teste ah não vou a uma grande premissa né que eu vejo que é importante quando a gente fala de CCD quando eu fala em desenvolvimento em geral produtividade vários problemas que a gente pega pós desenvolvimento né E pré-implantação são divergências entre o ambiente local ambiente de desenvolvimento como é que a gente como queira chamar e o ambiente de produção Beleza então a premissa de de um teste bem executado princialmente teste integrado teste ponto a ponto é que seu ambiente de teste tem que ser o mais parecido possível com o ambiente produtivo Porém você tem e e principalmente o código tá testando tem que ser o mesmo código né como é que você resolve isso né como é que eu vou testar uma uma uma aplicação de microserviço sendo que os os outros serviços não estão rodando profile no meu profile eu consigo mocar e consigo gerenciar esses mocs de uma forma muito mais efetiva e levantar algumas versões de classes classes de configuração classes de de integração específic pro meu teste Mantendo as minhas classes de implementação de regras de negócio como el como elas são hoje em dia pergunta vem bem bem bem besta essa pergunta o o [ __ ] velho besta é não fazer pergunta fala a verdade toc aí você é o cara você mano assim é é impressionante né a gente precisa perguntar né velho senão a gente não mas o o o profile ele vai além de só variáveis de ambiente ou não porque o principal uso que eu vejo é esse tipo no no não pensa só eu tenho um profile que eu coloco na minha aplicação e ela ela vai mudar o o ambiente o contexto que ela está né então o Johnny acabou de dar um exemplo na situação de teste Mas pensa só eu tenho a aplicação no ambiente de desenvolvimento então eu tô no contexto de desenvolvimento eu tenho urls diferentes Então mas assim esse é o ponto que eu quero chegar tipo o quando eu mudo esse contexto isso vai além do que Anes de ambiente vai muito além vai muito além essa é a pergunta porque vou ter o r diferentes eu vou ter coisas que são personalizáveis de acordo com o contexto Mas isso seria facilmente eh resolvido se sei lá na na época com arquivo diferente um arquivo diferente ou sei lá se faz a leitura de um TXT e carrega isso nas suas constantes entendeu então você você e o bom de falar com você que você é inteligente para [ __ ] cara serou o prego na cabeça o o o ponto é assim ó é Ipa eu tenho eu tenho lá um contexto diferente né nesse contexto eu preciso de uma classe que se conecta com um banco de dados H2 em memória memória é um banco diferente de um Oracle que é o que eu ando que eu utilizo do banco de desenvolvimento ou um banco de dados RDS que é o que eu uso em produção na Cloud é um um Oracle hack né que sei lá eu posso estar usando uma uma capacidade específica dele n posso mudar inclusive os drivers que eu carrego eu posso ter um contexto literalmente da arquitetura da aplicação diferente em função do ambiente só que isso fere só que isso fere os 12 fatores né E aí é um ponto que eu ia colocar o Spring boot ele é um um grande habilitador dos 12 fatores eh ele foi feito para te falar para te facilitar a vida de ir para CL masir O que são os 12 fatores mais botini o botini né botini botini qu são os do fatores fatores Ah eu só queria fazer um parece que mais ou menos né Por exemplo você mudar a arquitetura da aplicação em homologação e desenvolvimento é ruim mas o caso que o Johnny deu teste é bom o teste é bom você tem um banco em memória por exemplo T ISO a gente vai falar bastante teste mais mais pra frente a gente vai falar disso agora não dá para eu ter um um post Green homologação e um h com impr produção vai dar bosta não não é para assim não é bom não é indicável né Mas vai ter caso por aí viu é ah sempre tem por exemplo por exemplo aconteceu esses dias de para acessar um api localmente Obrigatoriamente o o dono da iepi me obrigava a passar por um prox garantia de segurança local daqui local é teste daqui para acessar lá na no hml dele por eu tá fora da rede coisa tem um proxy lá tal isso aconteceu lá veja que ele não é inocente inocente Inocente né É É aí lá no servidor no hml hml mesmo lá na nuvem não precisava não tinha que passar para fazer essa perna lá né lá ela tava dentro da mesma rede dois Beans que entregavam o rest template um configurando proxy o outro sem configurar com ara com profile dizendo se eu tô no hml pula a parte de né se eu não tô então entrego um bim ou outro né então o Bin de lá não faz sentido eu ir na na China e voltar para né Então esse é um caso que resolve S isso é legal porque quando a gente fala da arquitetura como um todo né eu posso manter por exemplo meu contêiner imutável passando por vários ambientes Então eu tenho a garantia de que a mesma aplicação o mesmo build que tá rodando com aquele contêiner com aquele hash que eu testei homologação só que eu seto profile diferente e mudo o comportamento da aplicação de acordo com o ambiente que ela tá sem mexer uma linha de código perfeito então então a gente tá falando aqui dessas boas práticas né E aí eu eu dei o gancho aqui da 12 fatores 12 fatores né e o joh com a voz dele do botini do botini ele ele per O que são os 12 fatores mastini e os 12 fatores são o conjunto de boas práticas que a comunidade Cloud desenvolveu avaliando um monte de cagada que o mercado faz er iso é quase um manual do que não fazer né Exatamente é então assim eles não são tudo que a gente precisa cuidar para ir pra Cloud mas são bastante coisa tá eh então esses 12 fatores fala Poxa externalize o amb externalize as propriedades utilize um repositório por aplicação faça vínculo de porta eh eh assim são são n é eh utilize a a evolução do do do teu ambiente como versão também de código né então são são conjunto de de de fatores que você deve seguir para quê para ter uma aplicação que que se instala bem em Cloud seja ela qual for Inclusive a tua Cloud privada né e assim ah mas é só para microsserviço não não é só para microsserviço uma aplicação é modular e orientada a domínios uma aplicação monolito medium serviço também serve medium Serv é é mini mini serviço mini serviço micro medi micro é 10 a men6 né mini mini é 10 a menos tr Esse é um ponto importante E a pessoal acha que Cloud Native é só microsserviço não não você pode ser Cloud Native com para pagar se você tiver dinheiro para pagar pode po você pode ser Cloud Native com aplicação gigant é tem só botar asa né Eh eu gosto gosto desse assunto pelo seguinte a gente fala pô mas tem Tem essa tem muo essa discussão de microsserviço agora tá sendo colocado em cheque gente a gente tem que pensar que a nuvem ela é bilet por consumo se você tem uma aplicação que ela tem picos de consumos diferentes você escalar de forma diferente e aí não faz sentido você escalar coisas que não são necessárias num grande monolito então a arquitetura de microserviço além de atender o próprio fluxo de desenvolvimento com equipes Independentes é para que você consiga escalar domínios de negócio de forma diferente pensando em clente no fim das contas é entender o que você está fazendo né quando a gente discute sei lá meu banco tem que ser Cico ou no Cico meu cara amigo você tá construindo um backend lambda um backend seress se ele vai se você qu tá conso que ele vai ter que escalar infinitamente só basta tem que ser nocio se você não tá fazendo isso eu col qual exatamente a sua motivação né db2 IBM Qual que é a sua motivação para colocar uma uma base que ela não é facilmente indexável que ela é uma o pessoal acha engraçado porque eu conheci pessoas já que pensava que é muito mais fácil por exemplo criar uma base no Dinamo que não precisa ter um ddl né ali fixo falei cara lá que você tem que pensar muito melhor como essa informação vai est agado porque não dá para fazer qualquer query que você queira e recuperar o que você precisa e o inverso também é verdade Quantas vezes a gente já não viu Nessa nossa vida aí de desenvolvedor o cara tem um uma um contexto só de informação aí ele pega aquele contexto de informação ele faz uma [ __ ] do MOD uma modelagem de faculdade de faculdade sabe com 50 tabelas todo nas nas três regras normais lá tudo direitinho e aí quando ele consome o dado ele sempre faz uma query gigante e ele sempre consome aquela mesma query Por que que não faz um document driven que já salva todo o documento de uma vez por que que aquilo tem que est modelado Por que que aquilo tem que estar e separado normalizado normalizado PR que por que que você tem que normalizar aquela base se você sempre vai consumir ela no formato de documento Mas eu cortei o Valdir agora fiquei curioso como é que o os profiles eles quebram os trv factors V Não não é que eles quebram eles habilitam né Isso tava falando né na verdade eu me expressei errado eu que tava falando de como você pode às vezes subir umas classes Diferentes né você falou é também tem que tomar cuidado com isso aí né Isso é porque isso pode quebrar de fato eles habilitam habilitam a palavra é habilitar né e o Spring boot ele ele habilita assim ele é fenomenal para para você pensar Poxa na verdade você nem precisa pensar né É É Tão natural quando você escreve uma aplicação Spring boot que ela vai est aderente aos 12 factors que hoje em dia as pessoas nem sabem mais que que é isso né porque o Spring boot ele ele ele cria essa essa abstração muito forte né o Spring boot ele te entrega o normal né cara ele faz o ele faz o excepcional virar normal e se você só precisa fuçar muito se você precisar do excepcional exato lembro que eu eu li um artigo eu li um artigo lá em 2008 que tinha un pessoal falando É que pessoal acha que Spring essa maravilha to to né outros grandes desenvolvedores né de outros frameworks né O Inverse of cont control foi inventado muito antes e o pessoal do Spring falando a gente nunca alou que a gente inventou nada do que tá aqui Inverse of control dependência inje que não é a mesma coisa mas é parecida não a gente pegou e colocou aqui no no nosso Framework porque a gente acha que é muito interessante mesmo e todo mundo deveria fazer desse jeito é é só uma organização de boas práticas Todo mundo começou a fazer porque virou o spec do Java né e é o Java puxou o Java copiou muita coisa de spring muita coisa cara muita coisa impressionante mas assim né a gente tá falando aqui de de spring para [ __ ] a gente tá ainda pô falando de estrutura né mas assim eu acho que um ponto importante de histórico aqui que o Marcelo Marcelo e eu nós vivemos esses dias aí inclusive e pô Spring boot ainda ainda não é Bala de Prata velho a gente a gente tem é uma questão de quantidade de memória né associada ali de de inicialização né que a gente a gente precisa olhar com muito carinho né então então o Marcelo e eu a gente est fazendo uma aplicação né para uma uma empresa de cosméticos maior do Brasil a maior mais importante e a que e a mais cheirosa a mais cheirosa que todos amam começa com n e termina com a é exatamente é bemar bem viu Inclusive eu tô usando Inclusive eu tô usando um perfume da marca Claro porque são os melhores que nós temos Vocês estão sentindo quem tá maravilhoso mas o o o aplicação cara a gente falou [ __ ] vamos meter aqui um um Spring boot no começo porque aí ele vai pegar vai receber um monte de requisição e já vai est um um e esse esse essa aplicação no começo era uma lâm né E aí a gente vai ter escalabilidade para [ __ ] e aí a gente bota numa fila e depois essa fila vai passa para out as lâmias que vão consumir mais escabilidade resiliência pô se tiver erro já o tópico lá da da WS já manda pro outro dá para dlq a dlq já processa e a gente fez isso e funcionou só quando a gente começou a a a ver as outras questões né poxa monitoramento é disponibilidade eh essa aplica essa essa esse componente Inicial né que que expunha serviços fez mais sentido a gente botar ele e num Spring boot convencional sem ser em função né mas você tava usando função em dentro do próprio Java é eu tava eu tava usando função do lambda é com Spring boot as functions e dentro da function era Java rodando e Spring isso Java rodando e Spring E aí Spring boot E aí a gente fo mas era sem contêiner né Sem conero lemb da mesmo e aí a gente falou Poxa cara o volume de acesso é tão grande eh a gente vai ter tanta coisa rodando que para mim vale mais a pena financeiramente tempo de Startup botar num contêiner e a gente pegou e botou isso num contêiner e você pode rodar um contêiner no lambida também agora né Exato eu não sabia disso não pode pode subir um contê né É mas aí mas mas aí acaba as coisas acabam ficando mais caras né o problema o problema mas facilidade É mas o lâ agora ele funciona mais ou menos igual Cloud Run do gcp você pode subir lá e dá um play no no teu no teu contêiner e ele vai rodar né só que você vai est locando Aquela quantidade de memória do contêiner e rodando como se fosse uma função aí é melhor Às vezes você tem um SS pequenininho exatamente o ss inclusive ele você não tem nenhum orquestrador né ele a a WS se vira com com com orquestrador eu ainda prefiro o o o W2 eu achei que não o g o GK Ah é o gke eu eu fiz umas provas de conceito com computação confidencial no Google e e a WS né que meu o gke assim gke é uma é assunto até para outro podcast sim mas é feito pelo pai né o kubernetes nasceu lá dentro do Google não tem como podcast de aws versus outras clouds eu quero participar também eu quero fazer rinha de vendor quero fazer um episódio rinha de vendor cara da w hoje em dia que eu entendo a hoje em dia que eu entendo a WS e eu falo meu os cara às vezes vende uns Pat pra gente que é tá falando da WS né do rest service lá do rest service isso aí depois a gente também teve um problema que foi o seguinte né a gente tava com Spring boot dentro do lambda que tava demorando um pouquinho mais para subir e aí que que a gente fez a gente Teve que tirar o Spring boot né é e tinha uns requests que poderiam vir de outro cliente eram são dois clientes principais da CPI um é mais magrinho request mas tem um que mandaria request requests cavalares né e a gente ficou preocupado de soup era soup É isso mesmo e animal assim não era soup só soap era soup com XML de XML registro é cara eu eu já sou meio radical Com essa parada a XL mls não tá batendo aí não funciona não é é quem cha era quem chamava pi era sap sap então não tinha como Mud posso fazer uma crítica de amigo assim porque sou não e eu vou te falar o seguinte se você for falar de Python aí você nem ia conseguir processar nem não ia nem terminar de desenvolver mas Inclusive a gente vai cortar tip então Python você corta eu poderia falar que Python faria isso muito mais fácil mas eu não vou fazer isso mas talvez IMP eu eu eu tenho assim não é uma regra sabe mas eu tenho para mim que para trabalhar com functions qualquer qualquer Face que você for usar se você já tem que instanciar um Framework E você tem que fazer alguma coisa que não seja você não resolveria com script let Eu acho que já não é o caso de uso de um Face é F né exato Então tem que ser script let cara é é um script estruturado eu acho que é aquela é aquela aquela planilha que você tem que fazer a hora que você quer subir um uma aplicação um serviço é duro pagar por é então você quer o qu Você Você Você Precisa da da função ela é tem que ser escalável ela é pequenininha ela é aut conti ali faz in function igual o Valdir falou a gente já sabe que vai ter uma carga a gente já sabe os horários que a gente precisa que isso aqui funcione a gente Inclusive a gente já tem o domínio tecnológico disso sobe um contêiner no Eks sobe um Fire Gate mas não parou por aí né não a gente a gente ainda então eu falei bastante aqui da da primeira movimentação aqui n foi que foi uma uma aplicação né que tinha dois end points um era soap e o outro era rest né Então essa aqui ela ela deixou de ser fun a lâmbda talvez não aguentasse a o tamanho do payload que entraria exatamente então a gente transformou ela em container E aí depois a gente teve um outro cenário que foi foram as functions que faziam processamentos pequenos que cada um dos registros é a gente pegava lá sei lá 20.000 registros que o Marcelo falou quebrava em um registro por vez botava no no SNS SNS E aí depois a fun processava isso e m um por um né M um por um exatamente só que que que a gente viu ali né a aplicação o jar né do Java tava dando 70 m do Spring boot aí o pessoal lá começou a encher nosso saco falando Ah não os caras só pedindo educadamente ningém ali ninguém enche o saco de dinir não precisava diminuir o tamanho desse jar aqui tá muito grande 30 me cara não precisava diminuir o tamanho do J WS aceita lambda de 150 m hoje hoje tá indo PR giga né meu os Car mas o mas eu concordo né P monitoro você precisa mandar apagar as versões anteriores né se você não não colocar lá para ele apagar você tem mano 70 m é um app de celular vagabundo eh era isso mesmo Aí a gente pegou o que a gente fez [ __ ] arrancamos fora o Spring boot e a o jar ficou com 10 megas os 10 megas eles vinham das depend w sabe quanto ficaria com python só o jar só o jar com as nossas classes javas dava 4 5k tá então assim vem muita dependência E aí é um problema do Java né que eu tenho eu tenho bibliotecas muito grandes momento solene o Valdir assumiu um problema do Java é que assim não é do Java né são das apis que são escritas em Java mas as bibliotecas são grandes né se a gente esse bibliotecas menores a a gente talvez tivesse eh pacotes menores também mas o ponto é então a gente fez essa alteração e E aí a gente conseguiu eh eh diminuir bem o tamanho da da da das funções né E e aí a gente acaba mudando aqui um pouco o foco né porque poxa a gente teve essa mudança a gente fez mudança grande por eu tirei Spring boot e programei Java na na linha de código lá mas a mudança foi rápida acha que Pergunta aí saindo até um pouco do escopo técnico você acha que o Spring deixa o programador já meio acomodado com essa 100% cara [ __ ] 100% e é essa intenção Inclusive eu podia fazer aqui um um RL request aqui instanciar e tal consumir não é legal pô mas aí eu vou lá e o rest template o cara nunca não sabe nem como é que funciona uma rest na vida não sabe o que que é Método o que que é o RL ele faz e sai que é gdp do sei sei que é protocolo né de comunicação de D http htp 1 2 é tls não sei cara que que é http header é aquilo que o rest template pede para colocar lá exato aí é o aí aí é o cara que aí o cara que faz tudo locar quando ele toma um SSL handshake Exception lá não sabe porque não tá funcion notro ambiente exatamente Spring boot nunca perdiu isso não mas isso é isso é E aí a natureza dele né ele foi feito para para isso e e o programador ele tem que ir além né mas o o o ponto que eu tava trazendo aqui é pô nós fizemos uma alteração estrutural gigante tiramos um framer colocamos Java puro ali para poder fazer até fazer esse tipo de requisição que você falou entendeu htp Connection é open Connection pá passar o RL trata erro de de rede né Eh fizemos fácil cara por quê Porque a gente usou o design correto e aí eu acho que a gente começa a falar um pouquinho de outros tipos de dicas aqui né que é são são dicas orientadas a design pô hexagonal exato então o ponto é o seguinte programar Spring boot nada mais é que programa Java direito então e ele te ajuda muito mas se você não programar direito vai dar merda como é que a gente fez essa alteração né tão rapidamente a gente antes de começar o projeto né a gente falou Pô como é que a gente vai organizar nossas classes como é que a gente vai vai organizar os conceitos aqui pô vamos pensar no cin code né E aí a gente a gente usou a arquitetura exagonal para começar a desenvolver então toda essa alteração cara para quem não conhece o que que é a arquitetura exagonal é um conjunto de ideias né para você estruturar seu código eh orientado a camadas né de eh pensando assim camadas internas a externas aí você vai protegendo seu código anteriormente eh a gente a gente usava os três as três camadas né Model vi Controller E aí a gente parava por aí então você tinha um monte de service você tinha um monte de de de de de classes de negócio arquivos de negócio tipo pedido service P tudo de pedido lá dentro cara classe para ficar com 7000 8000 linhas era era comum né então você tinha que ir criando Novas Novas classes parecidas tinha uma camada só de negócio né exatamente como se uma classe do Java hoje fosse uma uma função Não é nem camada Ô Wellington é é uma questão de não queria entrar na palavra exata mas AF das contas Isso é questão de domínio mesmo sabe sim questão de se você olha sua aplicação ela tem duas classes Obviamente você tem uma aplicação de pedido tem a classe pedido a classe cliente tem 5.000 linhas cada uma e o resto das classes tem 100 tá alguma coisa errada você precisa dividir de uma outra forma isso e e a gente trabalhava assim e inclusive é muito comum em vber por ela trabalhar com um viés muito de modernização de aplicações ela vê isso muito eh aplicações antigas elas TM lá pô 8.000 linhas né 9.000 linhas eh e aí a gente falou Poxa cara vamos fazer direito né então vamos vamos usar o Clean code cada classe respeita uma operação Ah E aí isso é novo não pô não é novo isso é esse é um conceito antigo lá do Single responsability né quando o pessoal fala eh Sid né são cinco são cinco princípios arquiteturais para desenvolvimento de software Mas de fato tem muito mais do que esses cinco ainda né Eh mas o mas o cin code ele ele eu uso muito desses desses eh cinco caras né então a gente foi separou Nossa aplicação em em em caso de usos né que são são operações específicas a gente a gente separou em portas que são eh camadas é é uma relacionamentos externos né Exatamente são relacionamentos externos separou em em classes de adapters que são classes de entrada quem me chama e Pô bicho quando a gente ti teve que fazer essa alteração foi ah vamos mexer lá no nas entradas por quê Porque entrada Agora não é mais orientada em Spring e a gente também vai mexer nas portas por quê Porque as portas vão ter que chamar diretamente as classes do do dos componentes né mas mas foi muito bom muito rápido cara zero bug zero bug cara zero bug não é cascato zero bug e sem Spring sem Spring mas com Java mas com Java e meu vou falar as lâminas tão rápidas é monstruosas monstruosa cara é porque é porque o Valdir não usou esse termo exatamente mas Spring boot não é uma bala de prata é uma bala de ouro é se você fala se você der Cord ele vai falar que é uma bala de Diamante não mas não é em todo adamante não é em todo buraco que a gente vai enfiar assim porque tem que enfiar não a gente tá tá tem ele tem uma grande aderência às boas práticas de de de desenvolvimento Java desenvolvimento em geral não mas aqui nós estamos numa mesa com quatro arquitetos que sabem que você não tem que ter amor exceto Valdir Valdir teria muito amor o que aconte você v trocar uma lâmpada que você nós estamos na televisão do Brasil aqui galera olha só hein e E aí você vai sempre procurar A melhor solução pro melhor para aquele problema né eh e e não resolver sempre com a mesma ferramenta né mas eu acho que existe meio que um amor no mercado do desenvolvedor normal padrão de resolver tudo com Spring [ __ ] sim é verdade é é justamente isso você pega uma aplicação um molequinho novo aí Ah eu sou arquiteto eu sou o [ __ ] das galáxias aí você bota numa tenho 25 anos sou Senior quando eu sou arquiteto aí você bota lá numa empresa robusta que pô fatura sei lá 40 milhões bilhões por ano que tem 12 times trabalhando na mesma aplicação exatamente aí você fala para ele pô cara isso aí não isso aí é o que você faz hoje mas eu tenho um software aqui que me dá 40 bilhões por ano e há mais de 20 anos e aí eu vou jogar tudo fora você tá ficando louco então assim Spring não é Bala de Prata Spring não é é não não é para eh eu não tenho que mudar para Spring para para ter uma boa aplicação né enfim sim mas é uma Mas é bom é bom ajuda 200% é que eu acho assim sobre o Spring a minha visão é que é a melhor alternativa que a gente tem quando tá falando de de estrangulamento para aplicações legadas que são do do mundo Java Sabe sim então você tá lá segregando seus domínios tá eliminando ali o teu monolito e você não quer ter uma fricção muito grande na equipe de desenvolvimento tipo o cara que o cara que tá ali programando no web Logic e você apresenta o Spring para ele a cura de aprendizado não é tão grande ele vai ficar feliz e se ele consegue fazer uma segregação de domínios aos poucos dentro do próprio time você consegue estrangulando e modernizando aquele legado quero falar com você agora quem ainda não conhece é Clever Clever é uma empresa que já tem mais de 3 milhões de usuários em 30 países com 30 idiomas diferentes que T trazido Soluções em blockchain criptomoedas e ativos digitais o objetivo da Clever é te dar liberdade financeira para operar nesse mercado de cripto então se você acredita nisso se você acredita nessa Liberdade você já Pensa como a Clever vai conhecer os caras é Clever ponio estão contratando também pessoal para trabalhar com crypto com blockchain então se você tem interesse se você tem conhecimento nessa área procura Clever se você gosta de criptomoedas se você opera no mercado você precisa precisa conhecer a Clever precisa conhecer as soluções da Clever então o endereço tá aqui embaixo no vídeo para quem não tá no YouTube é Clever Vai lá vai conhecer que realmente é um mercado sensacional a questão de você utilizar o Spring no no ambiente de de desenvolvimento de software é a mesma questão que você faz quando você olha pros factors pros 12 fatores de programação se você entender muito bem daquilo você tem que entender completamente cada um daqueles fatores eles se todos eles se encaixam em toda a situação não mas a a exceção ela é exceção mesmo para você tem entender muito bem Aquele fator que você tá tirando para entender onde que ele não vai ser usado se a gente tá falando assim no na média de problemas de de de de aplicações corporativas Ah eu acho que essa que aqui o o Spring boot não se encaixa aplicação Java cara tem que ser exceção o valdin falou um caso muito específico de de de uma de uma prerrogativa né de ali de de algumas requisitos não funcionais que não não foram cumpridos Sabe porque Porque de fato é é é um pacote de boas práticas que já vem para você assim Sim sim eu concordo é é que quando a gente fala do do não só o Spring boot mas a própria Framework Spring como todo né Ele é muito aderente nesse processo de modernização que a gente tá falando né sim eh Principalmente quando você pega aplicação que eram monolíticas de grandes application servers e você quer tornar isso dentro do contexto Cloud Native etc e aí Independente de ser Spring Claud não mas dentro do do contexto containerize dentro do monolito Spring é muito mais fácil para para você quebrar ele não até monolitos que não são Springs né você pega sei lá um JSF por exemplo né e E aí você tem lá um um RP feito nessa [ __ ] por exemplo que a gente encontra por aí rodando em jboss web Logic etc você vai modernizar isso faz muito mais sentido você ir levando isso já no modelo hexagonal segregado por api com Spring boot respondendo como serviço com outro contêiner com com um Spring mvc por exemplo eh fazendo a a camada de de apresentação falando com microsserviço etc porque aí você moderniza a não só a arquitetura interna da aplicação mas a arquitetura da solução e sem fricção com time de desenvolvimento que já tá acostumado a trabalhar com Java entendeu E você aproveita igual o Valdir tocou bem né qual que é qual que é a camada que que cresce que fica inchada é a camada de negócio mas é a camada mais valiosa da aplicação é onde tem todo a empresa funciona H 20 anos aquela camada ali tem todo a propriedade intelectual daquela daquela aplicação né e a gente consegue preservar essa camada a gente muda o qu muda a interação dessa camada e a forma como essa camada organizada com outras mas mantém essa E aí a gente tem alguns aceleradores o Valdir e o Marcelo conhecem muito bem aqui podde até dar dar uma palinha mas por exemplo você pega um monolito web lá super antiquado rodando em em JSF por exemplo primeiro passo para você modernizar esse cara é mais Car e service né Então você vai ter que expor Todas aquelas suas camadas ali de regra de negócio que estão in trincadas dentro do monolito você vai ter que expor ela dentro um rest né E aí o Spring te facilita nessa transição de além de você quebrar os seus domínios você levar isso para uma arquitetura que exponha a regra de negócio para fora da aplicação né porque você ter começar a expor o resultado dessa regra de negócio para fora do do do contexto da aplicação para um contexto de de de serviço etc porque aí você vai levar sua camada de aplicação para um outro contexto para outro contêiner para outra aplicação né e isso é muito comum né você no processo de modernização a principal dificuldade de você quebrar um grande monolito é você expor a regra de negócio como serviço né porque isso é muito raro nos nos monolitos né os monolitos não era tudo a na própria P do Java internamente ali né você não expunha isso era ele para ele mesmo era ele para ele mesmo mas acho que acho que Java ele foi lá no começo né ele pô ele trazia mesmo que dentro dele a criação das interfaces ele tinha tecnologias Diferentes né ele tinha o JSF ele tinha o jsp então ele não deixava a lógica de negócio nessa parte da visão né acho que é isso que tá querendo trazer aqui né o E aí a gente consegue fazer isso mais facilmente isso exato você já tinha uma seg da regra de negócio fora da própria linguagem já te pedia olha tenta fazer isso mano é melhor é melhor segue assim né mas você sabe a parte que eu acho que ele tem que que ele bate mais o martelo assim que eu acho mais legal que é uma parte que me interessa bastante testes automatizados Ah você instala uma aplicação Spring boot ela cria um pacote testes lá e teste research você ignora se você quiser mas ele tá lá criado já e mano que todo mundo todo mundo fala da importância do professor da faculdade não sabe nem que era aplicação web na vida fala não tudo sai mais barato quando você resolve na camada de desenvolvimento mas na prática a hora que tá que o deadline é semana que vem né o primeiro que manda T tem o gráfico né de de solução né das boas práticas a minha favorita que o Spring mais facilita favorece favorece é a parte de testes automatizadas essa parte do Clean code também eu não preciso mais usar de unit não muito pelo contrário né você usa ele né e e o Spring ele te o Spring te ajuda a usar ele e essa técnica também do de design né o Clean code ela te ajuda a construir classes que são testáveis muito melhor e os moques são facilitados trabalha com Interface o tempo todo você Moca interface Moc cável né puramente mocel Aí você você então assim o design que a gente tá falando aqui ele é fundamental Pô você tá escutando a gente aí Studio in code cara de verdade muda a vida assim eu comecei usando eh faz uns sei lá uns 4 5 anos uma aplicação Zinha que eu virei pro pro desenvolvedor Ô vamos estudar Isso aqui vamos tentar fazer essa aplicação zinha aqui usando Clean code foi lá na seguradora foi foi E aí eh bicho falar de alguma E aí a gente começou a usar começou a usar e cara você você vê o poder né de uma mudança tão pequena você vê o poder quando a gente for falar de teste a gente vai falar das camadas a gente vai falar de pirâmide de teste faz toda a diferença né mas mas trazendo ainda pr pra parte de design né E essa questão da da Olha só um episódio só de testas com Spring boot nada impede imag dá muita coisa dá muita coisa mas quem comanda isso aqui não sou eu né é o tio não a a trilha de spring boot é toda biv vocês que mandam e e a gente tá falando aqui da da da do Code né então assim muito importante a gente a gente outra dica aqui né vamos vamos contextualizar né outra dica é na hora que a gente tá falando dos adapters do da sua aplicação Pô o que que eu tô colocando nessa camada cara é conversão de protocolo não coloque regra de negócio lá pelo amor de Deus não pera aí agora eu tenho que fazer um parêntese se o cara tá colocando regra de negócio num adapter [ __ ] aí tá ferindo design pattern lá do começo independente do do Framework cara iso é isso is é a preguiça né velho é a preguiça a preguiça se você pegar qualquer [ __ ] eu fiz faculdade quantos anos faz tempo hein Faz tempo essa barba aí nem existia ainda não existia nem agora ela ela é branca ela já foi preta e na ela não exis não existia não existia exatamente exato e isso é o padrão do do do do Design não importa a linguagem não importa o o o mas mas o ponto é até hoje você vê muita aplicação eh com com esse tipo de problema pô lá no protocolo né o cara recebeu uma requisição o cara mete lá um monte de validação chamando um monte de coisa diferente eu não põe isso ali bota na outra camada Você tem o o BFF lá que ele verifica se é app ou se é web pera aí pera aí coisa errada nesse BFF BFF nada mais é com adapter né de de certa forma é então mas mas esse que é o ponto né a gente às vezes coloca como boas práticas Framework negócio deveria ser boas práticas de tudo né mas o Spring é muito isso o Spring ele é tão poderoso e o Spring boot consequentemente de trazer o Óbvio de destacar a maravilha que o Óbvio traz pra nossa vida de como um desenvolvimento quando você segue exatamente o o design que o valir tá aqui demonstrando Como que o seu desenvolvimento fica melhor e é umair usou a palavra usou a palavra adequada é uma questão de aprendizado uma questão de você pegar e implementar mesmo porque que tá fazendo na casa dele às vezes parece um Overkill sabe [ __ ] eu vou fazer n camadas aqui para para fazer um negócio que eu faria numa classe só com 50 linhas mas é quando você tem um Framework já traz isso Pronto né e o problema overc quando você mata o cara duas vezes B bate de novo mas é que o fato é esse é quando você tem um projeto grande você fazer um grande setup do de todos os teus patterns de código tal é muito complicado do zero né E aí faz muito mais sentido você ter um Framework que já traga isso tudo organizado para você e esse é o grande trunfo do do chega o Óbvio ali chega o padrão né Aí se você precisar do da exceção cheg você vai lá e altera né Altera a configuração você pode mudar qualquer autoconfiguração dele e ele fala na sua cara tem certeza que você uma exceção mesmo meu truta não é você que tá fazendo alguma coisa de errado aí você não tá pensa direitinho pensa direitinho né aí aí a gente tá falando aqui [ __ ] do do Controller né então é Controller conversão de protocolo ponto a recebeu a processa ali vê se ah dado que era obrigatório veio e tal não tudo veio veio beleza bota pro pro caso de uso processar então pô o caso de uso vai pensar em regra de negócio um monte de classe bonita com regra de negócio da tua empresa falando do negócio da tua empresa os termos são da sua empresa né né e Pô isso é um um é a parte de service @service lá do Spring né você escreve em inglês Valdir as casas eu não gosto Cara você sabe o que Eu Odeio escrever código JAVA em inglês assim eh pô já trabalhei em paa que escreve em inglês e E aí você vê aquelas coisas né tipo A e carteirinha né o código da carteirinha da pessoa aí você vê lá escrito Little Wallet Ah cara putall é é assim para escrever em inglês desse jeito p faz sentido né bicho Little Wallet é até até o holder card para mim já tava esquisito já mas o Little Wallet a acaba com a minha carreira cara eu eu eu realmente assim eu eu gosto de escrever código como eu trabalhei mais em aplicações que eram feitas por empresas brasileiras né small sources Você lembra do small sources teve aqui com a gente small sources veio aqui o nosso colega fontinhas né a gente Transform Moa no small S isso e então eu eu gosto de escrever em português mas enfim né trabalho com Fields agora né com Fields o campus Ah já que vai ser tudo em inglês e E aí bicho é então a gente tem lá a camada de serviço e você coloca as regras de negócio lá tal bem bem escritas né que a gente consegue portar inclusive de frame diferentes né então pensar bem aí nessa questão do do do do Design né quando você tiver falando de de de @ Services né e também da mesma forma a gente leva isso lá pra camada de repository né então pô tô falando de repository tô saindo da minha aplicação a camada de portas são as portas né tem o porta para repositor tem o porta para para soap porta para redis Dynamo exato para Dynamo Então tem que tem que colocar essas coisas nos lugares certos Para quê Para que se porventura eu troque de uma Cloud para outra eu não afeto todas as camadas do meu código e é uma abstração acima do próprio da exatamente só os mais antigos hoje hoje em dia a gente não usa muito mais o da né porque eu tenho lá os frameworks hibernate por exemplo que cuida do da para um banco de dados RDB dbms eu tenho o os próprios sdc da da das nuvens das nuvens para Cuidar dessa comunicação né com com servidor próprio dela ali de de de de dados né e e e ainda mais Cara eu tenho uma maravilha que hoje chama Spring data né que Poxa eu faço uma query escrevendo o nome do método eu ia falar isso velho como como ele joga como o Spring joga a o repositor na sua cara a obviedade na sua cara você escreve um método que chama get clients by id não precisa escrever a query el fala mano se você chamou seu método disso é porque você quer os clientes pelo campo id e basta que o repositório tenha teja o mesmo nome ele já resolve tudo exato então aí evita que aquele vagabundo fala ah eu vou chamar meu meu meu aqui de sei lá Acha nomes o o esing Ach Fulano pelo código exato acha acha pelo código E aí o Valdir quer fazer em português ele não vai entender nada Vel Se vacilar Se vacilar faz até isso aí Se vacilar sabe que eu faço eu vou lá no spring pego lá onde ele cria os termos e altero para português brincadeira Ah mas aí o cara fez o Spring né sabe perguntaram isso no primeiro episódio falou o valdiro ele ele participa da criação do do do Spring que teve uma hora que você deu uns 10 minutos ali de de super Hit combo falando do da estrutura interna do do Spring que os caras falou não não é possível o cara ele é contribuidor do projeto não é possível é eu acho o design do Spring é a coisa mais maravilhosa do mundo você quer aper programar de bugas classes do Spring cara é impressionante como é bem feito aquele negócio teve uma vez que o Marcelo e eu a gente tava a gente tava fazendo uma extensão do Framework de mensagens do Spring né E aí a gente falou pô tá vendo aqui ó a gente só vai fazer Ah vamos colocar essa classe em tal em tal lugar que vai dar certo né web sockets era we socket é era web socket isso mesmo e cara o Spring era tão tão [ __ ] assim que o cara tinha uma validação para saber as posições das propriedades que tinham sido colocadas e ele só ia até que ele esperava ele não varria o arrei inteiro né então assim os caras são extremamente minuciosos mas bom voltando aqui né isso né Valdir se a gente for pensar no antigamente hoje em dia parece óbvio né eu tenho todo o código fonte de todo o Framework que eu uso né cara eu acho que foi o primeiro Framework na minha vida que eu peguei assim que inteiro você não entendia Como funcionava alguma coisa porque antes qualquer Framework tá aberto tem alguns cenários inesperados que tem ali alguma implementação falha né Spring foi o primeiro que de fato fui lá falou vou baixar o fonte você baixava você debugando completamente sabe não tinha um um ponto aí fi [ __ ] fui até aqui mas aqui não tem mais fonte não consigo ver exping não exping se você você quiser eu quero aprender sobre como é que funciona arquitetura rest vai de bugando então a gente a gente tem aqui né o cenário do do dos repositores a gente falou da da da abstração que o Spring cria né porque o Spring ele é ele também é uma máquina né meu de de construir coisa óbvia que nem a gente tá falando aqui né então a gente falou do dos dos repositories e eu acho que faz sentido a gente falar já que a gente tá tá falando de geração de código né da União do Spring com lombok que meor isso é isso é polêmico as pessoas falam mal do lombok que que absurdo cara o lombok é é mágico cara você junta código programação com convenção com boiler Plate com J boiler Plate é boiler Plate Então você você nós estamos falando de design né classes e có se você gosta do lombo deixa o comentário aqui embaixo se você quiser falar mal também deixa o comentário aqui embaixo Ai que você i passar o Instagram do você não go se você não gosta de L não se você não gosta deixa o comentário que eu respondo com com o Instagram do Valdir mas ó se liga você tá a gente tá falando de design né poxa uma classe ela ela tem algumas dependências né ela precisa de algumas coisas para existir por exemplo uma classe de de negócio ela precisa acessar um dado no banco se ela não tivesse dado no banco se ela não conseguir obter ela não tem ela não tem razão de existir esse essa essa dependência com outra classe ela tem que ser um atributo ou ela tem que est no Construtor tem que tá no Construtor né tipo minha razão conção para que ela exista tem que tá no Construtor tem que no construtor é o velho padrão de agregação Né simples assim né ninguém tá falando nada novo ISO aqui é orientação objetos exato cara de verdade Spring não inventou nada Ele só faz orientação objeto direito mas o ponto é e o LB ele tem lá um @ datata você bota em cima da classe tudo que é atributo que você põe final Puff ele já cria o Construtor e o Spring né ele quando tá avaliando lá os objetos que tem o @ component service Controller é [ __ ] essa classe não tem um Construtor padrão não tem problema Quais são qual Construtor ela tem Ah esses atributos eles têm Bins construídos já no contexto no contexto Puff injeta lá ah não tem tudo bem coloc ele ordena a prioridade da inicialização com base nas dependências pronto ele bota lá para baixo esse cara vai ser inicializado no futuro ah se não tem a dependência no contexto Puff dá pau aí você já vê a tua aplicação dando erro porque você fez alguma merda né E então e o legal também um adendo aí que ele te para em tempo de de start não dá tempo de estourar lá na frente para você aqui ele dá erro em tempo bu R né Startup não runtime Startup Startup tipo de starting inicialização Mas fala aí o e você ó fica a dica aí Seria legal se desse erro nem tempo de build então para você se você for pensar bem Marton é é o Build do contexto dele mas ele precisa iniciar para uma espécie de build também né é o Bootstrap então isso a gente vai falar no próximo episódio né que o Spring ele tá caminhando para ter uma pré-compilados
ele tá ele tá caminhando para isso né até para fazer frente com outros frameworks do mercado que são pequenininhos mas já começaram desse jeito né mas o o ponto é o lombok cara ele te ajuda a ter essas práticas de design também eh melhores aplicadas né e sem ter que ficar escrevendo código para [ __ ] sem ter que corrigir né erro ah serviço braçal né getters and setters ex pô hash code builder você tem um padrão de de do gangle for né lá da fase do dos do estrutural né que são os Builders que te ajudam a construir classes [ __ ] você bota @ builder em cima da classe puf já tem toda a implementação pronta entrega um builder grátis para você exato e e isso isso é assim ah é só bonitinho né pô te ajuda ali no noa M na construção menos código leitura do código ajuda muito e começou e é muito robusta essa essa essa estr ura vamos dizer assim de gerenciamento de dependências internas e de gestão de dependências mesmo de pegar o lbx de validar o que eu preciso o que não preciso cara eu Valdir conheci o Valdir quando Valdir não tinha barba Nenhuma ainda parecia o bebezão gigante de Marte lá do Chapolim a gente escreveu um Framework praticamente baseado em Spring que você pluga dependências diferentes em no webs né num ambiente de de ejb ou num ambiente stand alond ele funcionava eu com to com toda essa Com todas essas boas práticas que o Marcelo citou também por quê Porque todos os serviços tinham interfaces então a gente conseguia injetar exatamente como a gente precisava o Spring desde Essa época já permitia que você tivesse um controle muito grande sobre essa arquitetura vamos chamar assim de injeção de controle Então a hora a gente precisava fazer um tipo de controle vi o próprio contexto do Spring agora precisava ser com implementação a gente conseguia fazer então como eu falei né tipo falou a gente vai usando as ele te dá um pacotão de boas práticas que é até complicado você não conseguir resolver algum problema com ele porque ele não te permite você é desviar muito da do ideal sabe isso é legal que você tá falando de uma outra forma el segura um pouco também para você não fazer tanta caca né o cara mais novato ali o Spring cara ele tem progar tão tão menos ele tem que meter tanta menos a mão na massa nessas tranqueira de protocolo é mais difícil errar né mais difícil fazer né Gambiarra Gambiarra né cara então tá ali pronto eu conheço uma linguagem também que evita que faça gambiarra porque bem bem Francês é PHP PHP não deixa ninguém fazer gambi não tem nem Type Casting é só gambiarra al eu eu adoro essas linguagens que tem uma pasta e um monte de scrip jogado dentro você nunca nunca na sua vida você consegue gerenciar versão né porque no no no servidor sem tem uma co diferente amigos pega peiros eu adoro pegar pagou muito boleto Você já viu Você já viu algum livro do Oliveiro aprenda java em S Dias Oliveiro Nossa cara você tá falando de como é que você vai controlar que versão versão para os fracos meu amigo bom você que tá vendo esse podcast da hora tá vendo um monte de problema aqui que a gente tá colocando né e Quer uma ajuda aí na sua empresa faz o seguinte entra no site aqui da VMB que a gente pode te ajudar VM be.io nós somos uma empresa relacionada à arquitetura de soluções a modernizações de aplicações também atuamos na F devops para ajudar vocês a serem extremamente ágeis então dá uma olhada no nosso site que vai est aqui embaixo vb. e lá você vai poder ver um pouquinho da nossa história dos nossos profissionais e aproveitando se você for um profissional da área de tecnologia que tá Aim de trabalhar numa empresa legal um monte de colega gente boa e tecnologia te ponta manda o e-mail para people care @mario já agora eu quero meu show velho então a gente tá falando o seguinte que o lombo salva vidas né E aí cara para fechar essa parte de design Eu acho que um ponto legal aqui é a gente pensar em exceções decentes né tipo assim o teu código ele precisa ter um tratamento de exceção que faça sentido cara [ __ ] tem uma exceção lá da da parte de de port né tipo ah acessi algum dado que não tá legal bota lá uma exceção condiz o que tá acontecendo cara não manda tudo Business Exception porque às vezes cara você precisa saber Pô eu não encontrei um CPF eu não encontrei uma um um documento que que eu faço com isso às vezes essa sessão pode te Direcionar para uma outra uma outra consulta né pode você pode ter consulta de dados encadeadas Posso fazer uma pergunta construtiva agora eu eu eu tenho não críticas construtivas eu conheço pergunta Constru Teoricamente too a pergunta é né É mais ou menos mas tem esse é um ponto de design de código que é interessante discutir Python tem também né Esses são assim lógico con e e é exatamente a mesma coisa modelagem ex o TR exatamente a mesma coisa eh copiou é não na verdade que também orientado objeto então não tem não tem muito segredo né mas uma isso é uma coisa que é uma discussão legal assim e eu acho que a experiência que te leva a entender melhor isso mas Em que momento você tem que criar um tipo de exceção de fato Em que momento você consegue diferenciar a exceção somente pela mensagem por exemplo Esse é um ponto interessante e eu eu crio um tipo de exceção quando ela vai me vai me dar um direcionamento diferente de exatamente pelos mesmos motivos que você cria outras classes de negócio exato ponto é a resposta a resposta em alto nível é isso que o Marcelo falou né vocês explicarem um pouco mais não mas Dame a mensagem ô mas Dame é o seguinte o o vald falou Exatamente isso né tipo a mensagem ela tem que se falar exatamente o que tá acontecendo para cada para cada para cada fator diferente você tem que ter uma mensagem diferente Teoricamente certo onde onde onde que você onde que você aprende a a onde que você não cria uma mensagem nova onde você vê que o o tratamento para aquele problema o diagnóstico é o mesmo né então por exemplo eu não queria começar com essa porque essa é que o pessoal usa muito de muleta Mas enfim vou tentar usar um caso certo né Bad Gateway você tem lá o 400 da vida que é quando você faz uma requisição para um para um serviço ela não vem no formato que aquele serviço espera né geralmente porque tá faltando algum tipo de informação ou tem alguma regra de negócio eu já acho que já muda aí não deveria ser um problema de regra de negócio se eu se se eu tô dando um 400 é porque o meu contrato formal ele foi ele foi talvez concluído me meu cliente ele ele é ele aceita né aquele aquele a chamada para aquele servidor Mas alguma informação básica ali eu não tenho enfim aí você pode simplesmente ter uma mensagem que mostra qual a informação que tá errada e preferencialmente todas que estão errad de uma vez só o cara não tem que fazer a mesma chamada corrigir e fazer corrigir e fazer exceção eu acho um ponto interessante que exceção é uma informação de negócio pro desenvolvedor é exceção e mensagem são coisas diferentes né são conceitos diferentes então Exception exceção é algo que fugiu do fluxo normal do fluxo esperado do fluxo padrão sim até aqui beleza mas o ponto que eu quero levantar para vocês explicarem A modelagem é o seguinte você tem A modelagem correta que é por exemp ex eu vou capturar uma exceção como o Valdir falou que é o CPF not found beleza C essa essa é uma uma exceção legal né porque ela falou o jeito certo beleza que é como a gente deveria modelar as coisas não b não Bad request então Mas vocês já devem ter visto como eu também já vi independente da linguagem tipo Business Exception mensagem CPF não encontrado ISO exato E aí o ponto é qual é o Onde eu consigo por exemplo [Música] e deixa eu ver como exp como como eu eu acho que entendi deixa eu ver se exp falou eu posso dizer que tipo Houve um erro num determinado processamento e o processamento foi que o CPF não foi encontrado e em que ponto o CPF não ser encontrado e eu entender que é uma exceção diferente muda o fluxo do meu código acho que esse é o ponto sabe que aí eu vou lançar de fato uma exceção depende depende daquilo que você tá programando na hora então por exemplo se eu entendo que CPF não encontrado é uma exceção é o meu fluxo padrão que a eu vou lá consulto alguém uma consultora parael um CPF e se eu Consultei a consultora pelo CPF eu consegui encontrar o código dela são casos de uso se isso para mim é algo importante que Deva alterar o fluxo da minha aplicação eu posso cadastrar especializar aí que eu queria chegar por exemplo eu posso ter uma simplesmente uma persistência e para essa para eu fazer essa persistência o CPF tem que ser Válido por exemplo tem que localizar em um determinado momento fazendo um update E aí eh não importa se o CPF não foi encontrado o nome não tá o nome não tá consistente o fato é que eu não consegui fazer a persistência então eu poderia ter um persisten persisten Exception por por exemplo ou persistence persist persistence é pô meu inglês tá maravilhoso hoje eu poderia ter um erro de persistência uma exceção de persistência onde a mensagem é CPF não foi encontrado agora se eu consigo a a mensagem é pro cliente né não é para você sim exato exatamente às vezes você não tem nem mensagem né que aí que eu queria chegar entãoo mas o fluxo é não conseguir persistir Agora se a regra de negócio altera o fluxo da minha aplicação e eu não encontrei o CPF e aí se eu não encontrei o CPF vou pesquisar pelo RG por exemplo aí eu deveria modelar a minha exceção para que ela de fato consiga dar uma uma uma Flag pro meu código que eu vou ter que alterar o fluxo né O que que eu vou fazer com aquela exceção é a pergunta tratar é exceção né eu tenho eu tenho um Type diferente de exceção que eu consigo programaticamente manipular o fluxo eu acho que tipo assim talvez a gente cheg numa esfera Néa Seara que é muito pessoal só assim do ponto de vista de a gente obviamente segue as boas práticas cada tem se estilo de programação eu vejo que o tipo da exceção E aí eu vou fazer uma comparação com com rest que acho que é mais fácil de de tangibilizar o status né o status code da minha sessão que eu vou lançar ele depende muito de como eu imagino que aquela sessão tem que ser tratada no cliente não necessariamente o Valdir tava falando e o o ponto que Valdir falou falou acho que é o é o ponto principal a mensagem tem que ser Clara a exceção Se tudo fosse se só só P inteira não é exatamente ideal obviamente né mas lançar sem Business Exception Mas cada Campo ali cada erro diferente tem uma mensagem diferente contr contrado da sua pi a a documentação dela o sua eger que como é que seja essa documentação explica exatamente ó eu vou te lançar um Business Exception vai ter o código 401 que é isso 402 que é isso 403 que é isso o client ele sabe como tratar aquilo e ele vai tratar cada exceção como ela deve ser não tá errado quando quando a gente usa tipos de exceção E aí no na comparação que eu tô fazendo né status respons é porque a gente já tá dando Inclusive a forma como a gente acha que aquilo tem tem que ser tratado se eu retorno 404 é porque eu imagino que o cara tem que ter um tratamento diferente para esse tipo de recurso S encontrado do que quando ele tem outro tipo de regra de negócio quando eu dou 401 é porque ele não conseguiu se autenticar na na minha aplicação entãoa um falando é que esse paralelo ele ele ele é meio que só pra gente não confundir exceção de Java com exceção de rest isso é porque porque eu eu acho que não não sei se foi uma bo 400 ou 401 seria seriam exceções diferentes dentro do próprio código né uma coisa que tem muito a ver também né com você falou da especialização né A tá falando de especialização e abstração da da classe da exceção isso isso tem muito a ver também com a camada que você tá então por exemplo se eu tô na camada de negócio e eu quero lançar lá aquilo o tal do do hexagonal aquele componente aquele só faz a consulta da consultora por tal cor por CPF ali naquela camada eu lanço um CPF não encontrado eu capturo na camada chamadora E lá eu posso devo pode ser uma camada de negócio tô inventando aqui uma cada de negócio que chamou essa outra camada eu capturo o CPF e lanço uma camada que a outra camada chamad vai entender e ali eu posso por exemplo se eu tô na ponta final lá no rest que ele falou eu crio um componente Zinho de de resposta né que me dá sucesso o código tal tal que é conhecido pelo cara de fora encapsulou numa numa exceção para aquela outra camada e lanço outra exceção então lá na ponta não vai chegar o CPF Então vai chegar o xpto né posso posso fazer um tentar montar um exemplo para capturar o que você falou eu tô pesquisando uma pess certo então lá na na primeira camada eu vou iniciar a pesquisa por aquela pessoa servidor tá fora do ar servidor de banco tá fora do ar isso servidor tá fora do ar estamos lá na pontinha final o servidor de banco tá desligado isso aí não vamos vamos simplificar eu posso pesquisar a pessoa por RG CPF ou por nome mas você vai vai puxar num banquinho qualquer isso eu vou vou puxar lá no banco Pera aí que eu vou abrir o eclipse aqui vai lá lá aí aí naquela primeira camada eu vou chamar um método que é pessoa né tô numa numa camada de negócio que eu vou localizar essa pessoa nessa camada eu vou retornar pra frente tipo se a pessoa foi o Exception people found ou people not found e para camada de baixo de de de fazer esse tipo de pesquisa eu posso tratar a exceção do tipo não localizado pelo CPF aí se eu se eu tive uma exceção de não localizado CPF eu posso tentar Pesquisar pelo RG se eu tive uma exceção de não encontrado pelo RG eu posso procurar pelo nome e aí se eu se eu passei pelas três exceções E essas exceções e eu não esgotei minha Chan eu retorno uma exceção única que a pessoa não foi localizada ou se eu procurei pelo CPF e tive uma exceção de não ser encontrado pelo CPF Mas Encontrei pelo nome eu nem retorno a exceção para cima né eu assim aí voltando né então mas é que a gente voltou no no básic básico da orientação OB mas mas ó vamos lá a gente tá falando eu eu acho né primeiro a gente começou falando de exceção do Java aí depois a gente falou de exceção do rest lá e aí beleza e agora a gente tá falando de novo de exceção mas a gente tá a gente não tá respondendo a tua pergunta ainda sua pergunta foi poxa quando é que eu troco os tipos de exceção eu assim Marcelo falou Pô todo igual igual eu crio uma outra classe Ou seja quando eu preciso de um comportamento diferente né eu tenho Campos Inválidos beleza eu crio Campo inválido acabou e aí eu troco lá a mensagem ah mensagem é o campo inválido é nome sexo é não sei o que Campo inválido Ah eu tenho P por que que eu preciso de uma CPF não encontrado tão tão forte porque [ __ ] CPF não encontrado é um campo chave eu identifico a pessoa desse jeito Ah então eu preciso trocar o fluxo beleza Outra coisa quando eu vou mandar o rest lá se aí vamos vamos lá para cima pô eu vou mandar o rest Sei lá eu vou ter pouca poucos poucos códigos htp code eu tenho 400 que é [ __ ] você me chamou chamou errado e tem o 401 [ __ ] você não devia ter me chamado e 402 eu esqueci o que que é 403 é [ __ ] você você pode até me chamar mas não aqui chama ali né enfim 404 Ah e se você encontrou não me é chamou uma coisa errada né então 404 é o mais clássico de todos até que at mas o ponto é eu posso eu posso colocar na minha exceção de saída lá do rest o código porque o ponto assim eu não eu não eu não tenho que mandar um string pro cara validar se o string tem o campo tal Campo tal [ __ ] meu coloca lá um objeto bonitinho aí o objeto vai ter um um atributo message inglês né ID para representar o ID da exão o Code né mas o ponto é eu quero trocar eu quero que a pessoa saiba trocar de fluxo em função do erro que teve você tem que determinar um tipo diferente como eu não consigo criar status htp porque eu não sou dono do protocolo htp eu coloco um atributo eu coloco um atributo lá né no Java a mesma coisa Ah só que no Java eu sou eu sou mais [ __ ] né eu posso criar o tipo então eu crio uma classe diferente mas de novo por que que eu crio sessões diferentes porque eu tenho que mudar o fluxo eu acho Ô Valdir você o Marcelo falou também e e você concluiu acho que é muito o que o Valdir tava falando antes a gente tá falando em em Arquitetura exagonal em DDD a o design das da das suas dos nossos end points né end points não dos nossos serviços passam inclusive pelo pelas exceções que eles lançam a gente F tá falando do nome do serviço a gente tá falando dos parâmetros que ele recebe e a gente tá falando das receções que ele lança também e Marcel tocando um ponto interessante dependendo do nível que eu tô dentro dessa cebola né eu vou lançar uma exão diferente porque cada classe cada cada camada tem que lidar com aquela exão da forma que ela é mais conveniente né a camada repos pode lançar um io Exception por exemplo pra camada de negoo aquilo não importa se se ele não não consegui conectar ou se ele não conseguiu achar um dado às vezes nunca deveria eu acho eu acredito né nunca é uma palavra muito pesada né mas assim na grande maioria não deveria nunca deixar passar esse aô lá para final né não então por isso que eu na próxima camada eu ele lançou mas eu pego ela aqui e faço uma coisa mais palatável pro isso cria uma abstração em cima daquilo tipo ó não conseguir conectar com alguém ou por algum motivo né não [ __ ] cara seu um bit o bite aqui não a minha primeira resposta e eu mantenho ela de certa forma mas é eu tava pensando muito porque tipo o sermão tem que ser claro e tipo eu acho que às vezes tem gente que pensa muito no tipo de exceção que dá mas não não trabalha com a com o fluxo sabe cara seu tipo de sessão chama Johnny exf chama wton não importa mas a mensagem tem que ser Clara e principalmente tem que ser tratada e combinada tamb quando a gente quando a gente fala quando eu falo igual a gente vai fala depois de eh testes unitários testes automatizados é muito nisso a maior parte dos cenários de testes são testes de exceção são testes de de fluxo alternativo de fluxos errados no próprio Test no próprio test unit automatizado né que o ele vem falando bastante ali dentro você eh faz força Exception porque se dá Exception ele vai tratar e vai aparecer passei ele entendeu Mas você sabe que ess gosta de tratar Exception é para programador ruim porque programador bom nunca cai n eu no no potion eu nunca vi não você nunca resiliência é coisa de Novato novato cara porque o cara quando tem certeza que o código coach de programação que fala resiliência é quando o cara tem certeza que vai para que que ele vai tratar esse nunca vai passar esse dado nunca vai vir nulo nunca não existe exceção só ex durmo 8 horas por dia amho uma hora por dia e minha P resiliente não mas ó o o Johnny tava no no backstage aqui o Johnny tava contando um problema [ __ ] também viu pra gente fechar a chave de design com com com problema de de problema legal Fala aí ô J que que você viveu lá outro dia cara lá lá é uma incógnita ó pra gente fechar o episódio hein já [ __ ] mas tem tanta coisa PR falar ainda meu a gente vai ter isso aqui vai ser uma uma novela cara tem a parte avançada do Spring board Tem a parte de teste ter que fazer um episódio de spring boot avançado um Spring boot Quando é que a gente vai ter Quando é que a gente vai ter o r Zone no spring spring boot e de de novidades né e o o Future of Spring boot fut Spring boot V vou tentar sintetizar essa história mas o Eron esse cara que manja para caramba de PHP de pai então acho que ele vai entender também porque cara não põe PP Python na mesma na mesma bandeja sinceramente a gente falou de termos de Java né mas o problema é um problema de solução em geral né então a gente tem essa aplicação que roda não é nem Spring boot roda no spring mas roda no spring num servidor convencional né e a gente precisava fazer uma solução essa aplicação você imagina que é um serviço que tá rodando vários serviços né uma ap que tá rodando e que vários canais consomem aquele serviço né Web Apps App Android appos enfim várias coisas né a demanda era o quê era a gente conseguir identificar informações acerca Desse Canal pensa no metadados de de cada canal né então especificamente para esse cenário era sobre versão do aplicativo que tava consumindo fosse o Web a gente ia colocar um valor qualquer um valor defo se fosse um aplicativo de fato iOS ou Android a gente ia colocar qual que era a versão de fato que a gente tinha lançado daquele frontend que tava fazendo uma requisição no nosso backend E aí a funcion a a utilização para isso tem n né velho a gente pode falar aqui desde Analytics até de formas da gente conseguir conduzir né a a utilização do aplicativo enfim era basicamente isso basicamente Vamos pensar assim vamos tentar trazer um pouco mais para baixo né era incluir um parâmetro novo na no nosso backend que fosse oriundo de uma esse parâmetro novo né ele viria de um header na na nossa requisição rest E aí você identificaria o canal exato o a versão a versão tá o canal é sempre o canal é é sempre o canal é mobile principalmente né quando é web vem um número de versão não importante só isso Ponto né então basicamente Você tem uma informação que chega via header e ela precisa trafegar até determinada parte do serviço lá onde ela vai ser utilizada de Fato né e a gente quem aí quem quiser pensa quem não conhece essa parte mas quiser ver o primeiro episódio do Spring bo a gente falou sobre isso né Spring Ele trabalha numa numa arquitetura vamos dizer assim na numa solução que ele como é que ele faz ele todas as classes que você codifica de configuração adapter serviços não no no no primeiro nível elas são classes que a gente chama de classes candidatas para subir no contexto do Spring a Spring ele inicia sua aplicação pega todas essas classes que você marcou lá como classes relevantes para aquela aplicação sobe no contexto Aí dependendo de como você anota ela se ela é serviço se ela é configuração tem um comportamento diferente né mas ele vai lá e traz todo mundo né mas um ponto importante de saber Ou pelo menos um ponto básico que às vezes a gente esquece que cada classe Ele trabalha com com um esquema de singleton então cada classe sobe um protótipo é o Prototype dele Prototype é o Prototype da classe então Enfim então a gente então é um pouquinho diferente mas imag não é Prototype desculpa é escopo e aí e aí os beins tem vários escopos tem o single tem um Prototype tem isso a maior parte dos escopos são sing aí não vou entrar muito no mérito mas imagina que quando você fala que o escopo é singleton cada bim cada Instância cada Instância de da da sua classe sobe uma vez só isso também é mais um padrão design pattern Independente de qualquer ling Prototype também é utilizado no spring Não muito mas tem alguns casos específicos o qu que quando você clona classes clona instâncias para gerar novas instâncias enfim mas vamos resumir vamos simplificar imagina que tudo é sing Então você tem pras classes de de de configuração de serviço tem um uma classe para cada coisa e mas obviamente E aí é um ponto que deixa eu pensar como é que exp é meio complexo de de de entender para quem não é técnico mas para quem técnico vai entender fácil Ok a minha implicação ela sobe Any singletons quem não é técnico parou nesse Episódio nos 10 primeiros minutos pode ser já tá no cada cada cada sington cada serviço que só por exemplo é um sington mas eu tenho obviamente n trads eu sou um serviço que cuida de pedidos o pedido rest service pedido service que seja eu tenho uma Instância só e por ele passam milhares de de pedidos né Ou seja eu não posso eh lidar com as com esse serviço esse serviço não é o o local nem Seria para eu armazenar informações referentes a pedidos por porque vai passar um milhão de pedidos ali eu não consigo marcar uma referência ali para aquele pedido usar de novo e o problema foi justamente esse a gente tava fazendo uma requisição sobre um cliente ele pegou essa essa essa versão do aplicativo ao invés de passar direto por essa primeira camada de Controller e jogar no serviço que ia ser utilizado ou de criar uma uma propriedade num numa num objeto que fosse para que fosse único para aquela tred né Por exemplo num objeto cliente Eu tenho um objeto cliente ali eu podia gravar essa versão ali dentro apesar de não ser do domínio daquele cliente mas pra aplicação é não Ele criou um uma variável aqui no prazer meu nome é client service vou criar uma variável chamado app version aí deu um 10.7 version gravou lá e aqui embaixo tava pegando e passando pra frente muito bom e e qual que é a pior parte disso a parte D mais trabalho né porque localmente quando a p se a pessoa escreveu isso Ela obviamente não sabe como é que aquilo funciona localmente tudo dá certo porque você não tem várias instâncias nade você não tem vários clientes operando na sua máquina foi lá testou e subiu e desceu o test também tinha tinha erros ali a gente não vai entrar nesse mérito agora porque não é não é do do canal Mas você imagina que geralmente uma aplicação ela tem front end backend geralmente são aplicações diferentes hoje em dia mesmo antes quando não eram aplicações tão diferentes assim você tem componentes que só rodam em front end que são renderizados vamos dizer assim só no no no client no Browser Então não é uma aplicação que dá para você testar trivialmente você roda tudo e consegue validar tudo ele tava fazendo assim por isso que ele não pegou esse erro também e Subimos em um ambiente de não ainda bem que não era produção era só homologação mas era uma homologação assim numa etapa de projeto que tá imagina testes integrados para implantação né subiu a aplicação em 12 segundos alguém pergou um erro de login já e para entender o que tá cena Por que que que tá quebrando a informação tá vindo Tá tudo funcionando fui ver ah sempre pegava a o cliente errado nossa mas tava compartilhando entre trads o mesma Instância compartilhar entre trads é porque você tem uma Instância só que deveria ter uma uniformidade de dados porque Ah só colocar sincronize lá no método mentira mentira brincadeira brincadeira mentira não faça isso eu eu não quis múltiplas treds aí toda vez que você passava que ela variava você mudava mas ela varia para todas as treds porque a instância é uma só é e o Java também não garante que a tred Execute até o final ela às vezes ele para a tred no meio a outra tred entra aí a tred que entrou altera o valor aqui quando a outra continua ela continua vala isso porque a instância é uma só né você está usando o mesmo espaço de memória Teoricamente para operações que são clones isso né a eu entendi bem foi isso né Exato eu não quis falar com o mesmo termo Porque como a a gente tá falando em clusters Não é bem assim não é geralmente uma Instância só não é se que é uma aplicação só né mas basicamente você não pode contar o que você vai gravar um um dado numa variável de um de um objeto que é compartilhado por todas as instâncias daquela por todas as treds daquela Instância e ele vai se manter e é e é interessante porque nesse caso Pelo que eu entendi o desenvolvedor ele tava tratando a thad como uma Instância diferente e na verdade não é o caso eu acho que vai com a minha conclusão a explicação do que ele tava fazendo errado é muito mais difícil do que falar do que que ele fez de errado de implementação sabe você tá trabalhando num serviço você tem lá sua a suas classe parâmetros o dtox vai carregar aquela informação pro final você tem que manter tudo ali dentro vho você não pode ficar gravando coisa num num lugar mágico que que não existe que não existe lugar nenhum sabe eu não posso criar uma variável dentro do meu serviço chamado joh e querer gravar informação lá que outra pessoa vai consumir sabe você entra num entra coloca informação num buraco aqui e tenta pegar em outro buraco completamente diferente é é não é buraco de minhoca né E aí vem tudo disso E no fim das contas é uma questão a gente voltando um pouco né antigamente a gente não tinha esse tipo problema Teoricamente porque não usava esses frameworks distribuídos Mas é uma questão por exemplo de escopo de variável de você jogar na variável Global uma informação que ela que ela é compartilhada inst é é não é é o cenário do desastre né até PP né se você colocar lá no no no global ela fica lá forever cara Acho que depois dessa Ampla discussão aqui sobre exceptions e esse Case maravilhoso do Johnny aqui acho que a gente poderia ficar mais algumas horas aqui falando sobre Como assim Wel Como assim tem tanta coisa pra gente falar que eu tinha anotado na paa bicho que que que ficou faltando aí ô cara tem a parte avançada do Spring ainda [ __ ] será que a gente vai ter que fazer um outro Episódio Ah com certeza B Ah tem que falar mais de teste tem que eu tô enrolando o Johnny aqui ele já falou um monte de vezes de teste Falei pô a gente vai falar de teste no final antes de falar de teste aí eu ia pegar uns negócios mais legal assim pô ia falar de eventos o Spring dentro da da do contexto dele trabalha com eventos a gente pode usar isso a nosso favor na programação Tem a parte ISS isso aí é interessante porque me me interessa muito porque eu sou o cara do node JS que é event driving você é o cara do VB que EV driven o verdadeiro event driven bb5 Delphi cara tem umas parad louca de de até processar eventos em concorrência né com a tua teu suas PR promessas né exatamente você tem a parte de de processamento em em em concorrência que é essa parte de promessas que o que o Marcelo falou esqueci meu nome esqueci seu nome bicho tem tem isso isso é fenomenal [ __ ] você põe a rou a Então segura Segura que cara isso aí é node JS beleza não não não é o epis isso aí é node JS cara como se não bastasse tem todo apelo de teste cara pra gente falar de de de spring Poxa por que que Spring é tão bom para você testar sua aplicação pessoal PPT não compila dois guerra civil streaming streaming Spring da suporte streaming web Flux essas coisas dá Pô então e o futuro do Spring aí já é um out Episódio ainda cara então se você curtiu esse episódio até aqui se você se você ainda não deixou o like se você ainda não deixou seu comentário e não compartilhou esse episódio pro seu Squad de desenvolvimento que usa Spring que usa node que usa Python que usa JavaScript que usa qualquer coisa que toma Patagônia que toma Patagônia e um abraço Patagônia patrocina nós a sua oportunidade de fazer isso é agora então deixa seu like deixa seu comentário deixa seu comentário aqui agora no Spotify também dá para deixar de o comentário deixa as suas cinco estrelinhas no Apple podcasts e muito obrigado vamos ter a série do Spring tá só Só começando Só o segundo episódio teremos mais valeu obrigado valeu [Música] [Aplausos] [Música]
Episódios Relacionados
1h 28minSQL vs NoSQL: Tudo o que você precisa saber | PPT Não Compila Podcast
Valdir Scarin
27 de ago. de 2025
1h 23minQuarkus: Java além da JVM | PPT Não Compila Podcast
Luiz Pais, Valdir Scarin
19 de fev. de 2025
1h 26minEstratégias na Adoção de Plataformas de Desenvolvimento | PPT Não Compila Podcast
Elcio Abrahão, Luis Rogerio de Souza
8 de mai. de 2024
1h 26minApache Kafka: Transformando Ecossistemas de Dados e Desenvolvimento de Software | PPTNC Podcast
Pedro Busko, Romulo Barbosa
13 de mar. de 2024
