Skip to content

22. Conclusão

Vamos recapitular o que fizemos neste documento. Analisamos duas camadas [DAO] com uma das duas arquiteturas a seguir:

A camada [DAO1] foi implementada com o Spring JDBC e a camada [DAO2] com o Spring JPA. As camadas [DAO1] e [DAO2] implementavam a mesma interface [IDAO], o que permitiuescrever um único teste [JUnitTestDao] para testar as duas camadas [DAO];

Feito isso, expusemos a interface [IDAO] na web da seguinte maneira:

  • em [1], a camada [IDAO] foi exposta na web por meio de uma camada web [2] implementada pelo Spring MVC. É de fato a interface [IDAO] que está exposta, e criamos duas versões do serviço web, dependendo se essa interface é implementada com uma arquitetura [DAO-JDBC] ou [DAO-JPA-JDBC];
  • em [B], um cliente remoto utiliza as URL expostas pelo serviço web, que dão acesso aos métodos da camada [IDAO-serveur]. Fizemos com que a camada [DAO-Client] [3] implementasse a interface [IDAO-serveur] [1]. Isso nos permitiu utilizar o mesmo teste [JUnitTestDao], que já havia sido utilizado duas vezes;
  • no [3], a camada [DAO-client] foi implementada com o Spring RestTemplate;

Feito isso, protegemos o acesso ao serviço web:

  • em [5], a solicitação HTTP do cliente passa por uma camada de autenticação implementada com o Spring Security;

Feito isso, evoluímos a arquitetura anterior para a seguinte:

  • em [3], o aplicativo cliente é, ele próprio, um aplicativo web fornecido pelo servidor web [4]. A aplicação cliente exibe no navegador um formulário [5] que permite consultar os URL do serviço web seguro. Os acessos HTTP ao serviço web seguro são realizados por meio de uma camada [jS] implementada em JavaScript. Essa arquitetura utiliza o que se denomina solicitações entre domínios:
    • o serviço web apresenta URL na forma [http://machine1:port1/];
    • o aplicativo web cliente é baixado a partir de um URL [http://machine2:port2/]. Se [http://machine2:port2/] não for idêntico a [http://machine1:port1/] (mesma máquina, mesma porta), o navegador do cliente bloqueará as chamadas HTTP da camada [DAO-client-js]. Para resolver esse problema, o serviço web deve permitir solicitações entre domínios;

Os projetos apresentados foram testados com os seis bancos de dados a seguir:

  • MySQL 5 Community Edition;
  • SQL Server 2014 Express;
  • PostgreSQL 9.4;
  • Oracle Express 11g versão 2;
  • IBM DB2 Express-C 10.5;
  • Firebird 2.5.4;

Para cada um desses SGBD, foram desenvolvidas quatro camadas [DAO] diferentes:

  • uma camada implementada com Spring JDBC;
  • uma camada implementada com Spring JPA e o provedor JPA Hibernate;
  • uma camada implementada com Spring JPA e o provedor JPA EclipseLink;
  • uma camada implementada com Spring JPA e o provedor JPA OpenJPA;

Portanto, foi apresentado um conjunto de vinte e quatro configurações diferentes. Fizemos um grande esforço de fatoração:

  • a maior parte do código é escrita apenas uma vez. Ele se baseia em dois projetos Maven de configuração:
    • um configura a camada JDBC;
    • o outro configura a camada JPA;

O projeto de configuração Maven da camada JDBC [1] de um SGBD específico permite:

  • importar o arquivo do driver JDBC;
  • definir as credenciais de acesso ao banco de dados utilizado e os diversos comandos SQL que a camada [DAO1] emitirá para o driver JDBC. Embora o SQL seja padronizado, foram encontrados problemas de portabilidade, principalmente devido à presença, nas consultas, de nomes de tabelas/colunas que se revelaram ser palavras-chave proibidas em certos SGBD (tabela ROLES para DB2, coluna PASSWORD para Firebird). Além disso, embora um nome de coluna normalmente não faça distinção entre maiúsculas e minúsculas, ocorreu um problema com o PostgreSQL em relação à coluna ID da chave primária das tabelas. Ele exigiu que ela fosse chamada de id, em letras minúsculas;

Os três projetos Maven de configuração da camada JPA, [2] de um SGBD específico permitem:

  • importar o arquivo da implementação JPA;
  • configurar a implementação JPA utilizada para o SGBD específico conectado. De fato, é a camada JPA que emite os comandos SQL para a camada JDBC. Para ser eficaz, ela precisa conhecer o SGBD a fim de enviar a ele os comandos SQL que ele reconhecerá. Essas ordens poderão utilizar o SQL, proprietário desse SGBD, bem como as características específicas deste último (tipos de dados, sequências, gatilhos, procedimentos, geração automática de chaves primárias, etc.);

Assim, foram criados vinte e quatro projetos (4 configurações x 6 SGBD) de configuração do Maven, nos quais se basearam todos os demais projetos de operação do banco de dados. Nos esquemas acima, como as camadas [DAO1] e [DAO2] oferecem a mesma interface, as 24 configurações das duas arquiteturas acima foram testadas com a única classe de teste [JUnitTestDao]. Uma vez verificadas essas arquiteturas, não houve mais dificuldades:

  • o projeto Maven para publicação do banco de dados na web baseia-se nessas duas arquiteturas. Portanto, também há 24 configurações possíveis;
  • o projeto Maven para a segurança do acesso ao serviço web baseia-se no projeto anterior e também possui 24 configurações possíveis;
  • por fim, o projeto Maven que permite solicitações entre domínios ao serviço web seguro baseia-se no projeto anterior e também possui 24 configurações possíveis;

Embora não aborde todas as capacidades da linguagem Java nem todos os seus domínios de aplicação, este documento pode ser utilizado como material de aprendizagem da linguagem. O leitor que tiver assimilado o conteúdo deste curso terá alcançado um nível “Java avançado”, tanto no uso da linguagem quanto no uso do framework Spring. Ele poderá então dar continuidade à sua formação em Java com as seguintes obras:

  • [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf], que dá continuidade ao aprendizado do ecossistema Spring, apresentando seu ramo de “programação web MVC”. Ele utiliza um banco de dados mais complexo do que o estudado aqui;
  • [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4], que apresenta uma arquitetura web cliente/servidor, na qual o cliente é implementado com o framework [AngularJS] e o servidor com [Spring MVC];
  • [Introduction à Java EE] [http://tahe.developpez.com/java/javaee], que abandona o ecossistema Spring em favor de uma arquitetura web baseada em JSF (Java Server Faces) e EJB (Enterprise Java Bean);
  • [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa], que descreve uma arquitetura cliente/servidor, em que o cliente é um tablet Android programado em Java e o servidor é um serviço web implementado pelo Spring MVC;