Quantum error-correction conditions in Nielsen and Chuang, 10th-anniversary edition (Theorem 10.1) state that the error operation $\mathcal{E}$ with operation elements $\{E_i\}$ is correctable if and only if $PE^\dagger_iE_jP=\alpha_{ij}P$, where $P$ is a projector onto the code space $C$ and $\alpha$ is a Hermitian matrix. Here $C$ is understood as a subspace of the full Hilbert space that contains the states that need to be protected against noise. The proof of the theorem relies on properties of the projection operator $P$ among other things.
The basic example that illustrates how error correction works uses either the repetition code or the Shor code.In the repetition code, the original 1 qubit state (that needs to be protected) $|\psi\rangle=a|0\rangle+b|1\rangle$ is mapped into $a|000\rangle+b|111\rangle$. Then bit-flip error occurs on one of the 3 qubits and it is demonstrated how this bit-flip can be corrected. If the bit-flip operation is $\mathcal{E}$, then encoding of the original state must be $P$, ie projection of the full Hilbert space onto the code space, but neither repetition code, nor Shor code is a projection operator, they're just combinations of standard unitary gates.
I'm trying to understand how theorem 10.1 is related to the actual error-correction codes, and how is projection operators required by Theorem 10.1 implemented in practice.