Archetype Spring Boot
Tags: architecture, java
Published: 2020-02-19 01:41:13

Olá #devs, conheci o site recentemente através de um <a href="https://github.com/viniciuslcpereira97">amigo</a>, e estou escrevendo aqui um pequeno post sobre archetype no spring boot, esse é um tema pessoal pois existem várias formas e dentre as que existem geralmente cada #dev a adapta as suas necessidades.
Bem recentemente estava conversando com meu amigo <a href="https://github.com/pedrovsn">Pedro</a> hoje na HDI Seguros (esse inicio parecendo música do Raul Seixas =D) sobre archetypes do spring, e mostrei a que estava utilizando para ele e achei que renderia um post legal. Vale lembrar que essa é apenas minha interpretação, talvez algo que você veja aqui faça sentido para você, ou talvez algo que esteja aqui você possa colocar nos comentários e faça sentido para mim, então deixe seu comentário. =)
Bom, começando pela estruturas das pastas dentro do projeto eu gosto de organizá-las da seguinte maneira, ao menos as principais. 

- api
- configuration
- domain
  - bean
  - dto
  - enumerable
  - orm
- exception
- interception
  - implementation
- repository
  - implementation
- service
  - implementation

Algum dos pacotes só de olhar já pode entender o que são mais gostaria de explicar o porque da presença de cada uma delas na aplicação.

- API
Essa é bem simples de explicar, sendo um serviço a aplicação precisa expor algo para alguém, então nesse pacote criamos as classes que serão expostas a quer for consumir o serviço.

- Configuration
Classes que precisamos anotar como configuration ficam nesse pacote, tais como os beans do spring, configurações de dependências como Rabbit, Kafka e etc.

- Domain
Esse pacote é inclui em si alguns outros pacotes, vou explicar um de cada vez para ser mais didático. 
- Bean
A pasta bean existe não para colocar as beans do spring, mas as beans do proprio java, classes que podem sofrer maiores alterações sem impactar nenhum contexto externo, como chama a API ou um banco de dados por exemplo.
- DTO
Esse pacote é para classes que sua mudança causam muito impactos em contexto externo, então sua mudança tem de ser muito bem planejada e devidamente avisada, tais como payload de request e response do serviço.
- Enumerable
Aqui ficam os enums da aplicação, não tem nenhum segredo nisso. =D
- ORM
Esse pacote é para classes que tem comunicação direta com o banco de dados, nessas classes se encontram as anotações do Spring Data, esse pacote também deve ter um certa cautela na sua mudança.

- Exception
Aqui eu coloco as classes de exceção da aplicação, geralmente utilizo as próprias exceções dos status code para pode interceptar os erros pelos status code.

- Integration
Aqui, caso o serviço tenha de usar outro serviço aqui colocamos as classes que vão realizar requisições a outros serviços.

- Interception
Esse pacote é para interceptar todas as exceções da aplicação com um RestControllerAdvice, o real proposito é para que toda e qualquer exceção que aconteça na aplicação seja devolvida com seu devido status code, além de centralizar em um único lugar todas as exceções.

- Service
Essa parte é para regras de negócio do serviço, centralizamos aqui tudo que é importante para nossa aplicação funcionar, é muito importante lembrar que todos os pacotes devem ser totalmente desacoplados, lutamos sempre para que um pacote não dependa do outro, e isso da o gancho para falarmos da repository.

- Repository
Nesse pacote colocamos nossas conexões ao banco de dados, vale lembrar que é muito importante utilizamos interfaces para inversão de dependência entre nossos contextos internos e externos, em um próximo post vamos falar mais sobre esse assunto pois é muito interessante também.

Agradeço a atenção de todos que leram até aqui.

Me sigam
Github: https://github.com/MrSpock182
LinkedIn: https://www.linkedin.com/in/kleber-nunes-699089ab/