Exploration technique lors d’un entretien réel : Du full-stack Java aux frameworks front-end

Interviewer (I) : Bonjour, je suis en charge de l’évaluation technique. Nous allons discuter de vos projets passés et de votre stack. Présentez-vous brièvement.

Candidat (C) : Bonjour, je suis Lucas, 26 ans, diplômé en informatique d’une université française. Je travaille depuis environ 4 ans comme développeur full‑stack Java chez une entreprise du CAC 40. Mes missions couvrent le développement backend, des parties front‑end, ainsi que la conception d’architectures micro‑services et l’optimisation des performances.

I : Bien. Commençons par votre stack technique. Quelles sont les technologies que vous maîtrisez le mieux ?

C : Je suis très à l’aise avec l’écosystème Java, notamment Spring Boot, Spring MVC et Spring Cloud. Côté front, j’utilise principalement Vue 3 avec TypeScript, et j’ai une bonne expérience avec React et la librairie de composants Ant Design.

I : Passons aux micro‑services. Avez‑vous utilisé Spring Cloud ? Pouvez‑vous décrire votre mise en œuvre ?

C : Oui, sur une plate‑forme e‑commerce nous avons mis en place Spring Cloud avec Eureka pour le service registry, OpenFeign pour les appels inter‑services, et Spring Cloud Gateway pour l’API gateway. Chaque module est déployé indépendamment et communique par API REST.

I : Quels problèmes avez‑vous rencontrés, par exemple sur la communication ou la configuration ?

C : Nous avons eu des latences réseau et des timeouts. Nous avons intégré Resilience4j pour la gestion des retries et du circuit‑breaker. Pour la configuration, nous utilisions Spring Cloud Config, puis nous sommes passés à Consul pour la découverte de services et les health checks.

I : Utilisez‑vous Kubernetes ?

C : Oui, pour l’orchestration des conteneurs. Nous packagions les applications avec Docker et les déployions sur un cluster Kubernetes, en utilisant Services et Ingress pour le routage du trafic.

I : Parlons base de données. Quels ORM utilisez‑vous ?

C : J’ai travaillé avec JPA (Hibernate) et MyBatis. Le choix dépend du besoin : JPA pour un développement rapide, MyBatis pour un contrôle fin du SQL. Par exemple, pour un système de commandes, nous avons préféré MyBatis pour optimiser les requêtes, tandis que le module utilisateur utilisait JPA.

I : Avez‑vous rencontré des problèmes de performance ou de transactions ?

C : Oui, une requête lente due à un index manquant. Nous avons analysé les logs de requêtes lentes, ajouté un index composite et réécrit la requête.

I : Passons au front‑end. Vous utilisez Vue 3, quelles différences avec Vue 2 ?

C : Vue 3 améliore les performances avec un système réactif basé sur Proxy, une Composition API plus claire, et une meilleure organisation des composants. Nous avons structuré l’application par modules fonctionnels (profil, articles, commentaires) avec des composants à responsabilité unique.

I : Utilisez‑vous un gestionnaire d’état ?

C : Oui, Pinia, plus léger et compatible TypeScript. Nous l’utilisons pour gérer le jeton d’authentification et les informations utilisateur.

I : Et pour les outils de build ?

C : Principalement Webpack pour les builds de production et Vite pour le développement, car Vite accélère le hot‑reload grâce aux ES Modules.

I : Enfin, testez‑vous votre code ?

C : Oui, avec JUnit 5 et Mockito. Nous écrivons des tests unitaires et d’intégration, par exemple pour le service de connexion :

@ParameterizedTest
@CsvSource({
    "lucas, secret, OK",
    "invalid, wrong, UNAUTHORIZED"
})
void testLogin(String username, String password, String status) {
    User mockUser = new User("lucas", "secret");
    when(userRepository.findByUsername("lucas")).thenReturn(mockUser);
    when(userRepository.findByUsername("invalid")).thenReturn(null);
    
    ResponseEntity<String> response = authService.login(username, password);
    assertEquals(HttpStatus.valueOf(status), response.getStatusCode());
}

I : Très bien. L’entretien s’arrête là, nous reviendrons vers vous prochainement. Merci.

C : Merci, au plaisir.

Récapitulatif technique et exemples de code réécrits

1. Micro‑services avec Spring Cloud

Dans notre système e‑commrece, l’architecture micro‑services reposait sur :

  • Eureka – registre de services
  • OpenFeign – client REST déclaratif
  • Spring Cloud Gateway – passerelle API
  • Resilience4j – résilience (retry, circuit‑breaker)
  • Consul – découverte de services et health checks
// Client OpenFeign modifié
@FeignClient(name = "inventory-service", path = "/api/items")
public interface InventoryClient {
    @GetMapping("/{id}")
    Item getItem(@PathVariable Long id);
}

2. Optimisation de base de données

Pour une table de commandes lente, nous avons ajouté un index composite :

CREATE INDEX idx_commandes_utilisateur_date 
ON commandes (utilisateur_id, date_creation);

3. Composants Vue 3 avec Ant Design

Exemple de formulaire d’inscription avec composants Ant Design :

<template>
  <a-form :model="form" :label-col="{ span: 6 }">
    <a-form-item label="Email">
      <a-input v-model:value="form.email" />
    </a-form-item>
    <a-form-item label="Mot de passe">
      <a-input-password v-model:value="form.password" />
    </a-form-item>
  </a-form>
</template>

4. Gestion d’état avec Pinia

import { defineStore } from 'pinia';

export const useAuthStore = defineStore('auth', {
  state: () => ({
    jwt: null,
    profile: null
  }),
  actions: {
    setJwt(token) {
      this.jwt = token;
    },
    setProfile(profile) {
      this.profile = profile;
    }
  }
});

5. Build : Vite (développement) et Webpack (production)

Configuration Vite simplifiée :

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  server: { port: 3000 }
});

6. Tests unitaires avec JUnit 5

@ExtendWith(MockitoExtension.class)
class AuthServiceTest {
    @Mock
    private UserRepository userRepo;

    @InjectMocks
    private AuthService authService;

    @Test
    void shouldReturnOkWhenCredentialsValid() {
        User u = new User("lucas", "$2a$10$...");
        when(userRepo.findByUsername("lucas")).thenReturn(u);

        ResponseEntity<String> response = authService.login("lucas", "secret");
        assertEquals(HttpStatus.OK, response.getStatusCode());
    }

    @Test
    void shouldReturnUnauthorizedWhenUserNotFound() {
        when(userRepo.findByUsername("unknown")).thenReturn(null);

        ResponseEntity<String> response = authService.login("unknown", "any");
        assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
    }
}

Étiquettes: Spring Cloud Vue3 Pinia JUnit5 vite

Publié le 14 juillet à 01h32