하나의 엔티티 인스턴스는 데이터베이스 테이블의 한 행에 해당한다. 엔티티 클래스는 클래스 그 자체가 테이블을 정의해야 한다. 즉, ORM이 엔티티를 보고 어떤 테이블의 어떤 필드에 매핑해야 하는지 알 수 있어야 한다는 뜻이다.
자바 클래스를 엔티티로 정의할 때 주의해야 하는 점
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "Todo")
public class TodoEntity {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id; //이 오브젝트의 아이디
private String userId; //이 오브젝트를 생성한 유저 아이디
private String title; //Todo 타이틍 예) 운동하기
private boolean done; // true - todo를 완료한 경우(checked)
}
@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {
}
JpaRepository는 인터페이스이다. 이 인터페이스를 사용하기 위해서는 새 인터페이스를 작성해 JpaRepository를 확장해야한다. 이때 JpaRepository<T,ID>이 Genetic Type을 받는 것을 주의한다.
@Repository 어노테이션 또한 Component 어노테이션의 특별 케이스이다. 따라서 스프링이 관리한다.
@Service
public class TodoService {
@Autowired
private TodoRepository repository;
public String testService() {
// TodoEntity 생성
TodoEntity entity = TodoEntity.builder().title("My first todo item").build();
// TodoEntity 저장
repository.save(entity);
// TodoEntity 검색
TodoEntity savedEntity = repository.findById(entity.getId()).get();
return savedEntity.getTitle();
}
}
JpaRepository는 기본적인 DB 오퍼레이션 인터페이스를 제공한다. save, findByID, findAll등이 기본적으로 제공되는 인터페이스에 해당한다.
구현은 스프링 데이터 JPA가 실행 시 알아서 해준다.
기본적인 쿼리가 아닌 쿼리일 경우,
@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {
List<TodoEntity> findByUserId(String userId);
}
findByUserId 메서드를 작성하면 스프링 데이터 JPA가 메서드 이름을 파싱해서 'select * from Todo where userId = '{userId}'와 같은 쿼리를 작성해 실시한다. 메서드의 이름은 쿼리, 매개변수는 쿼리의 Where문에 들어갈 값을 의미한다. 더 복잡한 쿼리는 @Query 어노테이션을 이용해 지정할 수 있다.