SQL 과목에서 배운 테이블·CRUD를 떠올려 보세요. 스프링에서는 객체를 다루듯 DB를 다뤄요. 이번 장은 JPA와 Spring Data JPA로 반복적인 SQL을 어떻게 없애는지 배웁니다.
@Entity·@Id·@GeneratedValue로 엔티티를 만들 수 있어요.ORM(Object-Relational Mapping)은 자바 객체와 DB 테이블을 매핑해, SQL을 직접 쓰지 않고 객체를 다루듯 DB를 다루는 기술이에요. 예를 들어 userRepository.save(user) 한 줄이면, ORM이 알아서 INSERT SQL을 만들어 실행해줘요.
SELECT·INSERT를 직접 짰다면, JPA는 그걸 객체 조작으로 대신해줘요. SQL을 몰라도 되는 게 아니라, 반복적인 CRUD SQL을 안 짜도 되는 거예요.엔티티는 DB 테이블과 매핑되는 자바 클래스예요. 클래스에 @Entity를 붙이면 "이 클래스는 테이블과 연결돼요"라는 표시가 돼요.
@로 시작하는 표시(이름표)예요. @Entity는 "이건 테이블과 연결되는 클래스야", @Id는 "이 필드가 기본 키야"처럼, JPA에게 살짝 알려주는 쪽지 역할을 해요.| 어노테이션 | 역할 |
|---|---|
@Entity | 이 클래스가 테이블과 매핑되는 엔티티임을 표시. |
@Id | 이 필드가 기본 키(Primary Key)임을 표시. |
@GeneratedValue | 기본 키 값을 자동으로 증가·생성(SQL의 AUTO_INCREMENT 같은 역할). |
@Entity
class User {
@Id
@GeneratedValue // id 값 자동 증가
Long id; // 기본 키 컬럼
String name; // name 컬럼
}
@GeneratedValue를 함께 쓰면 우리가 id를 직접 넣지 않아도 DB가 알아서 채워줘요.JpaRepository<엔티티, ID타입>를 상속한 인터페이스만 만들면, save·findById·findAll·delete 같은 기본 CRUD가 자동 제공돼요. 구현 코드를 한 줄도 안 써도 스프링이 알아서 만들어줘요.
User 엔티티를 다루고, 기본 키 타입이 Long이니 JpaRepository<User, Long>을 상속해요. 본문은 비어 있어도 CRUD가 다 생겨요.
interface UserRepository extends JpaRepository<User, Long> {
// 본문이 비어 있어도
// save, findById, findAll, delete 등 자동 제공!
}
| 자동 제공 메서드 | 하는 일 |
|---|---|
save(entity) | 저장(INSERT) 또는 수정(UPDATE). |
findById(id) | 기본 키로 한 건 조회(SELECT). |
findAll() | 전체 조회. |
delete(entity) | 삭제(DELETE). |
INSERT/SELECT SQL과 커넥션 코드를 매번 짜야 했어요. Spring Data JPA는 JpaRepository<User, Long> 한 줄로 그 반복을 전부 없애줘요.기본 CRUD 말고 조건 조회가 필요할 땐, 메서드 이름을 규칙대로 짓기만 하면 스프링이 쿼리를 자동 생성해줘요. 이걸 쿼리 메서드라고 해요.
findBy 뒤에 필드 이름을 붙이면 그 조건으로 검색돼요. GreaterThan 같은 키워드도 이름에 넣을 수 있어요.
interface UserRepository extends JpaRepository<User, Long> {
// name = ? 로 조회하는 SELECT 자동 생성
List<User> findByName(String name);
// age > ? 로 조회
List<User> findByAgeGreaterThan(int age);
}
| 메서드 이름 | 자동 생성되는 조건 |
|---|---|
findByName(name) | name 컬럼이 일치하는 행 조회. |
findByAgeGreaterThan(age) | age > 값 인 행 조회. |
findByNameAndAge(name, age) | name 일치 AND age 일치. |
findBy + 필드 + 조건 키워드(GreaterThan, Like, Between 등)로 이름을 지으면, SQL을 한 줄도 안 쓰고 조회가 완성돼요.findByAgeGreaterThan이라는 이름 하나가 위 네 조각으로 분해돼 쿼리로 번역돼요.INSERT/SELECT/UPDATE/DELETE SQL과 매핑 코드를 직접 반복.@Query로 직접 작성할 수도 있어요.
@Query에 JPQL(또는 네이티브 SQL)을 써서 직접 정의해요. SQL 실력이 여전히 필요한 이유예요.FROM User처럼 테이블 이름 대신 엔티티 이름을 적어, 어떤 DB를 쓰든 똑같이 동작해요. 반면 네이티브 SQL은 우리가 아는 진짜 SQL을 그대로 쓰는 것(특정 DB 문법까지)이에요. 쉽게 말해 JPQL은 "객체 버전 SQL", 네이티브 SQL은 "원래 SQL"이라고 보면 돼요.@Entity(테이블 매핑) · @Id(기본 키) · @GeneratedValue(자동 증가).findByName처럼 이름 규칙으로 조회를 자동 생성. 복잡하면 JPQL·@Query.