Start here. This is the direct spoken answer to practice first.
Overview
A dataclass removes repetitive data-model code, but it does not decide whether a type has a sound domain design.
A dataclass is a good fit when a type mainly represents named data and value-oriented behavior. From annotated fields it can generate methods such as __init__, __repr__, and equality, making a request value, configuration object, or small result clearer. A regular class is better when construction, encapsulation, identity, or behavior needs a custom public contract that should not look like a transparent bag of fields.