Sauté Aromatics: In a large pot over medium heat, melt the butter until foaming. Add the chopped onion and cook gently, stirring occasionally, until the onion becomes soft and translucent, about 5 minutes. This process draws out the natural sweetness of the onions, creating a flavorful base for the soup.
Create Roux: Sprinkle the flour evenly over the softened onions. Whisk continuously for 2 minutes to cook out the raw flour taste and form a smooth, golden roux. This step will thicken the soup later while ensuring a creamy texture.
Add Broth and Season: Gradually pour in the chicken broth while whisking to avoid lumps. Season the mixture generously with salt and black pepper. Bring the liquid to a gentle boil to activate the thickening properties of the roux.
Cook Vegetables: Stir in the diced celery and broccoli florets. Lower the heat to medium-low and simmer the soup, uncovered, until the vegetables are tender and cooked through—approximately 15 minutes. This slow simmer helps develop depth of flavor and softens the broccoli perfectly.
Incorporate Milk and Adjust Thickness: Pour in the whole milk and continue to simmer for an additional 2 to 3 minutes. The soup should thicken enough to coat the back of a spoon while maintaining a smooth, pourable consistency.
Melt Cheese: Remove the pot from heat. Gradually add the shredded cheddar cheese in small handfuls, stirring continuously until fully melted before adding more. This gradual process ensures a creamy, lump-free soup.
Final Seasoning and Serving: Taste and adjust seasoning with salt and pepper as needed. Ladle the soup into bowls and sprinkle with extra cheddar cheese if desired. Serve warm, optionally in a sourdough bread bowl or alongside crusty bread.