Spring Boot

Estrutura e prática Spring Boot framework

Resumo em construção
Voltar

Material complementar:

  • Conteúdo no GitHub: Acesse
  • Curso com certificado na Workover Academy (Criar API REST Spring Boot com Kotlin): Acesse

Spring Boot:

Camada que atua sob framework Spring, simplificando-o e modernizando-o, seguindo padrão MVC. Spring implementa padrão IoC (Inversion of Control), onde os objetos (Spring Beans / Beans) são instanciados automaticamente pelo container do Spring, dispensando criação manual.


Pré-requisitos (Windows):

JDK (Java Development Kit) é kit de ferramentas e bibliotecas para desenvolver aplicações Java. Gradle é automatizador de build moderno que usa linguagem baseada em Groovy ou Kotlin para configurar projetos. Maven é mais antigo que Gradle, gerenciando builds e dependências para projetos Java baseada em estrutura padronizada e arquivos XML de configuração.

  1. JDK: Acesse
    1. Baixar e instalar JDK Oracle
    2. Win + R, digite "SystemPropertiesAdvanced", acessar Variáveis de Ambiente
    3. Aba "Variáveis do sistema", em Novo, criar/editar variáveis:
        Criar:
      • Nome: JAVA_HOME
      • Valor: Caminho da pasta com JDK instalado (Ex: "C:\Program Files\Java\jdk-24")
      • Confirmar criação OK

      • Editar:
      • Nome: Path
      • Clicar em Novo
      • Valor: %JAVA_HOME%\bin
      • Confirmar criação OK
    4. Verificar instalação no CMD, com comando "java -version"
  2. Kotlin compiler: Acesse
    1. Baixar e instalar Kotlin compiler (.zip)
    2. Diretório "C:/", crie pasta "Kotlin", e descompacte o Kotlin dentro dela
    3. Win + R, digite "SystemPropertiesAdvanced", acessar Variáveis de Ambiente
    4. Aba "Variáveis do sistema", editar variável Path: Editar:
      • Nome: Path
      • Clicar em Novo
      • Valor: C:\Kotlin\kotlinc\bin
      • Confirmar criação OK
    5. Verificar instalação: Win + R, digitar CMD, e informar comando "kotlinc -version"
  3. Gradle: Acesse
    1. Baixar e instalar Gradle: site oficial Gradle, Install, Install manually, Step 1, baixar Binary-only
    2. Diretório "C:/", crie pasta "Gradle", e descompacte o Gradle dentro dela
    3. Win + R, digite "SystemPropertiesAdvanced", acessar Variáveis de Ambiente
    4. Aba "Variáveis do sistema", editar variável Path: Editar:
      • Nome: Path
      • Clicar em Novo
      • Valor: C:\Gradle\gradle-VERSAO\bin
      • Confirmar criação OK
    5. Verificar instalação: Win + R, digitar CMD, e informar comando "gradle -v"

Estrutura:

Em breve.


Exemplo projeto:

  1. Em 'start.spring.io', selecione:
    • Project: Gradle - Kotlin
    • Language: Kotlin
    • Spring Boot: 3.5.13
    • Group: com.seuprojeto
    • Artifact: cats
    • Package name: com.seuprojeto.cats
    • Packaging: Jar
    • Configuration: YAML
    • Java: 21
    • Dependencies
      • Spring Web
      • Spring Data JPA
      • Validation
      • H2 Database
      • Spring Boot Dev Tools
    • Generate (extrair zip e acessar projeto com IntelliJ)
  2. Criar banco de dados Oracle (container Docker):
    
    docker pull container-registry.oracle.com/database/free:latest
    docker run -d --name oracle-db -p 1521:1521 -p 5500:5500 -e ORACLE_PWD=SenhaForte123 container-registry.oracle.com/database/free:latest
    
  3. No pacote principal (com.seuprojeto.cats), crie pacotes dentro:
    
    modules.cat.domain.model
    modules.cat.domain.repository
    modules.cat.application.usecase
    modules.cat.infrastructure.persistence.entity
    modules.cat.infrastructure.persistence.repository
    modules.cat.infrastructure.persistence.adapter
    modules.cat.interfaces.rest
    modules.cat.interfaces.rest.dto.request
    modules.cat.interfaces.rest.dto.response
    modules.cat.interfaces.rest.mapper
    
    modules.user.infrastructure.persistence.entity
    modules.user.infrastructure.persistence.repository
    modules.user.infrastructure.security
    
    modules.auth.application.usecase
    modules.auth.domain.model
    modules.auth.domain.repository
    modules.auth.infrastructure.persistence.entity
    modules.auth.infrastructure.persistence.repository
    modules.auth.infrastructure.adapter
    modules.auth.interfaces.rest.dto.request
    modules.auth.interfaces.rest.dto.response
    modules.auth.interfaces.rest.mapper
    
    shared.exception
    shared.config
    shared.security
    
  4. No pacote '.model', criar Model 'Cat.kt':
    
    CÓDIGO AQUI...
    
  5. No pacote '.repository', criar Repository 'CatRepository.kt':
    
    CÓDIGO AQUI...
    
  6. No pacote '.usecase', criar Use Case 'CreateCatUseCase.kt':
    
    CÓDIGO AQUI...
    
  7. No pacote '.persistence.entity', criar Entity 'CatEntity.kt':
    
    CÓDIGO AQUI...
    
  8. No pacote 'modules.user.infrastructure.persistence.entity', criar Entity 'UserEntity.kt':
    
    CÓDIGO AQUI...
    
  9. No pacote 'modules.user.infrastructure.persistence.repository', criar Repository 'UserRepository.kt':
    
    CÓDIGO AQUI...
    
  10. No pacote 'modules.user.infrastructure.security', criar classe de dados customizados 'CustomUserDetailsService.kt':
    
    CÓDIGO AQUI...
    
  11. No pacote 'modules.auth.interfaces.rest.dto.request', criar DTO 'RegisterRequest.kt':
    
    CÓDIGO AQUI...
    
  12. No pacote 'modules.auth.interfaces.rest.dto.request', criar DTO 'LoginRequest.kt':
    
    CÓDIGO AQUI...
    
  13. No pacote 'modules.auth.interfaces.rest.dto.response', criar DTO 'AuthResponse.kt':
    
    CÓDIGO AQUI...
    
  14. No pacote 'modules.auth.interfaces.rest.dto.request', criar DTO 'RefreshTokenRequest.kt':
    
    CÓDIGO AQUI...
    
  15. No pacote 'modules.auth.interfaces.rest.dto.response', criar DTO 'RefreshTokenResponse.kt':
    
    CÓDIGO AQUI...
    
  16. No pacote 'modules.auth.application.usecase', criar Use Case 'AuthUseCase.kt':
    
    CÓDIGO AQUI...
    
  17. No pacote 'modules.auth.application.usecase', criar Use Case 'AuthUseCaseImpl.kt':
    
    CÓDIGO AQUI...
    
  18. No pacote 'modules.auth.interfaces.rest', criar Controller 'AuthController.kt':
    
    CÓDIGO AQUI...
    
  19. No pacote module cat, '.persistence.repository', criar Repository 'JpaCatRepository.kt':
    
    CÓDIGO AQUI...
    
  20. No pacote '.persistence.adapter', criar Adapter 'CatRepositoryImpl.kt':
    
    CÓDIGO AQUI...
    
  21. No pacote '.application.usecase', criar Use Case 'UpdateCatUseCase.kt':
    
    CÓDIGO AQUI...
    
  22. No pacote '.application.usecase', criar Use Case 'DeleteCatUseCase.kt':
    
    CÓDIGO AQUI...
    
  23. No pacote '.application.usecase', criar Use Case 'ListCatsUseCase.kt':
    
    CÓDIGO AQUI...
    
  24. No pacote '.application.usecase', criar Use Case 'GetCatUseCase.kt':
    
    CÓDIGO AQUI...
    
  25. No pacote '.application.usecase', criar Use Case 'AdoptCatUseCase.kt':
    
    CÓDIGO AQUI...
    
  26. No pacote '.application.usecase', criar Use Case 'UnadoptCatUseCase.kt':
    
    CÓDIGO AQUI...
    
  27. No pacote '.rest.dto.request', criar DTO 'CreateCatRequest.kt':
    
    CÓDIGO AQUI...
    
  28. No pacote '.rest.dto.request', criar DTO 'UpdateCatRequest.kt':
    
    CÓDIGO AQUI...
    
  29. No pacote '.rest.dto.response', criar DTO 'CatResponse.kt':
    
    CÓDIGO AQUI...
    
  30. No pacote '.rest.mapper', criar Mapper 'CatDtoMapper.kt':
    
    CÓDIGO AQUI...
    
  31. No pacote '.interfaces.rest', criar Controller 'CatController.kt':
    
    CÓDIGO AQUI...
    
  32. No pacote principal 'com.seuprojeto.cats', criar classe 'Application.kt':
    
    CÓDIGO AQUI...
    
  33. No pacote principal 'com.seuprojeto.cats', remover arquivo padrão 'CatsApplication.kt'
  34. No pacote '.shared.exception', criar classe de erro 'ErrorResponse.kt':
    
    CÓDIGO AQUI...
    
  35. No pacote '.shared.exception', criar classe de exceção 'BusinessException.kt':
    
    CÓDIGO AQUI...
    
  36. No pacote '.shared.exception', criar classe de exceção GlobalExceptionHandler.kt':
    
    CÓDIGO AQUI...
    
  37. No pacote '.shared.config', criar classe de configuração 'OpenApiConfig.kt':
    
    CÓDIGO AQUI...
    
  38. No pacote '.shared.config', criar classe de dados iniciais 'DataInitializer.kt':
    
    CÓDIGO AQUI...
    
  39. No pacote '.shared.security', criar classe de configuração 'SecurityConfig.kt':
    
    CÓDIGO AQUI...
    
  40. No pacote '.shared.security', criar classe de serviço 'JwtService.kt':
    
    CÓDIGO AQUI...
    
  41. No pacote '.shared.security', criar classe de filtro 'JwtAuthenticationFilter.kt':
    
    CÓDIGO AQUI...
    
  42. Em 'src/main/resources', criar arquivo 'application.yml':
    
    CÓDIGO AQUI...
    
  43. Em 'src/main/resources', criar arquivo 'application-dev.yml':
    
    CÓDIGO AQUI...
    
  44. Em 'src/main/resources', criar arquivo 'application-prod.yml' (ideal criar usuário personalizado no Oracle. Nesse caso, foi utilizado usuário padrão):
    
    CÓDIGO AQUI...
    
  45. Em 'build.gradle.kts', adicionar dependência Swagger, JWT e conexão com Oracle DB:
    
    CÓDIGO AQUI...
    
  46. Executar a aplicação (modo dev): ./gradlew bootRun
    • Executar em modo de produção (definir variáveis no comando, ou no dockerfile):
      
      // 1.Criar usuário cats no Oracle DB:
      CREATE USER cats IDENTIFIED BY cats123;
      GRANT CONNECT, RESOURCE TO cats;
      GRANT UNLIMITED TABLESPACE TO cats;
      
      $env:DB_URL="jdbc:oracle:thin:@//localhost:1521/FREEPDB1"
      $env:DB_USER="cats"
      $env:DB_PASSWORD="cats123"
      $env:SPRING_PROFILES_ACTIVE="prod"
      ./gradlew bootRun
      
      // Comando em única linha:
      $env:SPRING_PROFILES_ACTIVE="prod"; $env:DB_URL="jdbc:oracle:thin:@//localhost:1521/FREEPDB1"; $env:DB_USER="cats"; $env:DB_PASSWORD="cats123"; ./gradlew bootRun
      
  47. (Antigo) Conectar banco de dados (H2): http://localhost:8080/h2-console
    • Informar JDBC: jdbc:h2:mem:testdb
  48. Testar Swagger: http://localhost:8080/swagger-ui/index.html
  49. Testar conexão de autenticação: GET http://localhost:8080/api/auth/ping
  50. Registrar usuário (JWT): POST http://localhost:8080/api/auth/register
    
    {
      "username": "mateus",
      "password": "123456"
    }
    
  51. Autenticar usuário (JWT): POST http://localhost:8080/api/auth/login
    
    {
      "username": "mateus",
      "password": "123456"
    }
    
  52. Testar requisições HTTP:
    • Listar gatos (GET): http://localhost:8080/api/cats
      • Authorization: Bearer (informar token)
    • Adicionar gato (POST e Bearer token): http://localhost:8080/api/cats
      
      {
        "name": "Mingau"
      }
      
    • Visualizar gato 1 (GET e Bearer token): http://localhost:8080/api/cats/1
    • Editar gato 1 (PUT e Bearer token): http://localhost:8080/api/cats/1
      
      {
        "name": "Mingau - Atualizado"
      }
      
    • Adotar gato 1 (POST e Bearer token): http://localhost:8080/api/cats/1/adopt
    • Desfazer adoção gato 1 (POST e Bearer token): http://localhost:8080/api/cats/1/unadopt
    • Excluir gato 1 (DELETE e Bearer token): http://localhost:8080/api/cats/1

Elaborado por Mateus Schwede
ubsocial.github.io