{"id":201,"date":"2022-08-23T10:13:54","date_gmt":"2022-08-23T13:13:54","guid":{"rendered":"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/?post_type=v1&#038;p=201"},"modified":"2024-02-20T12:33:13","modified_gmt":"2024-02-20T15:33:13","slug":"padroes-arquiteturais","status":"publish","type":"v1","link":"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/sumario\/padroes-arquiteturais\/","title":{"rendered":"Padr\u00f5es Arquiteturais"},"content":{"rendered":"<h4><strong>1 &#8211; BACKEND<\/strong><\/h4>\n<h5><strong>1.1 &#8211; JAVA<\/strong><\/h5>\n<p>Baseado na escalabilidade necess\u00e1ria para melhor funcionamento dos sistemas da DPMG, de forma integrada, foi definido a utiliza\u00e7\u00e3o do JAVA e toda sua stack para implementa\u00e7\u00f5es de aplica\u00e7\u00f5es robustas.<br \/>\nJava \u00e9 uma linguagem de programa\u00e7\u00e3o e plataforma computacional lan\u00e7ada pela pela Sun Microsystems em 1995. Existem muitas aplica\u00e7\u00f5es cujo funcionamento est\u00e3o condicionados \u00e0 presen\u00e7a do Java instalado. Java \u00e9 uma linguagem gratuita, est\u00e1 entre as linguagens mundialmente mais usadas e atualmente \u00e9 mantida pela Oracle.<br \/>\nPrincipais caracter\u00edsticas do Java:<\/p>\n<ul>\n<li>Suporte \u00e0 orienta\u00e7\u00e3o a objetos;<\/li>\n<li>Portabilidade;<\/li>\n<li>Seguran\u00e7a;<\/li>\n<li>Linguagem Simples;<\/li>\n<li>Alta Performance;<\/li>\n<li>Dinamismo;<\/li>\n<li>Interpretada (o compilador pode executar os bytecodes do Java diretamente em qualquer m\u00e1quina);<\/li>\n<li>Distribu\u00eddo;<\/li>\n<li>Independente de plataforma;<\/li>\n<li>Tipada (detecta os tipos de vari\u00e1veis quando declaradas).<\/li>\n<\/ul>\n<p>Os sistemas comunicam entre si atrav\u00e9s de &#8220;cliente-servidor&#8221;, onde as aplica\u00e7\u00f5es frontends (cliente) realizam requisi\u00e7\u00f5es na API Gateway (servidor) para manipula\u00e7\u00f5es e consultas de dados. As API&#8217;s s\u00e3o respons\u00e1veis por receber as request de microsservi\u00e7os, validar o acesso aos endpoints via permiss\u00e3o do usu\u00e1rio, manipular o dado e retornar a informa\u00e7\u00e3o solicitada via response.<br \/>\nOs microsservi\u00e7os possuem defini\u00e7\u00f5es a serem seguidas, como por exemplo a implementa\u00e7\u00e3o de rollbacks em todos os m\u00e9todos que utilize transa\u00e7\u00e3o. Tamb\u00e9m dever\u00e3o ser servi\u00e7os simples e objetivos. Todos os endpoints devem ser documentados atrav\u00e9s do Swagger e com o SCSDP corretamente configurado.<\/p>\n<h6><strong>1.1.1 &#8211; REPRESENTA\u00c7\u00c3O ARQUITETURAL<\/strong><\/h6>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/1-pj.png\" alt=\"img\" \/><\/p>\n<h6><strong>1.1.2 &#8211; ARCHETYPE BACKEND DPMG<\/strong><\/h6>\n<p>Esse projeto foi criado para facilitar a cria\u00e7\u00e3o de novos projetos JAVA na DPMG.<\/p>\n<p>Todos os padr\u00f5es no desenvolvimento ser\u00e3o mantidos nesse projeto para melhorar a integra\u00e7\u00e3o de novos participantes na equipe e at\u00e9 mesmo a cria\u00e7\u00e3o de projetos no dia a dia.<\/p>\n<p>Esse projeto s\u00f3 precisar\u00e1 ser clonado caso queira contribuir com o archetype, fora isso n\u00e3o \u00e9 necess\u00e1rio para cria\u00e7\u00e3o de novos projetos<\/p>\n<h6><strong>1.1.3 &#8211; COMANDOS B\u00c1SICOS<\/strong><\/h6>\n<p>Execute o comando na pasta onde deseja criar o projeto.<\/p>\n<p>mvn archetype:generate -DarchetypeGroupId=br.def.mg.defensoria -DarchetypeArtifactId=archetype-backend -DarchetypeVersion=2.1.9 -Dprojeto=nome-projeto<\/p>\n<p>Ps: Caso o settings do maven n\u00e3o esteja na pasta padr\u00e3o dever\u00e1 adicionar o seguinte atributo<\/p>\n<p>-s \/diretorio\/arquivoSettings.xml<\/p>\n<p>Ao gerar esse comando ser\u00e1 gerado um projeto maven multi-modules com a camada de persist\u00eancia e servi\u00e7o, um modulo de depend\u00eancias tamb\u00e9m ser\u00e1 gerado com as depend\u00eancias mais utilizadas nos projetos<\/p>\n<h6><strong>1.1.4 &#8211; CONFIGURA\u00c7\u00c3O DO PROJETO<\/strong><\/h6>\n<p>O projeto gerado ser\u00e1 montado com a seguinte Stack de tecnologias<\/p>\n<ul>\n<li>Java 17<\/li>\n<li>JPA<\/li>\n<li>EclipseLink<\/li>\n<li>Apache Commons 3.1<\/li>\n<li>Jakarta JAX-RS<\/li>\n<li>Jakarta EJB<\/li>\n<li>Swagger<\/li>\n<li>JUnit 5<\/li>\n<li>Lombook<\/li>\n<li>Integra\u00e7\u00e3o com SCSDP<\/li>\n<li>JACOCO<\/li>\n<li>Surefire reports<\/li>\n<\/ul>\n<h6><strong>1.1.5 &#8211; DEPED\u00caNCIAS ENTRE PROJETOS<\/strong><\/h6>\n<ul>\n<li>dpmg-commons<\/li>\n<li>scsdp-commons<\/li>\n<\/ul>\n<p>As configura\u00e7\u00f5es de charset e encode j\u00e1 ser\u00e3o realizadas.<\/p>\n<p>O pacote de todos os modulos j\u00e1 definidos por padr\u00e3o com o seguinte valor:<\/p>\n<p>br.def.mg.defensoria.nomeProjeto<\/p>\n<p>O groupId \u00e9 definido pelo padr\u00e3o da defensoria:<\/p>\n<p>br.def.mg.defensoria<\/p>\n<p>Observa\u00e7\u00e3o: O pacote default gerado deve ser alterado caso o nome do projeto seja composto, alterando para nome.projeto n\u00e3o \u00e9 poss\u00edvel automatizar essa parte trocando &#8220;-&#8221; por &#8220;.&#8221;<\/p>\n<h6><strong>1.1.6 &#8211; CONFIGURA\u00c7\u00c3O DO SONAR<\/strong><\/h6>\n<p>Foi configurado os testes para conseguir analisar qual a porcentagem de coverage do c\u00f3digo fonte.<\/p>\n<h5><strong>1.2 &#8211; ESTRUTURA<\/strong><\/h5>\n<p><span class=\"TextRun SCXW237730454 BCX9\" lang=\"PT-BR\" xml:lang=\"PT-BR\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW237730454 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Baseado em organiza\u00e7\u00e3o dos c\u00f3digos para garantir melhor leitura e manuten\u00e7\u00e3o de servi\u00e7os, foi definido uma arquitetura de forma que seus m\u00f3dulos possuam baixo acoplamento<\/span><\/span><span class=\"LineBreakBlob BlobObject DragDrop SCXW237730454 BCX9\"><span class=\"SCXW237730454 BCX9\">\u00a0<\/span><br class=\"SCXW237730454 BCX9\" \/><\/span><span class=\"TextRun SCXW237730454 BCX9\" lang=\"PT-BR\" xml:lang=\"PT-BR\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW237730454 BCX9\" data-ccp-parastyle=\"Normal (Web)\">entre si e de f\u00e1cil compreens\u00e3o, permitindo um desenvolvimento \u00e1gil.<\/span><\/span><\/p>\n<p><span class=\"TextRun SCXW247613096 BCX9\" lang=\"PT-BR\" xml:lang=\"PT-BR\" data-contrast=\"none\"><span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">A arquitetura base \u00e9 composta por 1 projeto \u201cpai\u201d que agrupa 4 projetos \u201cfilhos\u201d. Estes 4 projetos s\u00e3o definidos como m\u00f3dulos, e eles s\u00e3o separados em: <\/span><span class=\"NormalTextRun SpellingErrorV2Themed SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Dependencies<\/span><span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">,<\/span> <span class=\"NormalTextRun SpellingErrorV2Themed SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Migration<\/span><span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">, <\/span><span class=\"NormalTextRun SpellingErrorV2Themed SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Persistence<\/span><span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\"> e Service.<\/span> <span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Em casos espec\u00edficos em que o projeto tenha automa\u00e7\u00f5es, poder\u00e1 ser inclu\u00eddo os m\u00f3dulos chamados de <\/span><span class=\"NormalTextRun SpellingErrorV2Themed SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Job<\/span><span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\"> e <\/span><span class=\"NormalTextRun SpellingErrorV2Themed SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">Shared<\/span><span class=\"NormalTextRun SCXW247613096 BCX9\" data-ccp-parastyle=\"Normal (Web)\">.<\/span><\/span><span class=\"EOP SCXW247613096 BCX9\" data-ccp-props=\"{&quot;134233117&quot;:false,&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559738&quot;:0,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p>\n<h6><strong>1.2.1 &#8211; DEPENDENCIES<\/strong><\/h6>\n<p>Este modulo \u00e9 respons\u00e1vel por gerenciar as bibliotecas utilizadas pelos demais m\u00f3dulos da aplica\u00e7\u00e3o. A imagem abaixo \u00e9 um exemplo de como devem ser importadas as bibliotecas.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/2-pj.png\" alt=\"img\" \/><\/p>\n<h6><strong>1.2.2 &#8211; MIRGRATION<\/strong><\/h6>\n<p>O modulo de migration \u00e9 respons\u00e1vel pela gest\u00e3o dos scripts de banco de dados que dever\u00e3o ser executados para o correto funcionamento do m\u00f3dulo Persistence. Os scripts<br \/>\ns\u00e3o organizados em pasta de estrutura e pasta de dados. Os dados devem ser separados por ambiente (Desenvolvimento, Homologa\u00e7\u00e3o e Produ\u00e7\u00e3o). Os scripts de estrutura<br \/>\ns\u00e3o executados pelo flyway ao rodar a pipeline.<\/p>\n<h6><strong>1.2.3 &#8211; PERSISTENCE<\/strong><\/h6>\n<p>Este modulo \u00e9 respons\u00e1vel pelas classes Java de mapeamento objeto relacional das tabelas e seus relacionamentos. No persistence deve ter duas pastas, entities,<br \/>\nonde ficam as entidades mapeadas, e enums, onde ficam os enumerados.<\/p>\n<h6><strong>1.2.4 &#8211; SERVICE<\/strong><\/h6>\n<p>Neste modulo cont\u00e9m todo o fluxo de desenvolvimento das regras de neg\u00f3cio da aplica\u00e7\u00e3o. \u00c9 nele que deve ser criado as Controllers (para servi\u00e7os REST), os DTOs<br \/>\n(para objetos JSON), os EJB&#8217;s (para codifica\u00e7\u00f5es das regras de neg\u00f3cio) e os DAOs (para persistir ou buscar no banco de dados).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/3-pj.png\" alt=\"img\" \/><\/p>\n<h6><b><span data-contrast=\"none\">1.2.5 \u2013 JOB<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h6>\n<p><span data-contrast=\"none\">Este modulo <\/span><span data-contrast=\"none\">possibilita o agendamento de tarefas, as quais ser\u00e3o executadas em hor\u00e1rios pr\u00e9-definidos. Lembrando que este modulo dever\u00e1 existir somente em uma inst\u00e2ncia do WildFly, com isso evitar\u00e1 que as tarefas sejam executadas mais de uma vez devido as inst\u00e2ncias.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-422 size-full\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_1.jpg\" alt=\"\" width=\"402\" height=\"301\" srcset=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_1.jpg 402w, https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_1-300x225.jpg 300w\" sizes=\"auto, (max-width: 402px) 100vw, 402px\" \/><\/p>\n<h6><b><span data-contrast=\"none\">1.2.6 \u2013 SHARED<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:259}\">\u00a0<\/span><\/h6>\n<p><span data-contrast=\"none\">Seu objetivo \u00e9<\/span> <span data-contrast=\"none\">evitar que o M\u00f3dulo Job tenha que fazer uma integra\u00e7\u00e3o para acessar a servi\u00e7os remotos dentro do projeto. Neste modulo \u00e9 utilizado JNDI (Java Naming and Directory Interface), que \u00e9 uma API que permite acesso \u00e0 recursos externos atrav\u00e9s de um nome utilizando o conceito de lookup.<\/span><span data-ccp-props=\"{&quot;134233118&quot;:true,&quot;201341983&quot;:0,&quot;335559739&quot;:160,&quot;335559740&quot;:240}\">\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-423 size-full\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_2.jpg\" alt=\"\" width=\"379\" height=\"362\" srcset=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_2.jpg 379w, https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_2-300x287.jpg 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/p>\n<h5><strong>1.3 &#8211; DMPG-COMMONS<\/strong><\/h5>\n<p>Projeto que centralizar as funcionalidades b\u00e1sicas de todos os sistemas.<\/p>\n<h6><strong>1.3.1 &#8211; PARAMETROS UTIL<\/strong><\/h6>\n<p>Utilizada para recupera os par\u00e2metros do sistema.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/4-pj.png\" alt=\"img\" \/><\/p>\n<h6><strong>1.3.2 &#8211; DPMG API UTIL<\/strong><\/h6>\n<p>Classe utilit\u00e1ria para a realiza\u00e7\u00e3o de integra\u00e7\u00f5es<\/p>\n<h6><strong>1.3.2.1 &#8211; DEPEND\u00caNCIA<\/strong><\/h6>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-424 size-full\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_3.jpg\" alt=\"\" width=\"328\" height=\"122\" srcset=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_3.jpg 328w, https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Screenshot_3-300x112.jpg 300w\" sizes=\"auto, (max-width: 328px) 100vw, 328px\" \/><\/p>\n<h6><strong>1.3.2.2 &#8211; EXEMPLOS<\/strong><\/h6>\n<ul>\n<li>Requisi\u00e7\u00f5es do tipo GET<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/6-pj.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>Para adicionar query param:<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/7-pj.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>Para ignorar a resposta:<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/8-pj.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>Requisi\u00e7\u00f5es tipo POST<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/9-pj.png\" alt=\"img\" \/><\/p>\n<p>Onde:<\/p>\n<table>\n<thead>\n<tr>\n<th><strong>Par\u00e2metro<\/strong><\/th>\n<th><strong>Tipo dado<\/strong><\/th>\n<th><strong>Default<\/strong><\/th>\n<th><strong>Exemplo<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>URL<\/td>\n<td>String<\/td>\n<td><\/td>\n<td><a href=\"http:\/\/dev-10.230.16.76\/unidade\/find-all\">http:\/\/dev-10.230.16.76\/unidade\/find-all<\/a><\/td>\n<\/tr>\n<tr>\n<td>TIMEOUT (segundos)<\/td>\n<td>int<\/td>\n<td>5<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>OBJETO<\/td>\n<td>Object<\/td>\n<td><\/td>\n<td>new Usuario()<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>Para retornar uma resposta do tipo text\/plain :<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/10-pj.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>Requisi\u00e7\u00f5es tipo PUT<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/11-pj.png\" alt=\"img\" \/><\/p>\n<p>Onde:<\/p>\n<table>\n<thead>\n<tr>\n<th><strong>Par\u00e2metro<\/strong><\/th>\n<th><strong>Tipo dado<\/strong><\/th>\n<th><strong>Default<\/strong><\/th>\n<th><strong>Exemplo<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>URL<\/td>\n<td>String<\/td>\n<td><\/td>\n<td><a href=\"http:\/\/dev-10.230.16.76\/unidade\/find-all\">http:\/\/dev-10.230.16.76\/unidade\/find-all<\/a><\/td>\n<\/tr>\n<tr>\n<td>TIMEOUT (segundos)<\/td>\n<td>int<\/td>\n<td>5<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>OBJETO<\/td>\n<td>Object<\/td>\n<td><\/td>\n<td>new Usuario()<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>Requisi\u00e7\u00f5es tipo DELETE<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/12-pj.png\" alt=\"img\" \/><\/p>\n<p>Onde:<\/p>\n<table>\n<thead>\n<tr>\n<th><strong>Par\u00e2metro<\/strong><\/th>\n<th><strong>Tipo dado<\/strong><\/th>\n<th><strong>Default<\/strong><\/th>\n<th><strong>Exemplo<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>URL<\/td>\n<td>String<\/td>\n<td><\/td>\n<td><a href=\"http:\/\/dev-10.230.16.76\/unidade\/find-all\">http:\/\/dev-10.230.16.76\/unidade\/find-all<\/a><\/td>\n<\/tr>\n<tr>\n<td>TIMEOUT (segundos)<\/td>\n<td>int<\/td>\n<td>5<\/td>\n<td>10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>Para adicionar token na requisi\u00e7\u00e3o<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/13-pj.png\" alt=\"img\" \/><\/p>\n<p>Onde:<\/p>\n<table>\n<thead>\n<tr>\n<th>Par\u00e2metro<\/th>\n<th>Tipo dado<\/th>\n<th>Default<\/th>\n<th>Exemplo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>TOKEN<\/td>\n<td>String<\/td>\n<td><\/td>\n<td>Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJydW5vIiwiaWF0IjoxNTE2MjM5MDIyfQ.YDN0wJHLzyzmqdwycv4wgh-RMBwQR4C_0uehWmo_77ZrAB46YnPYmzJJ2Lb36GyyDXDwRP9Bt759hcVmUiGWEg<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4><strong>2 &#8211; PADR\u00c3O DE ARQUITETURA FRONT-END<\/strong><\/h4>\n<p>Os projetos Front-End da institui\u00e7\u00e3o DPMG e baseado no padr\u00e3o de arquitetura \u201cMVC\u201d que melhora a conex\u00e3o entre camadas de dados regras de neg\u00f3cio e a intera\u00e7\u00e3o com usu\u00e1rio,<br \/>\ntamb\u00e9m seguimos os princ\u00edpios do \u201cSOLID\u201ccom \u00eanfase nos dois primeiros princ\u00edpios <strong>\u201cS &#8211; Single-responsibility Principle (Princ\u00edpio da responsabilidade \u00fanica)\u201d e<br \/>\n\u201cO &#8211; Open-closed Principle (Princ\u00edpio do aberto-fechado)\u201d.<\/strong><\/p>\n<p>O padr\u00e3o para criar aplica\u00e7\u00f5es VueJS v2.x e o \u201cclass component\u201d que \u00e9 estendido da pasta \u201cdata\u201d, j\u00e1 no VueJS v3.x utilizamos o composition api o arquivo da pasta \u201cdata\u201d e<br \/>\ndeclarado como uma constante.<\/p>\n<p>Exemplo imagem VueJS v2.x e v3.x:<\/p>\n<p>VueJS 2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/vuejs2.jpg\" alt=\"img\" \/><\/p>\n<p>VueJS 3:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/vuejs3.jpg\" alt=\"img\" \/><\/p>\n<h6><strong>2.2 &#8211; PLUGINS<\/strong><\/h6>\n<p>As rotas s\u00e3o definidas com plugin vue-router para VueJS v2.x e v3.x.<br \/>\nO plugin de armazenamento de estado para VueJS v2.x e vuex, enquanto no VueJS v3.x e o Pinia.<br \/>\nO vue-i18n plugin de internacionaliza\u00e7\u00e3o do VueJS utilizado somente nas vers\u00f5es 3.x do vue.<br \/>\nOs plugins de front-end utilizados s\u00e3o Vuetify para VueJS v2.x e Quasar para v3.x.<\/p>\n<p>Os plugins para cria\u00e7\u00e3o de formul\u00e1rios para vers\u00e3o 3.x do Vue, ser\u00e1 o Vee-validate em conjunto com Yup e Pinia.<\/p>\n<h5><strong>2.3 &#8211; REGRAS PARA CRIA\u00c7\u00c3O DE PASTAS E ARQUIVOS<\/strong><\/h5>\n<p>Todas as pastas e arquivos s\u00e3o criados com letras min\u00fasculas e separadas com h\u00edfen.<br \/>\nTodos arquivos com fun\u00e7\u00f5es especificas como entity devem ser terminados com ponto seguido do nome da pasta, somente no caso de arquivos typescript.<br \/>\nToda estrutura pode sofre adi\u00e7\u00f5es de pasta como \u201cassets\u201d, \u201cutil\u201d ou \u201c@types\u201d entre outras necess\u00e1rias para facilitar o desenvolvimento, por\u00e9m sempre<br \/>\nmantendo a estrutura base e seguindo os padr\u00f5es estabelecidos.<\/p>\n<h6><strong>2.3.1 &#8211; ESTRUTURA DE PASTA<\/strong><\/h6>\n<ul>\n<li><strong>Root<\/strong> \u2013 Arquivos contendo vari\u00e1veis de ambiente, configura\u00e7\u00f5es de lint entre outros arquivos b\u00e1sicos dependendo da aplica\u00e7\u00e3o.<\/li>\n<li><strong>Src<\/strong> \u2013 Arquivos e pastas e iram compor o sistema.<\/li>\n<li><strong>Controllers<\/strong> \u2013 Arquivos e pastas respons\u00e1veis por intermediar as requisi\u00e7\u00f5es enviadas pela camada de intera\u00e7\u00e3o com usu\u00e1rio.<\/li>\n<li><strong>Config<\/strong> \u2013 Todos os arquivos que definem configura\u00e7\u00f5es ou meios de acesso a aplica\u00e7\u00f5es externas.<\/li>\n<li><strong>Services<\/strong> \u2013 Todos os arquivos que conectam a API\u2019s.<\/li>\n<li><strong>Plugins<\/strong> \u2013 Todos os arquivos que que fazem altera\u00e7\u00f5es no software permitindo utiliza\u00e7\u00e3o de fermentas externas como Quasar ou Vuetify.<\/li>\n<li><strong>Models<\/strong> \u2013 Arquivos e pastas que controlam a forma como os dados se comportam por meio das fun\u00e7\u00f5es, l\u00f3gica e regras de neg\u00f3cios estabelecidas.<\/li>\n<li><strong>Entity<\/strong> \u2013 Todas os arquivos que se referem a entidades pr\u00e9-estabelecidas pela regra de neg\u00f3cio.<\/li>\n<li><strong>Shared<\/strong> \u2013 Todas os arquivos que definem implementa\u00e7\u00f5es obrigat\u00f3rias com base nas regras definidas.<\/li>\n<li><strong>Views<\/strong> \u2013 Arquivos e pastas respons\u00e1veis por apresentar informa\u00e7\u00f5es de forma visual ao usu\u00e1rio.<\/li>\n<li><strong>Pages<\/strong> \u2013 Todos os arquivos .vue que iram receber uma rota de acesso.<\/li>\n<li><strong>Components<\/strong> \u2013 Todos os arquivos .vue que n\u00e3o recebem uma rota ou s\u00e3o amplamente utilizados no c\u00f3digo.<\/li>\n<li><strong>Data<\/strong> \u2013 Todos arquivos .ts que ofereceram suporte aos componentes .vue fazendo a comunica\u00e7\u00e3o com controller, quando<br \/>\nutilizamos o framework Vue v2.x todos os componentes ser\u00e3o classes abstratas, no caso do Vue v3.x ser\u00e3o apenas classes.<\/li>\n<li><strong>Styles<\/strong> \u2013 Folhas de estilo .scss ou .css ser\u00e3o utilizadas por todo aplica\u00e7\u00e3o ou apenas um componente especifico.<\/li>\n<\/ul>\n<p>Exemplo na imagem abaixo.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/Estrutura_de_pastas.png\" alt=\"img\" \/><\/p>\n<h5><strong>2.4 &#8211; CONFIGURA\u00c7\u00d5ES FRONT-END<\/strong><\/h5>\n<ul>\n<li>Ecma-version ES2021, ES2020<\/li>\n<li>Typescript<\/li>\n<li>Vite (Apenas Vue v3.x)<\/li>\n<li>Vue-i18n (Apenas Vue v3.x)<\/li>\n<li>Vee-Validate (Apenas Vue v3.x)<\/li>\n<li>Yup (Apenas Vue v3.x)<\/li>\n<li>Quasar (Apenas Vue v3.x))<\/li>\n<li>Pinia (Apenas Vue v3.x))<\/li>\n<li>Vuetify (Apenas Vue v2.x)<\/li>\n<li>Vuex (Apenas Vue v2.x)<\/li>\n<li>Vue-router<\/li>\n<li>Eslint<\/li>\n<li>Prettier<\/li>\n<li>Sass (utilizamos o scss)<\/li>\n<\/ul>\n<h5><strong>2.5 &#8211; PALETA DE CORES<\/strong><\/h5>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/paleta_de_cores.png\" alt=\"img\" \/><\/p>\n<h4><strong>3 &#8211; MOBILE<\/strong><\/h4>\n<ul>\n<li>Os projetos mobiles devem ser com Flutter (vers\u00e3o atual 3.0.5);<\/li>\n<li>A linguagem para desenvolvimento Flutter \u00e9 o Dart (vers\u00e3o atual 2.17.6);<\/li>\n<li>O ambiente deve possuir o JDK 8, para a execu\u00e7\u00e3o do SDK;<\/li>\n<li>A vers\u00e3o do Android SDK deve ser 32.1.0-rc1 ;<\/li>\n<li>As bibliotecas utilizadas no padr\u00e3o\/estrutura BLoC s\u00e3o 8.0.1;<\/li>\n<\/ul>\n<p>\u00c9 importante que os layouts, bot\u00f5es, fontes e \u00edcones estejam de acordo com a Paleta de Cor da DPMG.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/paleta-cor.png\" alt=\"img\" \/><\/p>\n<p>Partes de telas que ser\u00e3o utilizadas em mais de um lugar, dever\u00e3o ser componentizadas, para tornar a manutenibilidade mais eficaz;<\/p>\n<h5><strong>3.2 &#8211; CLEAN ARCHITECTURE<\/strong><\/h5>\n<p>As aplica\u00e7\u00f5es de m\u00e9dia e grande complexidade v\u00eam tomando a Clean Architecture como uma das melhores solu\u00e7\u00f5es, de modo a criar uma arquitetura que seja facilmente escal\u00e1vel, test\u00e1vel e manuten\u00edvel. Sendo assim, entendemos ser a melhor op\u00e7\u00e3o para aplicar nos projetos mobiles da DPMG.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/3.3.png\" alt=\"img\" \/><\/p>\n<h6><strong>3.2.1 &#8211; AS CAMADAS DO APP COM CLEAN ARCHITECTURE<\/strong><\/h6>\n<p>A arquitetura se divide basicamente, nas seguintes camadas:<\/p>\n<p><strong>API \/ Local \/ DB \u2192 Remoto \/ Local (DataSource) \u2192 Reposit\u00f3rio \u2192 Casos de Uso \u2192 BLoC \u2192 View<\/strong><\/p>\n<p>A arquitetura segue as regras de que, cada camada deve se comunicar apenas com seu componente imediato, desta forma, segue conforme o esquema abaixo:<\/p>\n<ul>\n<li>A UI (User Interface) pode se comunicar somente, com a ViewModel;<\/li>\n<li>O BLoC pode se comunicar somente, com o UseCase;<\/li>\n<li>O UseCase pode se comunicar somente, com o Repository;<\/li>\n<li>O Repository pode se comunicar somente, com a DataSource.<\/li>\n<\/ul>\n<h6><strong>3.2.2 &#8211; CAMADA DE APRESENTA\u00c7\u00c3O (PRESENTATION LAYER)<\/strong><\/h6>\n<p>S\u00e3o representadas nesta camada, pelas Views e BLoC:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/3.3.2.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>A View \u00e9 constru\u00edda, utilizando o conceito de Widgets no Flutter, que descrevem como a interface visual deve ser representado, dado sua configura\u00e7\u00e3o e estado;<\/li>\n<li>O BLoC possui regras de neg\u00f3cio e \u00e9 desenvolvida com objetivo de armazenar e gerenciar os dados, sendo eles recebidos<br \/>\npor meio de requisi\u00e7\u00f5es de API, banco de dados, etc.<\/li>\n<\/ul>\n<h6><strong>3.2.3 &#8211; CAMADA DE DOM\u00cdNIO (DOMAIN LAYER)<\/strong><\/h6>\n<p>A composi\u00e7\u00e3o desta camada, \u00e9 feita pelos UseCases e Repositories:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/3.3.3.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>O UseCase \u00e9 respons\u00e1vel por orquestrar o fluxo de dados das entidades e o direcionar para a regra de neg\u00f3cio, com a finalidade de atingir os objetivos que este \u00e9 respons\u00e1vel;<\/li>\n<li>O Repository tem o objetivo de executar a l\u00f3gica de acesso aos dados, sua responsabilidade \u00e9 de obter e verific\u00e1-los<br \/>\nonde est\u00e3o, e decidir onde procurar a cada momento.<\/li>\n<\/ul>\n<h6><strong>3.2.4 &#8211; CAMADA DE DADOS (DATA LAYER)<\/strong><\/h6>\n<p><img decoding=\"async\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/3.3.4.png\" alt=\"img\" \/><\/p>\n<p>Nesta camada se encontram os dados e de onde eles podem ser acessados.<\/p>\n<p>O DataSource \u00e9 a fonte de dados propriamente dita, ou seja, \u00e9 o que a implementa\u00e7\u00e3o executa, para acessar os dados.<\/p>\n<h4><strong>4 &#8211; DOCUMENTO ARQUITETURA DE SOFTWARE \u2014 NODE JS<\/strong><\/h4>\n<p>O node e utilizado como microsservi\u00e7os e websockets, a vers\u00e3o do node e a v18.x\/v20.x. Framework escolhido para trabalhar com mesmo foi NestJS pois ele tem como proposta<br \/>\nfacilitar o desenvolvimento de aplica\u00e7\u00f5es back-end independente do protocolo de comunica\u00e7\u00e3o que elas utilizem, segundo fator e sua documenta\u00e7\u00e3o que nos traz diferentes<br \/>\nformas de estruturar a aplica\u00e7\u00e3o NestJS al\u00e9m de ser rica em detalhes e exemplos, a tornando de f\u00e1cil entendimento. O ORM escolhido foi \u00a0o Prisma. Toda projeto desenvolvido deve possuir documenta\u00e7\u00e3o que e gerada com Swagger. Parte de seguran\u00e7a foi gerar com guard\u2019s que e mesmo conceito dos \u201cguard\u2019s\u201d<br \/>\ndo Angular. O desenvolvimento e baseado na arquitetura \u201cMVC\u201d sendo aplicado tamb\u00e9m os conceitos do \u201cS.O.L.I.D\u201d.<\/p>\n<h5><strong>4.1 &#8211; REGRAS PARA GERA\u00c7\u00c3O DA APLICA\u00c7\u00c3O<\/strong><\/h5>\n<ul>\n<li>Aplica\u00e7\u00f5es devem ser criadas com NestJS, em casos extraordin\u00e1rios onde n\u00e3o se possa gerar uma aplica\u00e7\u00e3o por qualquer<br \/>\nlimita\u00e7\u00e3o t\u00e9cnica ou estrutural deve ser autorizada pelo gestor.<\/li>\n<li>O \u201cORM\u201d utilizado por padr\u00e3o e o Prisma.<\/li>\n<li>Aplica\u00e7\u00e3o deve contemplar o m\u00e1ximo poss\u00edvel dos conceitos do \u201cS.O.L.I.D\u201d.<\/li>\n<li>Toda aplica\u00e7\u00e3o desenvolvida com node deve ser microsservi\u00e7o ou websocket.<\/li>\n<li>Toda pasta com composi\u00e7\u00f5es de nome devem ser separados com h\u00edfen.<\/li>\n<li>Toda pasta a partir da pasta \u201csrc\u201d pode implementar pastas utilit\u00e1rias, desde que a mesma seja coesa em sua cria\u00e7\u00e3o.<\/li>\n<li>Toda aplica\u00e7\u00e3o deve ser protegida com Throttler do NestJs, caso aplica\u00e7\u00e3o n\u00e3o seja feita com o framework deve ser adotar uma solu\u00e7\u00e3o do mesmo tipo.<\/li>\n<\/ul>\n<h5><strong>4.2 &#8211; ESTRUTURA DE PASTA<\/strong><\/h5>\n<ul>\n<li><strong>Root<\/strong> \u2013 Onde ficam configura\u00e7\u00f5es, b\u00e1sicas como arquivos \u201cenv\u201d, \u201clint\u201d entre outros.<\/li>\n<li><strong>Src<\/strong> \u2013 Onde a estrutura da aplica\u00e7\u00e3o ser\u00e1 gerada \u201ccontrollers\u201d, \u201cmodels\u201d e \u201cswagger\u201d tamb\u00e9m e poss\u00edvel criar pastas auxiliares.\n<ul>\n<li><strong>Controllers<\/strong> \u2013 Aqui ficam os respons\u00e1veis por gerenciar a aplica\u00e7\u00e3o contendo pastas para servi\u00e7os com seguran\u00e7a, banco de dados e chamados do client-side.\n<ul>\n<li><strong>Controllers &#8211;<\/strong> Esta pasta cont\u00e9m os controladores do aplicativo NestJS, que s\u00e3o respons\u00e1veis por lidar com as requisi\u00e7\u00f5es HTTP, processar dados e retornar respostas adequadas.<\/li>\n<li><strong>Services<\/strong> \u2013 Servi\u00e7o que receber\u00e1 chamados do client-side, cada service cria uma pasta com nome do servi\u00e7o, gerando um aquivo \u201c.module\u201d e \u201c.service\u201d obrigatoriamente, caso necess\u00e1rio pode receber uma pasta \u201cdto\u201d ou outras pastas auxiliares com m\u00e1ximo de um n\u00edvel. Uma \u201cservice\u201d pode ou n\u00e3o implementar um \u201cguard\u201d.<\/li>\n<li><strong>Models<\/strong> \u2013 Aqui ficam os itens referentes a regra de neg\u00f3cio.\n<ul>\n<li><strong>Shared<\/strong> \u2013 Conte\u00fado obrigat\u00f3rio a ser implementado pelas entidades ou qualquer item que contenha regra de neg\u00f3cio pr\u00e9-definida.<\/li>\n<li><strong>Entity<\/strong> \u2013 Entidades com base nas abstra\u00e7\u00f5es, implementam os itens referentes a mesma contidos na pasta \u201cshared\u201d.<\/li>\n<li><strong>Dto &#8211; <\/strong>Cont\u00e9m classes ou interfaces que definem a estrutura dos dados transferidos entre diferentes partes do aplicativo, como requisi\u00e7\u00f5es HTTP e respostas.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Modules &#8211; <\/strong>Cont\u00e9m os m\u00f3dulos do aplicativo NestJS, que agrupam funcionalidades relacionadas, como rotas, controladores, provedores de servi\u00e7os e outros recursos.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Exemplo da estrutura de pasta:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-493\" src=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/2024-02-20_12-27-111x300.png\" alt=\"\" width=\"111\" height=\"300\" srcset=\"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/2024-02-20_12-27-111x300.png 111w, https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-content\/uploads\/2022\/08\/2024-02-20_12-27.png 229w\" sizes=\"auto, (max-width: 111px) 100vw, 111px\" \/><\/p>\n<h5><strong>4.3 &#8211; TECNOLOGIAS<\/strong><\/h5>\n<ul>\n<li>Ecmaversion 2021, 2020.<\/li>\n<li>Typescript<\/li>\n<li>Node v18.x\/v20.x<\/li>\n<li>NestJs<\/li>\n<li>Prisma<\/li>\n<\/ul>\n","protected":false},"featured_media":0,"parent":0,"menu_order":5,"template":"","class_list":["post-201","v1","type-v1","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-json\/wp\/v2\/v1\/201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-json\/wp\/v2\/v1"}],"about":[{"href":"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-json\/wp\/v2\/types\/v1"}],"wp:attachment":[{"href":"https:\/\/gerais.defensoria.mg.def.br\/metodologia-de-desenvolvimento\/wp-json\/wp\/v2\/media?parent=201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}