
Inicie sua jornada com o curso de NestJS para API REST através de uma visão geral. Nesta breve introdução, você aprenderá o que esperar ao longo das aulas, os principais objetivos do curso, e como NestJS pode facilitar o desenvolvimento de aplicações web com uma arquitetura modular e escalável. Descubra os benefícios de utilizar o NestJS para criar APIs robustas e modernas.
Para seguir o Curso de NestJS Completo Do Básico ao Avançado, o aluno precisará instalar o Node.js (versão 16 ou superior) e o editor de código Visual Studio Code (VS Code) em Windows, macOS e Linux.
O @nestjs/cli facilita a criação e manutenção de projetos NestJS, gerando componentes e iniciando o servidor. É essencial para configurar projetos, gerar arquivos e gerenciar o desenvolvimento.
Explore a estrutura de arquivos gerados automaticamente pelo NestJS CLI. Entenda o propósito de cada arquivo essencial, como app.module.ts, main.ts e outros, e veja como eles se encaixam para formar a base de uma aplicação NestJS robusta. Domine a organização dos seus projetos com essa aula detalhada.
Nesta aula, você vai explorar o coração de uma aplicação NestJS: o arquivo main.ts. Entenda como a função bootstrap() inicializa a aplicação e como o NestFactory cria o servidor HTTP. Também aprenderá a configurar a porta do aplicativo para garantir que ele esteja rodando corretamente no ambiente de desenvolvimento.
Aprenda a criar seu próprio módulo no NestJS, seja de forma manual ou utilizando o Nest CLI. Nesta aula prática, você verá como os módulos ajudam a organizar sua aplicação e a estrutura fundamental de um projeto modular com NestJS. Crie módulos reutilizáveis e escaláveis, dominando a arquitetura modular do framework.
Nesta breve aula, você aprenderá onde encontrar todo o código do curso no GitHub. Com o repositório disponível, você pode acompanhar o desenvolvimento das aulas, clonar o projeto e contribuir com melhorias ou sugestões. Acesse os exemplos práticos e veja como aplicar os conceitos discutidos no curso.
Entenda os fundamentos do protocolo HTTP, incluindo URLs, recursos e métodos de solicitação. Nesta aula, você aprenderá como o HTTP é utilizado para a comunicação entre o cliente e o servidor, com ênfase no método GET. Compreender esses conceitos é essencial para trabalhar com APIs no NestJS.
Dando sequência à aula anterior, você vai aprofundar seu conhecimento sobre requisições HTTP e aprender a utilizar a extensão Rest Client do VS Code. Veja como essa ferramenta pode facilitar a interação com APIs diretamente do seu editor de código, testando endpoints e visualizando respostas em tempo real.
Descubra como criar seu primeiro controller no NestJS, responsável por manipular solicitações HTTP. Nesta aula, você aprenderá a criar controllers manualmente ou usando o NestJS CLI, entendendo como eles se conectam com os serviços (providers) para atender às requisições do cliente.
Aprenda a criar e utilizar services (ou providers) no NestJS, entendendo o conceito de injeção de dependências. Nesta aula, você verá como os services fornecem a lógica de negócios para sua aplicação e como o NestJS facilita a gestão de dependências, garantindo um código mais modular e escalável.
Nesta aula prática, você vai criar um novo módulo e controlador para sua aplicação NestJS. Ao reforçar os conceitos de modularidade e estruturação de controladores, você consolidará sua habilidade em organizar e expandir sua aplicação, seguindo as melhores práticas do framework.
Nesta aula rápida, você entenderá a importância de utilizar nomes em inglês no desenvolvimento de aplicações com NestJS. O uso do inglês é uma prática recomendada em projetos globais, pois facilita a leitura e colaboração entre desenvolvedores de diferentes países e culturas.
Descubra como criar parâmetros dinâmicos em rotas no NestJS usando o decorator @Get(':id'). Nesta aula, você aprenderá a construir rotas que aceitam identificadores variáveis, permitindo acessar recursos específicos e personalizados em sua aplicação.
Nesta aula, você entenderá como utilizar o decorator @Param para acessar e manipular valores dos parâmetros de rotas no NestJS. Aprenda a extrair informações dinâmicas das URLs e integrá-las em suas lógicas de processamento de dados.
Explore o método HTTP POST e o decorator @Post para criar novas rotas de inserção de dados no NestJS. Esta aula aborda como configurar endpoints que permitem adicionar novos recursos à sua aplicação, facilitando a criação de dados dinâmicos.
Aprenda a utilizar o decorator @Body para acessar e processar dados enviados no corpo das requisições HTTP POST. Nesta aula, você verá como capturar e validar informações enviadas pelo cliente para operações de criação e atualização de recursos.
Nesta aula, você explorará o decorator HttpCode e o Enum HttpStatus para gerenciar os códigos de status das respostas HTTP em sua aplicação NestJS. Descubra como enviar respostas apropriadas para diferentes situações e melhorar a comunicação com o cliente.
Veja como criar rotas para atualizar recursos usando os métodos HTTP PATCH e PUT, junto com os decorators apropriados no NestJS. Esta aula ensina como implementar funcionalidades de atualização de dados, garantindo que suas APIs possam modificar registros existentes.
Aprenda a criar rotas para deletar recursos usando o método HTTP DELETE e o decorator @Delete no NestJS. Nesta aula curta, você entenderá como implementar a lógica para remoção de dados, garantindo operações seguras e eficientes de exclusão em sua aplicação.
Entenda como usar parâmetros de consulta (query parameters) para implementar a paginação em suas APIs NestJS. Esta aula mostra como passar parâmetros na URL para controlar a quantidade e a página dos dados retornados, melhorando a eficiência da sua aplicação.
Aprenda a configurar o Visual Studio Code (VS Code) com temas, Eslint e Prettier para garantir um código uniforme e limpo. Nesta aula, você descobrirá como estas ferramentas ajudam a manter padrões de codificação consistentes e a melhorar a qualidade do seu código.
Nesta aula, você criará o provider RecadosService no NestJS, que será responsável pela lógica de negócios para manipulação de recados. Descubra como configurar e integrar services para gerenciar a funcionalidade principal de sua aplicação.
Aprenda a criar uma Entity Recado e a completar a implementação do service para armazenamento em memória. Esta aula abrange a definição de entidades e a configuração de services para realizar operações de CRUD em uma base de dados temporária.
Explore como utilizar HttpException e NotFoundException para lidar com erros e exibir mensagens apropriadas em suas APIs NestJS. Nesta aula, você aprenderá a tratar exceções e fornecer feedback útil para os clientes em caso de falhas na aplicação.
Introdução ao conceito de DTOs (Data Transfer Objects) e como eles são usados para transportar, validar e transformar dados em aplicações NestJS.
Como validar dados de entrada em NestJS utilizando useGlobalPipes, ValidationPipe e a biblioteca class-validator.
Aplicação do PartialType para validar campos em DTOs de atualização.
Configuração de opções de segurança na ValidationPipe para permitir ou negar dados inesperados.
Utilização do transform no ValidationPipe e configuração dos pipes padrão para parâmetros.
Passos para instalar e configurar o PostgreSQL 16 e o DBeaver CE no Windows.
Configuração do TypeOrmModule para usar o PostgreSQL no NestJS.
Criação da primeira entity usando o TypeORM no NestJS e definição da tabela no banco de dados PostgreSQL.
Como utilizar InjectRepository e Repository para manipular entidades na tabela do banco de dados.
Operações básicas de criação e exclusão de entidades usando o Repository.
Atualização de entidades na tabela usando o Repository.
Criação de um módulo para gerenciar a entidade "Pessoa" na aplicação.
Implementação do CRUD para a entidade "Pessoa", incluindo a criação com validação de e-mail único.
Implementação das operações de leitura e exclusão para a entidade "Pessoa".
Implementação da operação de atualização para a entidade "Pessoa".
Configuração de relacionamentos entre as entidades "Recado" e "Pessoa" no NestJS.
Como injetar dependências entre módulos usando imports e exports.
Implementação de um relacionamento ManyToOne entre a entidade "Recado" e "Pessoa".
Configuração de onDelete e onUpdate com CASCADE para propagar alterações em relacionamentos.
Alteração do serviço de atualização para incluir informações relacionadas.
Implementação e validação de DTOs para paginação com TypeORM.
Saiba onde acessar a documentação oficial do TypeORM e do NestJS/TypeORM para tirar dúvidas e se aprofundar no uso dessas ferramentas no desenvolvimento de aplicações.
Descubra como e quando utilizar Pipes para validação e transformação de dados no NestJS, garantindo que os dados de entrada sejam sempre corretos.
Aprenda a utilizar Interceptors para adicionar cabeçalhos personalizados às respostas HTTP, melhorando o controle e a segurança da sua API.
Veja como usar o operador tap com Interceptors no NestJS para monitorar e manipular os dados antes e depois da execução de um método, proporcionando maior controle sobre o fluxo de dados.
Descubra como utilizar Interceptors para capturar e modificar exceções em nível global na sua aplicação NestJS, permitindo o tratamento centralizado de erros.
Aprenda a implementar um cache simples usando Interceptors no NestJS, otimizando a performance de sua aplicação ao armazenar respostas temporárias de requisições repetitivas.
Veja como utilizar o operador map em Interceptors para modificar os dados de resposta antes que sejam enviados ao cliente, permitindo maior flexibilidade na manipulação de respostas.
Entenda como funciona a injeção de dependências em Interceptors, Pipes e outras classes no NestJS, garantindo que as funcionalidades estejam disponíveis em toda a aplicação.
Saiba como usar Interceptors para implementar a lógica de autorização baseada em tokens JWT, garantindo que apenas usuários autenticados possam acessar certas rotas da aplicação.
Explore o conceito de Middleware no NestJS, aprendendo como ter acesso direto aos objetos de requisição e resposta, permitindo a manipulação avançada de dados.
Descubra como usar Exception Filters para capturar e tratar exceções específicas ou globais em sua aplicação NestJS, melhorando a experiência do usuário e o controle de erros.
Aprenda a usar Guards para controlar o acesso a rotas no NestJS, permitindo ou negando acesso com base em lógica personalizada, como autenticação ou permissões.
Veja como manter seu código organizado e limpo, removendo componentes desnecessários e mantendo boas práticas de desenvolvimento ao longo do projeto.
Aprenda a criar e utilizar decoradores personalizados de parâmetros no NestJS, permitindo maior controle e flexibilidade na leitura e manipulação de dados de rota.
Entenda o básico do padrão de injeção de dependências no NestJS, que é essencial para criar uma arquitetura modular e altamente reutilizável.
Saiba como encapsular módulos e exportar funcionalidades de forma eficiente, além de resolver problemas de dependência circular com o uso de forwardRef.
Veja como usar useClass e useValue para fornecer tokens e valores distintos em Providers, facilitando a customização de serviços injetados.
Entenda como injetar valores que não são classes utilizando o decorador Inject e a propriedade provide no NestJS, permitindo maior flexibilidade na entrega de dados.
Aprenda a utilizar classes abstratas e interfaces com provide e useClass para implementar padrões de projeto, promovendo maior escalabilidade e organização no código.
Explore como usar useFactory e inject para criar lógica avançada na injeção de dependências, permitindo controle refinado sobre a criação de instâncias.
Veja como gerenciar providers assíncronos utilizando useFactory com async e await, permitindo que serviços dependam de operações assíncronas antes de serem inicializados.
Aprenda a criar módulos dinâmicos no NestJS, que podem receber configurações e modificar seu comportamento com base em diferentes parâmetros de inicialização.
Entenda os diferentes escopos de providers no NestJS, como Scope.DEFAULT, Scope.REQUEST e Scope.TRANSIENT, e como eles afetam a criação e reutilização de instâncias.
Veja exemplos práticos de como utilizar os diferentes escopos de providers no NestJS, garantindo a configuração adequada para cada caso de uso.
Aprenda como instalar o pacote @nestjs/config e configurar variáveis de ambiente (.env) no NestJS, garantindo uma configuração segura e flexível para diferentes ambientes.
Descubra como e quando carregar arquivos de variáveis de ambiente (.env) no NestJS, utilizando envFilePath e ignoreEnvFile para definir as configurações corretamente.
Veja como usar o pacote @hapi/joi para validar as variáveis de ambiente, garantindo que os dados sensíveis e configurações estejam sempre corretos e seguras.
Aprenda a usar o ConfigService do ConfigModule no NestJS para acessar os valores das variáveis de ambiente (.env) de maneira centralizada e eficiente.
como utilizar o ConfigService diretamente em seus módulos NestJS para obter valores de variáveis de ambiente e garantir uma configuração dinâmica.
Entenda como dividir suas configurações em seções menores com namespaces, usando registerAs e ConfigType para organizar melhor as variáveis de ambiente.
Descubra se vale a pena separar as configurações da sua aplicação NestJS em um módulo específico, com base no tamanho e na complexidade da aplicação.
Aprenda a criar um sistema de hashing de senhas com Bcrypt, implementando um módulo de autenticação seguro e eficaz no NestJS.
Veja como salvar de maneira segura o hash da senha de um usuário no banco de dados ao criar um novo registro de usuário na sua aplicação NestJS.
Implemente o AuthService e o AuthController, responsáveis por gerenciar o login dos usuários e o processamento de tokens JWT na sua aplicação.
Aprenda a autenticar usuários com email e senha utilizando o HashingService para verificar o hash da senha e garantir a segurança no processo de login.
Configure corretamente os namespaces e variáveis de ambiente necessários para o funcionamento do JwtModule, garantindo um gerenciamento seguro dos tokens JWT.
Veja como instalar o pacote @nestjs/jwt e utilizar o JwtService e o JwtModule para assinar tokens JWT, permitindo a autenticação segura de usuários na aplicação.
Aprenda a implementar o AuthTokenGuard para controlar o acesso às rotas da aplicação, permitindo ou bloqueando requisições com base na presença de um token JWT válido.
Veja como utilizar variáveis no Rest Client do VS Code para capturar automaticamente o accessToken da resposta HTTP e utilizá-lo em futuras requisições.
Entenda como enviar os dados contidos no payload do token JWT para seus controladores e serviços utilizando o TokenPayloadDto, garantindo a consistência das informações.
Veja como modificar as operações de atualização e remoção de registros de Pessoa para utilizar os dados contidos no token JWT, como o ID do usuário.
Aprenda a integrar o JWT TokenPayload nas operações de criação, atualização e remoção de Recados, garantindo que apenas usuários autenticados possam realizar essas ações.
Explore o conceito de Refresh Tokens no JWT e entenda como eles funcionam para renovar o accessToken de forma segura sem forçar o usuário a realizar login repetidamente.
Veja como gerar um Refresh Token ao mesmo tempo que o Access Token durante o login do usuário, permitindo a renovação de tokens com segurança.
Aprenda a implementar a geração de novos accessTokens utilizando o Refresh Token, garantindo que o usuário possa continuar autenticado sem precisar realizar um novo login.
Entenda as estratégias para invalidar tokens JWT e bloquear usuários, garantindo que apenas usuários com permissões adequadas tenham acesso contínuo à aplicação.
Descubra como usar Reflector e SetMetadata no NestJS para implementar autorizações baseadas em políticas (Policy-Based Authorization), controlando o acesso com metadados.
Veja como adicionar um campo do tipo Enum em Pessoa Entity para definir diferentes políticas de acesso a rotas, integrando a lógica de autorização baseada em políticas.
Aprenda a concluir a implementação do RoutePolicyGuard, garantindo que as rotas da sua aplicação estejam protegidas por políticas baseadas em regras de acesso.
Vamos remover o código desnecessário para continue.
Saiba como usar o Rest Client para enviar requisições multipart/form-data e trabalhar com o FileInterceptor e UploadedFile no NestJS, permitindo o upload de arquivos.
Aprenda como salvar arquivos enviados por upload no disco do servidor, manipulando o Buffer dos arquivos para garantir que sejam armazenados corretamente.
Veja como usar o FilesInterceptor e o decorator UploadedFiles para permitir o upload de múltiplos arquivos simultaneamente na sua aplicação NestJS.
Aprenda a validar arquivos enviados através de requisições HTTP utilizando o ParseFilePipeBuilder e ParseFilePipe no NestJS, garantindo que os arquivos estejam no formato correto.
Descubra como utilizar o ServeStaticModule no NestJS para servir arquivos estáticos, como imagens e documentos, diretamente do servidor de maneira simples e eficiente.
Veja como adicionar o campo de imagem (picture) em sua base de dados e mover a lógica de upload e manipulação de imagens para o serviço responsável.
Curso Completo de NestJS: O Guia Definitivo para o Desenvolvimento de APIs Restful com TypeORM e JWT
O NestJS se tornou um dos frameworks mais poderosos e robustos para desenvolvimento de back-end em Node.js, oferecendo uma arquitetura modular e escalável para construir aplicativos server-side. Se você está procurando dominar essa tecnologia e criar APIs RESTful de alto desempenho, o Curso Completo de NestJS é o investimento certo. Com mais de 100 aulas detalhadas, este curso abrange desde os conceitos básicos até implementações avançadas de autenticação, autorização, testes automatizados e deploy de produção. Vamos explorar o que você pode esperar aprender e por que esse curso é a escolha ideal para desenvolvedores de todos os níveis.
Introdução ao NestJS: Por Que Escolher Este Framework?
O curso começa com uma introdução ao NestJS, onde você entenderá o que torna esse framework tão especial. Ao contrário de outras soluções, o NestJS oferece uma abordagem baseada em módulos, o que facilita a organização do código, a reutilização de componentes e a escalabilidade. Você também aprenderá sobre os principais requisitos do NestJS e como configurar o ambiente de desenvolvimento no seu computador, garantindo que você comece o curso com a base correta.
Instalando e Configurando o NestJS CLI: Sua Ferramenta de Desenvolvimento
Um dos primeiros passos do curso é a instalação do NestJS CLI, uma poderosa ferramenta de linha de comando que agiliza a criação de projetos e a geração de código. O CLI ajuda você a criar módulos, controladores e serviços com apenas alguns comandos, facilitando o desenvolvimento. Além disso, você terá uma visão clara dos arquivos básicos gerados pelo CLI e aprenderá o propósito de cada um deles, como o arquivo main.ts, onde o aplicativo é inicializado, e a função bootstrap(), responsável por levantar o servidor.
Criando Módulos e Controladores: A Base do NestJS
No NestJS, módulos e controladores são componentes centrais que ajudam a organizar sua aplicação. O curso ensina como criar esses componentes tanto manualmente quanto utilizando o NestJS CLI. Você aprenderá a importância de módulos no encapsulamento de funcionalidades e verá como criar rotas dinâmicas, como @Get(':recurso'), para acessar recursos específicos. A injeção de dependências, outro conceito fundamental, será explorada através da criação de serviços e provedores.
Compreendendo o Protocolo HTTP e Métodos de Solicitação
Para desenvolver APIs RESTful eficazes, você precisa entender o protocolo HTTP. O curso dedica uma seção ao básico do HTTP, incluindo URLs, recursos e métodos de solicitação, como GET, POST, PUT, PATCH, DELETE, entre outros. Além disso, você verá como utilizar o Rest Client no VS Code para testar suas requisições diretamente na IDE, facilitando o desenvolvimento e depuração.
Service e Provider: Entendendo a Injeção de Dependências no NestJS
Um dos aspectos mais poderosos do NestJS é sua implementação de injeção de dependências, que torna o código mais modular e fácil de testar. Você aprenderá como criar e configurar Services (Providers), que são responsáveis pela lógica de negócios da aplicação. O curso explica detalhadamente como esses serviços são injetados em controladores e outros módulos, mantendo o código desacoplado e organizado.
Validação e Transformação de Dados com DTOs e ValidationPipes
No desenvolvimento de APIs, garantir que os dados de entrada estejam corretos é essencial. O curso ensina como criar DTOs (Data Transfer Objects) para transportar e validar dados de maneira eficiente. Você aprenderá a usar ValidationPipe e class-validator para garantir que apenas dados válidos sejam processados pela sua API, evitando erros e falhas de segurança. A aula sobre o PartialType é particularmente útil para validar campos opcionais ao atualizar recursos.
Implementando Segurança com JWT: Autenticação e Autorização
A segurança é uma prioridade em qualquer API. O curso aborda em profundidade a implementação de autenticação e autorização usando JWT (JSON Web Tokens). Você aprenderá a criar um sistema de login seguro, hashing de senhas com bcrypt, e a configurar guards de autenticação, como o AuthTokenGuard, para proteger rotas e garantir que apenas usuários autenticados possam acessá-las. Além disso, são discutidos conceitos como Refresh Tokens, permitindo que o usuário mantenha a sessão ativa por mais tempo sem a necessidade de relogar.
Manipulando Exceções e Garantindo Erros HTTP Consistentes
Um bom sistema de API deve fornecer respostas de erro claras e consistentes. No curso, você aprenderá a utilizar HttpException e NotFoundException para exibir mensagens de erro adequadas quando algo der errado, como quando um recurso não é encontrado. O curso também ensina como criar Exception Filters personalizados para capturar e manipular exceções de forma global ou em partes específicas do seu código.
Pipes e Interceptors: Validando, Transformando e Modificando Dados
O NestJS oferece uma ferramenta poderosa chamada Pipes, que permite a validação e transformação de dados em rotas. Você verá como utilizar Pipes para garantir que os dados recebidos estão no formato correto e, se necessário, convertê-los. Já os Interceptors permitem modificar as respostas HTTP antes de enviá-las para o cliente ou até mesmo implementar um sistema de cache simples. O curso explora diversos cenários de uso, como adicionar cabeçalhos de resposta, capturar exceções globalmente e implementar caches para otimizar a performance.
Bancos de Dados e Integração com TypeORM e PostgreSQL
A maioria das aplicações precisa interagir com um banco de dados, e o curso abrange a integração com PostgreSQL usando o TypeORM. Você aprenderá a instalar o PostgreSQL e configurar o TypeOrmModule para trabalhar com entidades e repositórios. A criação de Entities e Repositories é coberta em detalhes, permitindo que você realize operações como criar, ler, atualizar e apagar registros no banco de dados. Também é abordada a criação de relacionamentos entre tabelas, como ManyToOne e OneToMany, permitindo que você modele seus dados de forma relacional.
Paginação e Filtragem de Resultados com Query Parameters
A implementação de paginação em APIs é essencial para lidar com grandes volumes de dados. O curso ensina como usar query parameters para implementar a paginação utilizando os métodos take/limit e skip/offset do TypeORM, facilitando a navegação em grandes listas de resultados. Isso é útil em cenários como listas de usuários, produtos ou qualquer outro recurso que precise ser exibido em várias páginas.
DTOs Avançados e Validação Customizada
Ao criar sistemas complexos, a necessidade de DTOs avançados surge. O curso ensina a implementar validações avançadas utilizando decoradores como @Body, @Param e @Query, para garantir que os dados recebidos estão de acordo com as expectativas da API. Também é abordada a criação de DTOs customizados para cenários específicos, como a validação de paginação.
Upload de Arquivos e Servindo Conteúdo Estático
Se sua aplicação precisa lidar com uploads de arquivos, o curso também aborda essa funcionalidade. Você aprenderá a usar FileInterceptor e UploadedFile para lidar com arquivos de forma eficiente. Além disso, o ServeStaticModule permite que você sirva arquivos estáticos, como imagens ou documentos, diretamente de seu servidor NestJS.
Testes Automatizados: Unitários e End-to-End (E2E)
Garantir a qualidade do código é fundamental, e o curso aborda em detalhes como implementar testes unitários e end-to-end (E2E) no NestJS utilizando o Jest. Você aprenderá a testar controladores, serviços e até mesmo DTOs, garantindo que todas as partes da sua aplicação funcionem como esperado. São abordados conceitos como TestingModule e jest.fn para simular chamadas e facilitar o teste de funcionalidades isoladas.
Deploy de Produção: Configuração Completa na Google Cloud Platform (GCP)
Por fim, o curso ensina como realizar o deploy de sua aplicação NestJS em produção utilizando a Google Cloud Platform (GCP). Você aprenderá a configurar um servidor Ubuntu, instalar e configurar PostgreSQL, Node.js, LetsEncrypt para certificados SSL, e utilizar o Nginx como servidor web. Além disso, o curso ensina como usar o PM2 para gerenciar processos em produção, garantindo que sua aplicação esteja sempre disponível e com alta performance.
Por Que Este Curso é um Investimento Valioso
O Curso Completo de NestJS é mais do que um simples guia para iniciantes. Ele é um curso que cobre todos os aspectos do desenvolvimento back-end com o NestJS, desde a configuração inicial até o deploy em produção, passando por segurança, testes, manipulação de erros e muito mais. Cada aula foi projetada para fornecer conhecimento prático, e ao final do curso, você estará capacitado para desenvolver APIs RESTful robustas e seguras, com testes automatizados e deploy para produção. Se você busca aprimorar suas habilidades e criar aplicativos server-side escaláveis e performáticos, este curso é o investimento certo.