Guia de desenvolvimento Java com Spring Boot
Configuração do Ambiente de Desenvolvimento
-
Instale o Java Development Kit (JDK) em sua máquina. Você pode baixá-lo e instalá-lo a partir do site oficial da Oracle ou utilizar uma distribuição OpenJDK.
-
Instale uma IDE (Ambiente de Desenvolvimento Integrado) de sua preferência para desenvolvimento Java. Algumas opções populares incluem IntelliJ IDEA, Eclipse e Spring Tool Suite (baseado no Eclipse e otimizado para desenvolvimento Spring).
-
Instale o Spring Boot CLI (Command Line Interface) se preferir trabalhar com a linha de comando. Você pode baixá-lo do site oficial do Spring Boot.
Criação de um Projeto Spring Boot
-
Crie um novo projeto Spring Boot usando uma IDE ou o Spring Initializr (https://start.spring.io/).
-
Escolha as dependências necessárias para o seu projeto, como Spring Web, Spring Data JPA (para acesso a banco de dados), Spring Security (para segurança), etc.
-
Importe o projeto em sua IDE e configure as dependências e configurações conforme necessário.
Configuração Básica do Projeto
Ao iniciar um projeto Spring Boot, é importante configurar corretamente o ambiente de desenvolvimento e as dependências do projeto. Aqui estão algumas práticas recomendadas para configurar um projeto Spring Boot de forma básica:
- Gradle com Kotlin como Melhor Alternativa ao Maven: Utilize o Gradle com Kotlin como uma alternativa mais moderna e flexível ao Maven para gerenciamento de dependências e construção de projetos. Aqui está um exemplo de um arquivo
build.gradle.ktsconfigurado com dependências do Spring Boot:
plugins {
id("org.springframework.boot") version "2.6.3"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
}
group = "br.com.rea"
version = "1.0-SNAPSHOT"
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.boot:spring-boot-testcontainers")
testImplementation("org.testcontainers:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
tasks.withType<Test> {
useJUnitPlatform()
}
-
Incluindo Dependências por Meio do Spring Starter IO: Use o Spring Initializr para incluir facilmente dependências do Spring Boot em seu projeto. Por exemplo, você pode adicionar as dependências do Spring Web, Spring Data JPA e Spring Security selecionando as opções correspondentes no Spring Initializr e gerando um projeto inicial com as dependências desejadas.
-
Versão 21 do Java como Preferível: Utilize a versão mais recente e estável do Java, como a versão 17, como a preferível para desenvolver aplicativos Spring Boot. Garanta que sua IDE esteja configurada para usar a versão correta do JDK em seu projeto.
-
Domínio das Aplicações como
br.com.rea: Adote uma convenção de nomenclatura consistente para o domínio das suas aplicações, seguindo o padrão de mercado. Por exemplo, você pode definir o pacote base da sua aplicação comobr.com.rea.myapp.
Desenvolvimento de Aplicações
-
Criando Controladores: Crie controladores para definir endpoints da API. Use anotações como
@RestControllerpara definir um controlador REST e@RequestMappingpara mapear endpoints. -
Definindo Entidades e Repositórios: Defina entidades JPA para representar dados no banco de dados e crie repositórios usando Spring Data JPA para acessar esses dados.
-
Serviços: Crie serviços para implementar a lógica de negócios da sua aplicação. Injete repositórios e outras dependências necessárias nos serviços.
-
Configuração de Segurança (Opcional): Se sua aplicação exigir autenticação e autorização, configure a segurança usando Spring Security. Defina configurações de segurança e crie classes de detalhes de usuário (user details) e provedores de autenticação conforme necessário.
Configurações em Geral
As configurações desempenham um papel importante em uma aplicação Spring Boot, permitindo personalizar o comportamento da aplicação, definir beans gerenciados pelo Spring e acessar valores de propriedades externas. Aqui estão algumas práticas recomendadas para lidar com configurações em uma aplicação Spring Boot:
- Definindo Beans com
@Bean: Use a anotação@Beanpara definir beans gerenciados pelo Spring. Isso permite que você crie e configure instâncias de classes e as disponibilize para injeção de dependência em outros componentes.
@Configuration
public class MyConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
- Utilidade da Configuração
@Configuration: Use a anotação@Configurationpara indicar que uma classe contém métodos de configuração de beans do Spring. Isso permite que o Spring Boot carregue automaticamente essas configurações durante a inicialização da aplicação.
@Configuration
public class MyConfiguration {
@Bean
public MyService myService() {
return new MyService();
}
}
- Trabalhando com Injeção de Variáveis com
@Value: Use a anotação@Valuepara injetar valores de propriedades externas em seus componentes Spring. Isso permite que você configure facilmente propriedades como URLs de banco de dados, chaves de API, entre outras.
@Service
public class MyService {
@Value("${myapp.api.url}")
private String apiUrl;
// Métodos do serviço
}
- Utilizando
application.ymlem vez deapplication.properties: Prefira usar o formato YAML (application.yml) para configurar propriedades externas em sua aplicação Spring Boot em vez de usar o formato de propriedades (application.properties). O YAML oferece uma sintaxe mais legível e organizada para definir configurações.
# application.yml
myapp:
api:
url: https://api.example.com
Criando Controladores (Controllers)
Os controladores desempenham um papel crucial em uma aplicação Spring Boot, pois são responsáveis por definir endpoints RESTful e lidar com solicitações HTTP. Aqui estão algumas práticas recomendadas ao criar controladores em uma aplicação Spring Boot:
- Anote os Controladores com
@RestController: Use a anotação@RestControllerpara indicar que uma classe é um controlador RESTful. Isso permite que o Spring Boot trate automaticamente a serialização e desserialização de objetos JSON para as solicitações HTTP.
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
// Métodos do controlador aqui
}
- Anote os Controladores com
@RequestMapping: Sempre use a anotação@RequestMappingpara definir o ponto de partida do recurso REST. Dessa forma os controladores podem centralizar a oferta de recursos do mesmo tipo. Os nomes dos recursos centrais devem refletir a entidade de domínio a que se destina e sempre no plural.
@RestController
@RequestMapping(value = "/usuarios")
public class UserController {
// Métodos do controlador aqui
}
- Defina Endpoints HTTP: Use métodos de instância para definir endpoints HTTP em seu controlador. Anote esses métodos com anotações como
@GetMapping,@PostMapping,@PutMappinge@DeleteMappingpara mapear solicitações HTTP GET, POST, PUT e DELETE, respectivamente.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
// Lógica para recuperar um usuário pelo ID
}
- Sempre utilize
ResponseEntity: A classe utilitáriaResponseEntityauxilia na construção da resposta REST, trazendo uma estrutura completa e padronizada de conteúdo e status http. Ela facilita inclusive na devolução de respostas dependendo do resultado da execução, utilizando a interface javaOptional.
Exemplo de Listagem:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@GetMapping
public ResponseEntity<List<User>> getAll() {
return ResponseEntity.ok(
// Lógica para recuperar usuários
);
}
Neste exemplo uma lista será retornada caso haja valores e uma lista vazia será retornada caso contrário. De qualquer forma o requisitante não ficará sem resposta.
Exemplo de resposta unitária:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.of(
Optional.ofNullable(
// Lógica para recuperar um usuário pelo ID
)
);
}
Neste exemplo, um valor unitário será devolvido e caso não seja encontrado uma resposta 404 será automaticamente gerada pelo Spring.
- Sempre valide os objetos de entrada: Objetos de entrada devem ser POJOs, sendo a melhor forma de utilizados dentro das camadas da aplicação como DTOs. Estes DTOs, devem estar corretamente anotados com as validações necessárias a não permitir a entrada de dados inválidos para as demais camadas.
Exemplo de utilização das anotações de validação:
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
public class UserDTO {
@NotNull(message = "ID não pode ser nulo")
private Long id;
@NotBlank(message = "O nome é obrigatório")
@Size(min = 2, max = 30, message = "O nome deve ter entre 2 e 30 caracteres")
private String name;
@NotBlank(message = "O email é obrigatório")
@Email(message = "Email deve ser válido")
private String email;
}
Exemplo de ativação da funcionalidade de validação em nível de endpoint:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {
// Lógica para salvar o usuário
return new ResponseEntity<>("Usuário criado com sucesso", HttpStatus.CREATED);
}
}
É responsabilidade da camada de Controle a filtragem de dados inválidos.
- Sempre utilize
@ControllerAdvice:@ControllerAdviceé uma anotação poderosa usada para tratar exceções de forma centralizada em toda a aplicação. Ela permite que você defina métodos que serão executados automaticamente quando determinadas exceções forem lançadas pelos seus controladores.
Exemplo de Listagem:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> handleResourceNotFoundException(ResourceNotFoundException ex, WebRequest request) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleGlobalException(Exception ex, WebRequest request) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
É um bom padrão utilizar esta classe para definir a resposta padrão para Exceções Inesperadas e Exceções de Negócio, padronizando respostas com status corretos como 400 em caso de erro de negócios.
- Injeção de Dependência por Meio do Construtor: Prefira a injeção de dependência por meio do construtor em vez do
@Autowired. Isso torna o código mais limpo, legível e testável, seguindo o princípio de inversão de controle (IoC).
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@RestController
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
}
- Evite Lógica de Negócios no Controlador: Mantenha seus controladores simples e focados em lidar com solicitações HTTP e delegue a lógica de negócios para serviços separados. Isso torna seu código mais modular, reutilizável e fácil de testar.
Criando Serviços (Services)
Os serviços desempenham um papel fundamental em uma aplicação Spring Boot, encapsulando a lógica de negócios e facilitando a separação de responsabilidades. Aqui estão algumas práticas recomendadas ao criar serviços em uma aplicação Spring Boot:
- Injeção de Dependência por Meio do Construtor: Prefira a injeção de dependência por meio do construtor em vez do
@Autowired. Isso torna o código mais limpo, legível e testável, seguindo o princípio de inversão de controle (IoC).
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
-
Separação de Responsabilidades: Mantenha seus serviços focados em tarefas específicas e relacionadas à lógica de negócios. Evite incluir lógica relacionada à infraestrutura ou à apresentação em seus serviços, mantendo a separação de responsabilidades e tornando seus serviços mais coesos e reutilizáveis.
-
Importância de Métodos Mnemônicos: Use nomes significativos e mnemônicos para os métodos em seus serviços, seguindo as convenções de nomenclatura Java. Isso torna o código mais legível e compreensível para outros desenvolvedores que podem precisar revisar ou dar manutenção ao seu código no futuro.
public class UserService {
public User getUserById(Long id) {
// Implementação do método
}
public void saveUser(User user) {
// Implementação do método
}
// Outros métodos do serviço
}
- Preocupação com a Complexidade Ciclomática: Evite a complexidade excessiva em seus métodos e classes, especialmente a complexidade ciclomática, que pode tornar o código difícil de entender e manter. Procure dividir métodos complexos em métodos menores e mais simples, seguindo o princípio de responsabilidade única (SRP).
public class UserService {
public List<User> getUsersWithAgeGreaterThan(int age) {
// Implementação do método
}
public List<User> getUsersWithRole(Role role) {
// Implementação do método
}
// Outros métodos do serviço
}
Criando Repositórios (Repositories)
Os repositórios desempenham um papel fundamental em uma aplicação Spring Boot, facilitando o acesso e a manipulação de dados no banco de dados. Aqui estão algumas práticas recomendadas ao criar repositórios em uma aplicação Spring Boot:
- Uso de Projeção com Constructor Query ou Interfaces: Ao recuperar dados do banco de dados, é importante considerar o uso de projeções para evitar o carregamento desnecessário de toda a entidade. Use
Constructor Queryou interfaces para selecionar apenas os campos necessários, reduzindo o tráfego de rede e melhorando o desempenho.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Projeção usando Constructor Query
@Query("SELECT new com.example.dto.UserProjection(u.id, u.name) FROM User u WHERE u.id = :userId")
UserProjection findUserProjectionById(@Param("userId") Long userId);
// Ou projeção usando interfaces
UserProjectionByIdAndName findById(Long id);
}
- Utilização de Text Blocks para Escrita de Queries: Use text blocks (bloco de texto) para escrever consultas SQL mais complexas de forma mais legível e organizada. Os text blocks estão disponíveis a partir do Java 13 e permitem que você insira diretamente consultas SQL no código Java sem a necessidade de concatenar strings.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("""
SELECT u FROM User u
WHERE u.age > :age
AND u.isActive = true
""")
List<User> findActiveUsersWithAgeGreaterThan(@Param("age") int age);
}
- Forma Mais Atual de Passar Parâmetros para as Queries: Utilize o
@Paramou:nome_parametropara passar parâmetros para as queries. Essa é a forma mais atual e recomendada de passar parâmetros, garantindo a segurança contra injeção de SQL e facilitando a legibilidade do código.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Usando @Param
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
// Ou usando :nome_parametro
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(String username);
}
Testando e Executando
-
Testes Unitários e de Integração: Escreva testes unitários e de integração para testar sua lógica de negócios e endpoints da API. Use ferramentas como JUnit e Mockito para escrever e executar testes.
-
Executando o Projeto: Execute o projeto Spring Boot em sua IDE ou usando a linha de comando. O Spring Boot fornece um servidor embutido, tornando o processo de execução simples.
Testando com Testcontainers para Simular o Banco de Dados
Testcontainers é uma biblioteca Java que permite criar e gerenciar contêineres Docker durante os testes de unidade e integração. Isso é especialmente útil para simular o banco de dados em testes, garantindo que o ambiente de teste seja o mais próximo possível do ambiente de produção. Aqui estão os passos para usar Testcontainers em seus testes com Spring Boot:
- Adicione as Dependências do Testcontainers: No arquivo
build.gradle.ktsoupom.xmldo seu projeto, adicione as dependências necessárias para Testcontainers. Por exemplo, no Gradle:
dependencies {
testImplementation("org.testcontainers:testcontainers:1.16.3")
testImplementation("org.testcontainers:junit-jupiter:1.16.3")
// Dependências específicas para o banco de dados que você deseja testar, como PostgreSQL, MySQL, etc.
}
- Escreva Testes Utilizando Testcontainers: Escreva testes de unidade ou integração que usem Testcontainers para iniciar um contêiner Docker com o banco de dados desejado antes dos testes e encerre o contêiner após os testes. Aqui está um exemplo de teste que usa um contêiner PostgreSQL:
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.beans.factory.annotation.Value;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@Testcontainers
@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserRepositoryIntegrationTest {
@Container
private static final PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer<>("postgres:latest")
.withDatabaseName("test")
.withUsername("test")
.withPassword("test");
@Value("${spring.datasource.url}")
private String dataSourceUrl;
@Test
public void testSaveUser() {
// Lógica do teste aqui
}
}
- Configuração do Banco de Dados no
application.yml: Configure oapplication.ymldo seu projeto Spring Boot para usar o banco de dados do Testcontainers durante os testes. Por exemplo, para usar o PostgreSQL:
spring:
datasource:
url: jdbc:tc:postgresql:///test
username: test
password: test
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
- Execute os Testes: Execute os testes normalmente usando sua IDE ou ferramenta de build preferida. Testcontainers iniciará automaticamente o contêiner Docker com o banco de dados necessário antes dos testes e encerrará o contêiner após a conclusão dos testes.
Observando e debugando
A observabilidade em um microserviço Spring Boot é crucial para monitorar, debugar, e manter a aplicação em funcionamento de maneira eficiente. A observabilidade inclui logging, tracing e métricas, todos essenciais para entender o comportamento da aplicação.
- Logging com Logback: Logback é uma implementação popular do SLF4J (Simple Logging Facade for Java) usada frequentemente com Spring Boot para logging. A configuração do Logback pode ser feita usando um arquivo XML (logback.xml).
<configuration>
<!-- Define the log level for the application -->
<logger name="com.example" level="DEBUG"/>
<!-- Console appender configuration -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- File appender configuration -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Daily rollover -->
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- Keep 30 days worth of history -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Root logger configuration -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
- Utilizando o log: Após a configuração do logback é possível utiliza-lo para declarar informações durante a execução do código.
Por meio da anotação
@Slf4ja classe estáticalogestará disponível para utilização dos métodos de declaração, cada um oferecendo um nível de criticidade.
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/api")
public class LoggingController {
@GetMapping("/log")
public String logExample() {
log.info("Endpoint /log foi acessado");
log.debug("Mensagem de debug para o endpoint /log");
return "Logging Example";
}
}
É de suma importancia que os logs sejam utilizados com parcimonia. O uso exagerado dos logs pode acarretar em custos e dificuldades de análise corretiva.
- Tracing com Micrometer: Tracing ajuda a monitorar e rastrear a execução das requisições em uma arquitetura de microserviços, facilitando a identificação de problemas de desempenho e gargalos.
A dependencia
micrometer-tracing-bridge-braveintegra automaticamente o suporte ao tracing distribuído nos aplicativos Spring Boot.
Basta incluir a dependencia:
dependencies {
implementation("io.micrometer:micrometer-tracing-bridge-brave")
}
- Monitoramento e métricas com Actuator: O Spring Boot Actuator fornece endpoints que permitem monitorar e gerenciar a aplicação. Ele oferece métricas, informações de saúde, e mais.
Incluindo a dependencia:
dependencies {
implementation("org.springframework.boot:spring-boot-starter-actuator")
}
Configurando os endpoints disponíveis:
management:
endpoints:
health:
show-details: always
web:
exposure:
include: *
Após esta configuração, é possível acessar endpoints como /actuator/health, /actuator/metrics, /actuator/env, etc.
- Implementando o próprio heath-check: Por vezes é necessário verificar os recursos que a aplicação utiliza estão saudáveis para oferecer uma informação mais consistente a respeito da disponibilidade da própria aplicação. O Actuator oferece uma interface simples para a construção de uma verificação detalhada da saúda do serviço.
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HealthConfig {
@Bean
public HealthIndicator exampleHealthIndicator() {
return () -> Health.up().withDetail("example", "All systems operational").build();
}
}
Padrões de nomenclatura
A padronização dos nomes de métodos em projetos Java é crucial para manter o código limpo, compreensível e fácil de manter. Deve ser utilizado o padrão de nomes e comentários em:
Em Inglês:
- Padrão Internacional: O inglês é amplamente utilizado na comunidade de desenvolvimento, o que facilita a colaboração com desenvolvedores internacionais e a utilização de bibliotecas e frameworks que já seguem essa convenção.
- Consistência com Frameworks: Muitos frameworks Java (incluindo Spring) utilizam nomes em inglês, então seguir essa convenção pode tornar a integração mais natural.
- Documentação e Exemplos: A maioria da documentação e exemplos encontrados online estará em inglês, o que pode ser uma vantagem.
Nomeação de Métodos por Camada
Repositories
Na camada de repositórios, os métodos geralmente remetem a operações específicas no banco de dados. Nomes comuns incluem: - findBySomething: Busca por um ou mais atributos. - save: Salva uma entidade. - deleteById: Deleta uma entidade pelo ID. - existsBySomething: Verifica a existência de uma entidade com base em um atributo. - count: Conta o número de entidades.
Exemplos:
- findByUsername(String username)
- save(User user)
- deleteById(Long id)
- existsByEmail(String email)
Service
Na camada de serviço, os métodos geralmente representam operações de negócios. Nomes comuns incluem: - getSomething: Recupera algo. - createSomething: Cria algo. - updateSomething: Atualiza algo. - deleteSomething: Deleta algo. - processSomething: Processa alguma informação.
Exemplos:
- getUserById(Long id)
- createUser(UserDto userDto)
- updateUser(Long id, UserDto userDto)
- deleteUser(Long id)
- processOrder(OrderDto orderDto)
Controller
Na camada de controle, os métodos geralmente representam endpoints de API e seguem convenções de operações HTTP. Nomes comuns incluem: - get: Para operações HTTP GET. - post: Para operações HTTP POST. - put: Para operações HTTP PUT. - delete: Para operações HTTP DELETE.
Exemplos:
- getUser(Long id) (HTTP GET)
- createUser(UserDto userDto) (HTTP POST)
- updateUser(Long id, UserDto userDto) (HTTP PUT)
- deleteUser(Long id) (HTTP DELETE)
Boas Práticas
- Consistência: Independentemente de escolher português ou inglês, mantenha a consistência em todo o projeto.
- Clareza: Nomes de métodos devem ser descritivos e refletir claramente a operação realizada.
- Padrões de Nomenclatura: Siga as convenções de nomenclatura do Java (camelCase para métodos e variáveis, PascalCase para classes).
Implantação e Gerenciamento
-
Empacotamento e Implantação: Empacote sua aplicação Spring Boot em um arquivo JAR executável usando o plugin Spring Boot Maven ou Gradle. Você pode implantar o arquivo JAR em servidores de aplicativos, contêineres Docker ou em plataformas de nuvem.
-
Monitoramento e Gerenciamento: Use ferramentas de monitoramento e gerenciamento como Spring Boot Admin, Actuator e outros para monitorar e gerenciar o desempenho e a saúde da sua aplicação em produção.