JuMP : optimize!(model)

Why do we need solvers , if we can solve model with : optimize!(model_name) ?
How optimize! works?
What solvers actually does ?
What if we don’t define solvers?

We cannot. You need to define a solver before.

See here. An error is thrown

As the name already indicates it solves the problem you send to it. See here.