La risposta a tale domanda non può essere breve, quindi iniziamo con i termini:
- frontend - sottosistema software che interagisce direttamente con l'utente. Nelle applicazioni consumer il termine "frontend" di solito si riferisce a un'applicazione in esecuzione in un browser Web o un'applicazione mobile.
- backend - sottosistemi software che non interagiscono direttamente con l'utente. Come sviluppatori di software di back-end di solito considerano il server applicativo o il microservizio più un database e servizi correlati (ad esempio, coda di messaggi o cache distribuita).
- JavaEE - non è più noto come tale. Il nome moderno di questo stack tecnologico è JakartaEE ( link ) Questo è un gruppo di specifiche di varie API in Java, che variano notevolmente in popolarità e utilizzo : il progetto JEE puro oggi non è una cosa comune - secondo molti sondaggi, solo le API Servlet e JPA sono ampiamente utilizzate come parte della combo Spring / Hibernate.
- JSF - più spesso odiato rispetto al framework UI che è in costante declino negli ultimi 5 anni a causa dei limiti della sua architettura. Non consiglierei di avviare un nuovo progetto su JSF e cercare una soluzione più tradizionale.
- Un livello nell'architettura software - parte separata dell'applicazione che svolge un ruolo specifico. Nei livelli di applicazioni Java sono in genere rappresentati da pacchetti specifici o persino moduli jar. Uno degli esempi di livelli è il livello di persistenza, che rappresenta un'astrazione orientata agli oggetti di un database. Per definizione il livello non è un'applicazione separata, quindi l'opzione 1 non ha senso come soluzione per interagire con il database. Hibernate come livello database ha comunque senso. Tieni presente che Hibernate è un'implementazione popolare dell'API JPA di JEE, quindi se sei già nello stack JEE, lo usi già o non ne hai bisogno, perché usi qualche altra implementazione (es. EclipseLink).
Ora parliamo dell'architettura in generale. La tua opzione 1 è una soluzione moderna e più popolare per l'intera applicazione. Spring è un framework di scelta per la maggior parte degli sviluppatori Java secondo recenti sondaggi (incluso SO), con sempre più di loro che scelgono Spring Boot come stack tecnologico completo e alternativo a JEE. Hibernate è una delle opzioni più popolari per la persistenza, ma ce ne sono altre: controlla la guida di riferimento di Spring Boot ( link ).
Costruire un'API REST sul backend (Spring Boot / Hibernate), che può essere consumato dal frontend è uno dei modi più semplici per sviluppare applicazioni web interattive oggi, ma ovviamente non è l'unico - scelta della particolare soluzione dovrebbe sempre essere basato sui requisiti aziendali. Per le applicazioni Web visualizzate nel browser, il frontend di solito viene scritto su JavaScript o lingue correlate (ad esempio TypeScript) con uno dei numerosi framework esistenti (selezionare Angular and ReactJS).
Le considerazioni sull'opzione 1 che menzioni:
- La mappatura JSON è piuttosto semplice. Nel frontend è automatico, nel backend facilmente implementato con le librerie come Jackson - esce dalla scatola con Spring Boot.
- Avrai un solo server, che fornirà l'API REST al frontend basato su JS o implementerà il rendering lato server (in JEE tramite JSF / JSTL, in Spring Boot - con Thymeleaf).
- La sicurezza è un requisito aziendale. Se è necessario proteggere alcuni dati, deve essere implementata. Con Spring puoi usare Spring Security con varie opzioni.