{"id":24522125,"url":"https://github.com/helpdeveloper/java-modular-architecture","last_synced_at":"2025-06-22T19:05:56.400Z","repository":{"id":40402739,"uuid":"349528592","full_name":"helpdeveloper/java-modular-architecture","owner":"helpdeveloper","description":"[JAVA] Projeto exemplo de uma arquitetura modular em Java","archived":false,"fork":false,"pushed_at":"2024-08-29T18:38:01.000Z","size":1321,"stargazers_count":129,"open_issues_count":7,"forks_count":19,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-22T19:04:36.248Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/helpdeveloper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-19T19:03:52.000Z","updated_at":"2024-12-07T08:53:09.000Z","dependencies_parsed_at":"2025-02-27T16:31:32.227Z","dependency_job_id":"04dc491e-86c0-4752-8028-0c4cb662495b","html_url":"https://github.com/helpdeveloper/java-modular-architecture","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/helpdeveloper/java-modular-architecture","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helpdeveloper%2Fjava-modular-architecture","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helpdeveloper%2Fjava-modular-architecture/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helpdeveloper%2Fjava-modular-architecture/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helpdeveloper%2Fjava-modular-architecture/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/helpdeveloper","download_url":"https://codeload.github.com/helpdeveloper/java-modular-architecture/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helpdeveloper%2Fjava-modular-architecture/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261348269,"owners_count":23145305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-22T03:18:18.718Z","updated_at":"2025-06-22T19:05:51.390Z","avatar_url":"https://github.com/helpdeveloper.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Issues](https://img.shields.io/github/issues/helpdeveloper/java-modular-architecture.svg)\n![Forks](https://img.shields.io/github/forks/helpdeveloper/java-modular-architecture.svg)\n![Stars](https://img.shields.io/github/stars/helpdeveloper/java-modular-architecture.svg)\n![Release Version](https://img.shields.io/github/release/helpdeveloper/java-modular-architecture.svg)\n![WorkFlow](https://github.com/helpdeveloper/java-modular-architecture/workflows/Java%20CI%20with%20Maven/badge.svg)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/d492d9f4f03941f1aadfb4094536ef76)](https://www.codacy.com/gh/helpdeveloper/java-modular-architecture/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=helpdeveloper/java-modular-architecture\u0026amp;utm_campaign=Badge_Grade)\n[![Coverage Status](https://coveralls.io/repos/github/helpdeveloper/java-modular-architecture/badge.svg?branch=main)](https://coveralls.io/github/helpdeveloper/java-modular-architecture?branch=main)\n# Arquitetura modular\n\nO objetivo do bom design de software, como já diria Robert C. Martin, em seu livro 'Clean Architecture: A Craftsman's Guide to Software Structure and Design', é minimizar os recursos humanos necessários para construir e manter um determinado sistema.\n\nEsse projeto é inspirado em situações e dificuldades reais já vivenciadas que nos permitiu ter uma visão um pouco mais abrangente sobre como ter e construir uma arquitetura duradoura. \"The only way to go fast, is to go well.\" - Robert C. Martin\n\n## Modelo proposto\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/arch.png\" height=\"350\"\u003e\n\u003c/p\u003e\n\n## Foco no negócio\n\n### domain\nA camada mais restrita de todas possui o mapeamento de regras e restrições do domínio do negócio.\n\n### use-case\nDetermina o comportamento da funcionalidade exigida, no caso, o use case será o orquestrador do domínio.\n\n## Adaptadores\n\n### input\nCamada de apresentação do sistema, nela, por exemplo, iremos fornecer nossos end-points.\n\n### output\nTodo acesso a dados seja banco e/ou api's expostos pelas 'interfaces' do Use Case devem ser implementadas nessa camada.\n\n## Testabilidade\n\nFacilidade na execução dos testes com uma melhor granularidade.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/tests.png\" height=\"350\"\u003e\n\u003c/p\u003e\n\n\n### Unitários\n- [JUnit5](https://junit.org/junit5/)\n- [Mockito](https://site.mockito.org)\n- [AssertJ](https://assertj.github.io/doc/)\n- [Mutação](https://pitest.org)\n- [Cobertura de código (linha e condições)](https://www.eclemma.org/jacoco/)\n\n### Aceitação (acceptance-test)\nTeste do ponto de vista de quem irá consumir, sempre buscando o mais perto de produção.\n\n#### O que tem:\n- [Docker](https://www.docker.com)\n- [TestContainers](https://www.testcontainers.org)\n- [RestAssured](https://rest-assured.io)\n- [WireMock](http://wiremock.org)\n- [Flyway](https://flywaydb.org)\n\n#### O que não tem:\n- Framework (Spring ou quarkus)\n\n# Fluxo de dependências das camadas\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/flow.png\" height=\"500\"\u003e\n\u003c/p\u003e\n\n# Executando o projeto\n\nO Projeto conta com uma stack configurada no docker-compose completa.\nFornecendo toda infraestrutura necessária para o desenvolvedor.\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/stack.png\" height=\"250\"\u003e\n\u003c/p\u003e\n\n### Requerido\n\n- Java 17+\n- Maven 3+\n- docker\n- docker-compose\n\n## Build do projeto, já com todos os testes unitários e os testes de aceitação\n\nO framework é definido pelo profile, sendo que o default é do Quarkus.\n\n#### Quarkus\n\n```bash\nmvn clean install -Pquarkus\n# or by default:\nmvn clean install\n```\n\n#### Spring boot\n\n```bash\nmvn clean install -Pspring\n```\n\n## Gerando imagem docker com o Quarkus\n```bash\ndocker build  -t helpdev/app-quarkus-jvm .\n```\n\n## Gerando imagem docker com o Spring\n```bash\ndocker build  -t helpdev/app-spring-jvm .\n```\n\n## Iniciando serviço\n\n*O comando sobe toda infraestrutura necessária para a aplicação*\n```bash\ndocker-compose -f .docker-compose/stack.yml up\n```\n\n*Agora podemos iniciar nossa aplicação*\n\nQuarkus:\n```bash\ndocker-compose -f .docker-compose/quarkus-app.yml up\n```\n\nSpring:\n```bash\ndocker-compose -f .docker-compose/spring-app.yml up\n```\n\n## Consumindo API\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/openapi.png\" height=\"150\"\u003e\n\u003c/p\u003e\n\nPara ter uma 'interface' de fácil com o OpenAPI consumido usamos o [RapiDoc](https://mrin9.github.io/RapiDoc/).\n\nBasta acessar [Endereço local](http://localhost:5000) e já pode testar as APIs\n- http://localhost:5000\n\n## Rodando teste de carga\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/k6.png\" height=\"150\"\u003e\n\u003c/p\u003e\n\nPara quem ainda não conhece o [k6](https://k6.io/) é uma ferramenta para testes de carga, basta [Instalar o K6](https://k6.io/docs/getting-started/installation) e executar o comando:\n\n```bash\nk6 run  k6/script.js\n```\n\nO tempo de execução do K6 e quantidade de 'execuções' é configurável, basta alterar o [Script do K6](/k6/script.js).\n\n## Monitorando aplicação\n\n### Observabilidade\nSaber como a aplicação está se comportando e métricas\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/grafana.png\" height=\"150\"\u003e\n\u003c/p\u003e\n\nA combinação poderosa entre o [Grafana](https://grafana.com/) e o [Prometheus](https://prometheus.io/) permite gráficos e alerta configuráveis.\nAcessando o [Grafana Local](http://localhost:3000) já basta navegar até o dashboard précadastro e ter uma amostrado dos dados da aplicação e das ferramentas.\n- http://localhost:3000\n    - login: *admin*\n    - senha: *admin*\n\nJá o [Promehteus Local](http://localhost:9090) só acessar o link (sem login):\n- http://localhost:9090\n\n### Acessando o banco de dados\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./images/adminer.png\" height=\"150\"\u003e\n\u003c/p\u003e\n\nAo acessar o [Adminer](http://localhost:5000/adminer) é possível executar 'scripts' SQL além de adicionar e alterar dados dentro das tabelas.\n- http://localhost:5000/adminer\n    - servidor: *sampledb*\n    - usuário: *user*\n    - senha: *pass123*\n    - base: *sample*\n\n# Links\n\n- [Apresentação em slides - Jornada Colaborativa Summit 2021](https://docs.google.com/presentation/d/1rIwdL6hhTcmWSujE3tRd9VxKhE3RKwta0krmwRU08_Y/edit?usp=sharing)\n- [Artigo - Criando uma aplicação modular muito além do Clean Architecture](https://medium.com/luizalabs/criando-uma-aplica%C3%A7%C3%A3o-modular-muito-al%C3%A9m-do-clean-architecture-5dde3687c5d6)\n\n# Desenvolvedores\n\n**Alisson Medeiros**\n- LinkedIn - https://www.linkedin.com/in/alisson-medeiros-8bb67830/\n- GitHub - https://github.com/AlissonMedeiros\n- Email - alisson.medeiros@gmail.com\n\n**Guilherme Biff Zarelli**\n- Blog/Site - https://helpdev.com.br\n- LinkedIn - https://linkedin.com/in/gbzarelli/\n- GitHub - https://github.com/gbzarelli\n- Medium - https://medium.com/@guilherme.zarelli\n- Email - gbzarelli@helpdev.com.br\n\n# Contribua\n\nPull Requests são bem-vindos. Para mudanças importantes, abra uma 'issue' primeiro para discutir o que você gostaria de mudar.\nCertifique-se de atualizar os testes conforme apropriado. \n\n## Licence\n\n[Apache-2.0](https://choosealicense.com/licenses/apache-2.0/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelpdeveloper%2Fjava-modular-architecture","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhelpdeveloper%2Fjava-modular-architecture","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelpdeveloper%2Fjava-modular-architecture/lists"}