/On11-TodasEmTech-s13-Integracao-BD

Turma Online 11 - Todas em Tech | Back-end | 2021 | Semana 13 -  Integração BackEnd + Banco de Dados

On11-TodasEmTech-s13-Integracao-BD

Turma Online 11 - Todas em Tech | Back-end | 2021 | Semana 13 -  Integração BackEnd + Banco de Dados



Plano da aula:


1. Chamada, apresentação das monitoras e acordos

video chamada

  • Usar as reações do zoom e levantar a mão para sinalizar que gostaria de falar
  • Enviar as dúvidas no chat
  • Manter microfone desligado quando outras pessoas estiverem falando
  • Manter câmera ligada o máximo possível
  • Momento mão no código, momento de olho na tela


2. Apresentação da {profa} Simara

Gif Yeah

Ex-aluna {reprograma}, desenvolvedora na ThoughtWorks e criadora do Podcast Quero Ser Dev.

Minha história com o MongoDb. Já dizia Jobs, a gente só consegue conectar os pontos olhando pra trás.



3. Por que precisamos de um banco de dados?

Vantagens:

  • Facilidade de acesso
  • Análises e comparativos
  • Segurança de dados
  • Atualizações e aprimoramento das informações
  • Escalabilidade


4. NoSQL v/s SQL

NoSQL SQL
Surgiu no final dos anos 90 e como uma alternativa de natureza não relacional RDBMS ou Sistema de Gerenciamento de Banco de Dados Relacional, armazenam dados em um formato estruturado, usando linhas, colunas e tabelas
Possuem alta escalabilidade e desempenho Geralmente demanda distribuição vertical de servidores, o que gera mais custo, pois quanto mais dados, mais memória e mais disco um servidor precisa.
Alguns tipos de bancos de dados não relacional: armazenamento de chave-valor, armazenamento column family, orientado a grafos e orientado a documentos Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL, é a linguagem de pesquisa declarativa padrão para banco de dados relacional.

Aqui está um comparativo dos termos MongoDb e SQL:

MongoDB SQL
database database
collection table
document row
field column
lookup table joins


5. O que é MongoDB?

Um banco de dados não relacional, orientado a documentos, livre com o código aberto e multiplataforma. Ele foi escrito na linguagem C++.

No MongoDB, os conjuntos de dados forma uma collection, cada item forma um documento e dentro dos documentos temos os campos.

Os dados são armazenados no formato JSON, o que é uma grande facilidade para quem programa com Javascript.

Podemos usá-lo pelo serviço de nuvem(cloud) ou localmente fazendo o download para nossa máquina (vamos usar essa opção).

Além disso, o Mongo possui seu driver com suas próprias queries(comandos para interação com o banco que se assemelham muito com javascript com orientação a objeto), podemos também usar uma interface gráfica e ainda podemos usar um ODM(vamos usar a última opção).

6. Quem usa MongoDB?

Mais de 22.600 clientes no mundo usam MongoDB. Algumas delas: Google, Forbes, eBay, Toyota, SAP, Adobe e muitas outras.

7. Operações de CRUD

O CRUD é um acrônimo para Create, Read, Update e Delete(criação, consulta, atualização e remoção de dados) . São as 4 operações principais em um banco de dados. No MongoDB, usando o Mongoose essas funcionalidades são:

OPERAÇÃO MONGODB MONGOOSE
CREATE insertOne() save()
READ find() find()
UPDATE updateOne() save()
DELETE deleteOne() remove()

Para conhecer todas as operações MongoDb: https://docs.mongodb.com/manual/crud/

8. O que é odm?

Uma ferramenta que mapeia entre um Modelo de Objeto e um Banco de Dados de Documentos.

9. Mongoose

Mongoose é uma modelagem de objeto mongodb elegante para node.js.

Tudo no Mongoose começa com um Schema. Cada esquema é mapa para uma coleção MongoDB e define a forma dos documentos dentro dessa coleção.

Exemplo photoshop x Filtro do Instagram

10. Conceito de Model (Schema)

Model ou Schema são moldes que descrevem quais campos serão aceitos no seu banco de dados, podemos também definir informações de tipo de dados e fazer "os relacionamentos".

11. Extra:

Dotenv

Essa dica com certeza dará mais maturidade aos seus códigos de backend. Afinal de contas dotenv é uma excelente ferramenta para gerenciar os dados sensíveis de desenvolvimento que não devem ser compartilhados como: chaves de API’s, informações do banco de dados, entre outras.

Vem aprender como orquestrar suas variáveis do ambiente dev em apenas 4 passos:

1- No seu projeto node com express, instale como dependência de desenvolvimento o dotenv. Utilize yarn ou npm.

yarn add dotenv -D
npm I —save-dev dotenv

2- Crie o arquivo .env

E nele crie suas chaves e valores que contém informações sensíveis e não podem ser compartilhadas além do ambiente de dev.

Por padrão as chaves são maiúsculas e não podem conter espaço, os valores ficam após o igual e podem ser de qualquer tipo pois retornarão sempre uma string:

NOME_DA_CHAVE=valor

3- Execute o ‘dotenv’, importando, usando a função config e incluindo ao processo para ler as variáveis configuradas:

require(‘dotenv’).config( )
process.env.NOME_DA_CHAVE

4- Como boa prática lembre-se de incluir seu arquivo .env no .gitignore

Você pode criar um .env.example e deixar apenas as chaves genéricas

Introdução de programação orientada a objetos

class x function

*O que é a programação orientada a objetos?

É um paradigma de desenvolvimento, uma forma de construir e analisar a nossa lógica,além disso é utilizado muito na maioria dos sistemas atuais

Tudo o que fazemos na POO é trabalhar com objetos.Ela foi criada para tentarmos representar objetos do mundo real nos códigos, com estados e comportamentos.

Os 4 pilares da programação orientada a objeto:

herança: podemos extender propriedades e metodos de uma classe mae para uma classe filha.Isso serve para replicar as caracteristicas de um objeto para outro. Isso nos ajuda a escrever códigos sem repetir tanto as mesmas linhas de código.

encapsulamento: conceito simples e poderoso, pois guarda a lógica da nossa classe, deixando nossos atributos de forma privada e só podemos acessar utilizando os metodos de get e set.

polimorfismo: a capacidade de objetos compativeis, se passar por outro em certas ocaciões. Podemos dessa forma herdar metodos, e reescrever todos os comportamentos. "Podemos brincar a vontade com o DNA do nosso sistema".

abstração: não é um conceito concreto, chega ser redundante. O super poder é criarmos a classe mãe o mais abstrata possível, ela recebe o nome de template, identidade ou superclasse. Não pode ser criado um onjeto diretamente dessa classe, mas sim das classes filhas que herdam as caracteristicas e comportamentos da classe mae.

Se você começou agora, vai perceber com o tempo a importancia desses 4 pilares, pois eles são as bases de técnicas e ferramentas que nos ajudam desde a concepção do projeto até codificação dele. Uma dessas técnicas é o design patterns que nos ajudar a manter um padrão de qualidade em nossos códigos. Além disso, muitas linguagens utilizam esse paradigma: java, python, .Net, Javascript e muitas outras.

Como era antes de 2015:

function Person(name) {
    this._name = name;
}

var person = new Person('Simara');

console.log(person)

Como é com o ES6:

class Calculator {
    constructor(num1, num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    sum() {
        return this.num1 + this.num2;
    }

    sub() {
        return this.num1 - this.num2;
    }

    mult() {
        return this.num1 * this.num2;
    }

    div() {
        return this.num1 / this.num2;
    }
}

const calculator = new Calculator(5, 6);

console.log(calculator.sum());
console.log(calculator.sub());
console.log(calculator.mult());
console.log(calculator.div());
  • Como entender classes no JS.

Classes são como formas/moldes que definem os métodos e as propriedades para instanciarmos um objeto. Dentro dela não definimos nenhum dado ou informação é apenas a forma de como nosso objeto irá se parecer. Já objetos são as versões instanciadas dessas classes, essencialmente uma versão especifica dessa classe com os valores para as propriedades. Por exemplo se criarmos uma class Parede que recebe a propriedade cor, ela não diz qual cor será pintada essa parede, apenas diz que quando for criado um objeto nova parede ela irá receber um valor para cor.

  • E a palavra reservada this?

Antes de 2015 as classes eram escritas como funções, após o es6 usamos a sintaxe class e a palavra reservada this é usada para internamente da classe associarmos um valor.

  • Qual a função do constructor nas classes?

As classes em JavaScript têm um método constructor que permite definir campos quando o objeto é instanciado com uma class, ou seja, é esse método que faz a contrução do objeto quando a gente cria uma intância dessa classe usando a palavra reservada new. Cada classe pode ter apenas um constructor. Se houver mais de um, SyntaxError será lançado. O constructor também pode chamar o método super para chamar o constructor de outra classe se a classe estender uma classe mãe. Configurando assim a herança na POO.

  • Quais seriam as situações que seria mais lógico usar classe ao invés de uma função?

O mais importante a lembrar: as classes são apenas funções JavaScript normais e antes eram declaradas sem o uso da class sintaxe. Que somente foi adicionado ao ES6(2015) para tornar mais fácil declarar e herdar objetos complexos.

A principal diferença entre a sintaxe class e function é que function sofre hoisting, enquanto class não. Isso significa que um objeto nunca pode ser instanciado executando uma classe que foi declarada posteriormente. Enquanto é possível executar uma funçao antes e declarar depois. Pois o interpretador do javascript eleva a função para o topo da página.

Agora para decidir quando usar class ou function, é muito importante lembrar dos conceitos da programação orientada a objeto. Por exemplo quando nós encapsulamos a lógica em uma class, o código fica muito mais limpo e de fácil entendimento em vez de criarmos várias funções.

Geralmente usamos classes para construir diferentes objetos com as mesmas propriedades. Exemplo conta bancária. Usamos também em algumas bibliotecas e supersets (class components no React e typescript nos types e interfaces)


Mão no código

Vamos criar nossa primeira integração com MongoDB. Será um CRUD para um sistema simples de cadastros de livros.

Mas antes disso, vamos preparar nosso ambiente:

Guia para instalar o MongoDB

Vamos iniciar o projeto

1- Iniciar projeto node: npm init -y

2- Instalar express e mongoose: 
npm i --save express mongoose

3- Instalar como dependencias de desenvolvimento o dotenv e o nodemon:
npm i --save-dev dotenv nodemon

Arquitetura

Server.js

Sobe servidor nodejs, usa as rotas, converte os dados para Json e faz conexao com a importação do db.

.env

Gerencia a variavel de ambiente de configuração do MongoDb

.env.example

Salva a variavel de forma genérica

.gitignore

Ignora arquivos e pastas para o git

📂SRC

📂Routes

Cria as rotas apenas com a responsabilidade dos metodos HTTP

📂Controllers

Cria a lógica e salva as informações do db.

📂Models

Modela o esquema de dados para o banco.

📂Data

Cria a configuração de conexão com o banco.

Tecnologias

Ferramenta Descrição
javascript Linguagem de programação
nodejs Ambiente de execução do javascript
express Framework NodeJS
dotenv Dependência para proteger dados sensíveis do projeto
mongoose Dependência que interage com o MongoDB para a conexão da database, criação do model e das collections
nodemon Dependência que observa as atualizações realizadas nos documentos para rodar o servidor automaticamente
npm ou yarn Gerenciador de pacotes
MongoDb Banco de dado não relacional orietado a documentos
MongoDb Compass Interface gráfica para verificar se os dados foram persistidos
Insomnia ou Postman Interface gráfica para realizar os testes

Usaremos Mongoose para modelar nosso objeto e conectar com o banco de dados. O nosso documento será conforme abaixo:

  • name

    • String
    • required
  • author

    • String
    • required
  • pages

    • Number
    • required
  • created_at

    • Date
    • required


**CRUD:** o endpoint será: localhost:3333/books

Comportamento esperado

Recurso Descrição
/ Deverá listar todos os livros cadastrados
Recurso Descrição
/ Deverá criar um novo livro a partir do corpo da requisição
Recurso Descrição
/:id A partir do route params id, deverá ser possível buscar um livro para listá-lo.
Recurso Descrição
/:id A partir do route params id, deverá ser possível buscar um livro para alterar uma informação específica que será passada pelo corpo da requisição.
Recurso Descrição
/:id A partir do route params id, deverá ser possível buscar um livro para deletá-lo.

Obs.: Todas as rotas deverão ser testadas no postman ou insomnia e verificar se as informações foram de fato persistidas no db



Entregável da semana

Vamos criar uma integração com MongoDB. Será um CRUD para um sistema simples de cadastros de filmes.

Usaremos Mongoose para modelar nosso objeto e conectar com o banco de dados. Os campos serão conforme abaixo:

  • title
    • String
    • required
  • description
    • String
    • required
  • type
    • String
    • required
  • available_on
    • String
    • required
  • created_at
    • Date
    • required


**CRUD:** o endpoint será: localhost:3333/movies

Recurso Descrição
/ Deverá listar todos os filmes cadastrados
Recurso Descrição
/ Deverá criar um novo filme a partir do corpo da requisição
Recurso Descrição
/:id A partir do route params id, deverá ser possível buscar um filme para listá-lo.
Recurso Descrição
/:id A partir do route params id, deverá ser possível buscar um filme para alterar uma informação específica que será passada pelo corpo da requisição.
Recurso Descrição
/:id A partir do route params id, deverá ser possível buscar um filme para deletá-lo.

Obs.: Todas as rotas deverão ser testadas no postman ou insomnia e verificar se as informações foram de fato persistidas no db


Simara Conceição