Sobes.tech
Middle

Où traces-tu la frontière entre le développement frontend et backend?

sobes.tech IA

Réponse de l'IA

La frontière se situe au niveau de l'API. Le backend est responsable de :

  • La logique métier
  • La gestion des données (base de données, cache)
  • L'autorisation et l'authentification (si ce n'est pas externalisé dans un service séparé)
  • La fourniture de données et de fonctionnalités via l'API (REST, GraphQL, etc.)

Le frontend est responsable de :

  • L'interface utilisateur (HTML, CSS)
  • L'interaction avec l'utilisateur (JavaScript/Ruby avec Hotwire/etc.)
  • La consommation de données et l'appel de fonctions via l'API du backend
  • La présentation des données reçues du backend

Dans l'approche classique, le backend génère des pages HTML, le frontend ajoute simplement de l'interactivité. En SPA (Single Page Application), la frontière est plus nette, car l'interaction se fait exclusivement via l'API.

Exemple :

# app/controllers/api/users_controller.rb
# Backend : Responsable de récupérer l'utilisateur de la base de données et de formater les données pour le frontend
class Api::UsersController < ApplicationController
  def show
    user = User.find(params[:id])
    render json: user.as_json(only: [:id, :name, :email])
  end
end
// app/javascript/packs/user_profile.js
// Frontend : Responsable de demander des données au backend et de les afficher
document.addEventListener('DOMContentLoaded', () => {
  fetch(`/api/users/${userId}`) // userId obtenu côté frontend
    .then(response => response.json())
    .then(data => {
      document.getElementById('user-name').innerText = data.name;
      document.getElementById('user-email').innerText = data.email;
    });
});

Dans les approches hybrides, comme Hotwire, une partie de la logique de rendu peut être déplacée vers le backend, mais l'interaction repose toujours sur le transfert de données ou de fragments HTML via des protocoles spécifiques (par exemple, Turbo Streams).

# app/controllers/posts_controller.rb
# Backend : Rendu HTML pour Turbo Stream
class PostsController < ApplicationController
  def create
    @post = Post.new(post_params)
    if @post.save
      render turbo_stream: turbo_stream.append(:posts, partial: 'posts/post', locals: { post: @post })
    else
      # Gestion des erreurs
    end
  end

  private

  def post_params
    params.require(:post).permit(:body)
  end
end
<!-- _post.html.erb -->
<!-- Fragment HTML envoyé au frontend via Turbo Stream -->
<div>
  <%= post.body %>
</div>

Principe fondamental : le backend fournit des données et des services, le frontend les consomme et les visualise pour l'utilisateur.