Put a large pot of salted water on to boil. When the water is on a rolling ball, add the macaroni, give it a stir to separate, and cook the pasta until just under al dente, probably a minute under the packet instructions, usually around 7-9 minutes for macaroni.
While the pasta is cooking, in a large deep fry pan over low-medium, heat the olive oil and fry the diced shallots until soft, push them to one side of the pan to continue to caramelise; turn the heat to high, add the diced bacon and fry until crispy (or to your liking). Transfer the fried shallots and bacon to a dish. Reduce the heat to low and remove the pan.
To a small pot over medium heat, add the butter and flour and whisk together until the butter melts and mixture starts to bubble, then whisk for a minute to create the roux; keep whisking, adding the milk, and whisking it into the mixture until you get a thick, creamy, smooth white sauce.
Remove the pot from the heat, add the paprika and salt, and gradually add half the grated cheese little by little, whisking it into the sauce, allowing the cheese to melt before adding more. If the sauce thickens too much and isn’t easily incorporating the cheese, return the pot to the heat briefly, continuing to whisk until you’ve used half the cheese. Remove the pot from the heat to a cool surface.
The macaroni should be ready, so use a large slotted spoon to scoop the pasta into the deep pan (saving the pasta water); return half the fried shallots and bacon and pour the cheesy sauce into the pan, stirring it all through the pasta. If the sauce is too thick, scoop out a tablespoon or two of cooking water and add it to the pan to loosen the sauce. Add the remaining grated cheese, and another tablespoon or two of pasta water if needed, and stir it through.
Taste and adjust the seasoning to suit your palate, distribute the mac and cheese between bowls, sprinkle on the remaining fried shallots and crispy bacon, and serve immediately with grated parmesan and a simple side salad.