Desenvolvendo um site de gerenciamento financeiro #3

Criando um projeto Ktor
Olá e bem vindo novamente!
Como eu disse no meu post anterior, eu ainda não estou certo se farei o back-end da minha aplicação baseado em Ktor + Ebean ou Spring Boot + Spring Data JPA. Então, como o propósito desta série é ser um “log” bem detalhado do meu processo de desenvolvimento eu acho que farei das DUAS formas por enquanto. Mais tarde nós veremos qual projeto esta com uma aparência mais limpa e mais fácil de ser mantido e cancelaremos o outro. Quem sabe não poderei até contar com as opiniões de vocês para decidir com qual ficar.
Então, a primeira coisa que temos que fazer para criar um projeto Ktor é dar uma olhada neste site: https://ktor.io/quickstart/generator.html# . Ele vai nos ajudar a criar um projeto perfeitamente configurado com Ktor. Você também pode usar o plugin direto no Intellij IDEA mas enquanto escrevo isto, ele está falhando para mim.
Aqui está um screenshot de como é a tela do site atualmente:

SPOILER ALERT! Eu decidi chamar o projeto de Monies! Vamos ver se cola 😉

Assim são as minhas dependências quando abri o projeto no Intellij IDEA. A propósito, fiz o projeto com Maven então me desculpem fãs de Gradle. Gostaria muito de usá-lo mas como já bati cabeça muito tempo com as manias e o temperamento do Maven, me sinto mais a vontade trabalhando com ele caso passe por algum problema.
Deixe me falar um pouco sobre as opções que selecionei na criação do projeto:
- Compression – Nenhuma razão além de comprimir o payload. É legal se eu hospedar este código em um serviço que cobre por tráfego.
- CallLogging – Apenas para me ajudar enquanto desenvolvo. Logs nunca são demais.
- CORS – Cross-Origin Resource Sharing é chato e esta opção me ajuda a lidar com ele. Dê uma lida aqui se quiser saber mais sobre CORS.
- Routing – Bem, isto é o principal. Ele vai cuidar das URLs que o front-end vai requisitar e responder a elas (em JSON na maioria do tempo).
- Jackson – Você não consegue ver no screenshot, mas também selecionei Jackson. Ele me ajudará a traduzer JSON para um objeto e vice-versa.

Eu também adicionei mais dois pacotes ao meu pom.xml.
Ebean e Kotlintest.
Ebean é o ORM que usarei para falar com o banco de dados e Kotlintest é o que usarei para fazer meus testes unitários. Eu gosto muito desta ferramenta por que sua sintaxe torna muito mais fácil a compreensão dos testes. Especialmente se você for um novato em TDD como eu.
Tudo parece OK. Vamos ver como está a arvore de arquivos do meu projeto até agora.

Aqui eu mudei um pouco. Eu criei um pacote principal com.marcelustrojahn e dentro dele mais três sub-pacotes, application, models e services.
Isto é apenas para organização do código.
Em application, eu colocarei todos os arquivos relacionados ao processo inicial de “rodar” meu projeto.
Em models, tudo relacionado ao banco de dados.
Services conterá tudo relacionado a conectar o banco de dados ao resto da aplicação. É a camada de serviço. Se eu tiver que salvar, ler ou deletar alguma coisa do meu banco de dados eu o farei chamando algum método na camada de serviços. Estes métodos vão cuidar de tudo que precisar ser feito ANTES da deleção para que a aplicação não quebre por alguma falta de relacionamento, etc…
Bem, para terminar, vamos ver se o projeto roda?
Tudo que preciso fazer é criar uma configuração para rodar. Para isto, vou clicar em “Add Configuration” no topo da interface do Idea e esta tela aparecerá:

Agora eu clico no sinal de MAIS no topo esquerdo da tela e adiciono uma nova Application e então basta colocar um nome (que eu coloquei Application também) e selecionar a classe principal que será o ponto de entrada da aplicação.
Agora apertamos o PLAY e cruzamos os dedos:
2019-08-31 16:02:34.988 [main] INFO Application - No ktor.deployment.watch patterns specified, automatic reload is not active Exception in thread "main" java.lang.ClassNotFoundException: Module function cannot be found for the fully qualified name 'com.marcelustrojahn.com.ApplicationKt.module'
Oops!? Esqueci que se eu mudar os pacotes, preciso atualizar também o arquivo de inicialização do Ktor, application.conf.
ktor {
deployment {
port = 8080
port = ${?PORT}
}
application {
modules = [ com.marcelustrojahn.application.ApplicationKt.module ]
}
}
Vamos tentar novamente:
2019-08-31 16:05:34.618 [main] INFO Application - Responding at http://0.0.0.0:8080 2019-08-31 16:05:34.618 [main] INFO Application - Application started: io.ktor.application.Application@5a6d5a8f
OK! Está vivo!! Vejo vocês no próximo post.