В дополнение в авторам остальных ответов, хочу добавить одну интересную деталь про разработку веб-приложений и их архитектуру.
Некоторые веб-фреймверки так устроены, чтобы брать на себя многие функции по работе с БД (к примеру, Grails использует для этого очень удобный ORM «GORM»). Таким образом, выбрав подобный фреймворк и не имея с ним особого опыта, и посмотрев сетевые примеры приложений типа PetStore (т.е. карманные приложения для примера работы фреймворка), можно случайно наколбасить так, что произойдет лок функциональности внутри веб-приложении.
Пример: Случайно может получиться так, что вся логика асинхронного процессинга сообщений окажется внутри веб-приложения. Я видел такое. Веб-приложение запускалось 5 минут…
Сразу это учитывайте при выборе архитектуры, разделяйте функциональность по слоям.
К примеру,
1. бэкенд для всей логики, не касающейся веб-приложения на Spring
2. Фронт на Grails, только необходимое
3. Оба модуля могут смотреть на одну и ту же базу, так что можно использовать лучшее из обоих миров, к примеру Spring-Data-JPA для бэкенда и GORM для фронта.