스프링 데이터는 개발자의 엔티티 관리, 시점에 맞는 커밋 등의 부담을 줄여 비즈니스 로직에만 집중할 수 있도록 데이터베이스 사용 기능을 클래스 레벨에서 추상화한 인터페이스이다.
CRUD를 포함한 여러 메소드가 포함되어 있으며, 쿼리도 알아서 짜줄 수 있다.
페이징 처리 기능과 메소드 이름으로 자동으로 쿼리를 빌딩하는 기능이 제공된다.
각 데이터베이스의 특성에 맞춰 기능을 확장해 제공하는 기술도 제공된다.
ex. JPA -> Spring Data JPA , MongoDB -> Spring Data MongoDB
다음과 같이 스프링 데이터 JPA를 사용하면 리포지토리 역할을 하는 인터페이스를 생성하여 데이터베이스의 조회, 수정, 생성, 삭제 같은 작업을 간단히 할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
} // 제네릭 -> <엔티티 이름, 엔티티 기본키의 타입>
위와 같이 JpaRepository 인터페이스를 상속 받게 되면 기본 CRUD를 할 수 있는 메소드를 사용할 수 있다.
@Service
public class MemberService {
@Autowired
MemberRepository memberRepository;
public void test() {
// 생성 (Create) - a
memberRepository.save(new Member(1L, "A"));
// 조회 (Read) - b
Optional<Member> member = memberRepository.findById(1L);
List<Member> allMembers = memberRepository.findAll();
// 삭제 (Delete) - c
memberRepository.deleteById(1L);
}
}
a
save() 메소드를 호출해 데이터 객체를 저장한다.
전달 인수로 엔티티 Member를 넘기면 반환값으로 저장한 엔티티를 반환한다.
b
findById() 메소드를 id에 지정해 엔티티를 하나 조회한다.
findAll() 메소드는 전체 엔티티를 조회한다.
c
deleteById() 메소드에 id를 지정하여 엔티티를 삭제한다.
delete() 메소드를 호출해 엔티티를 전달 인수로 넘겨 삭제할 수도 있다.
// Member.java
@Entity // 엔티티로 지정 - a
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본생성자 - b
@AllArgsConstructor
public class Member {
@Id // id 필드를 기본키로 지정 - c
@GeneratedValue(strategy = GenerationType.IDENTITY) // 기본키를 자동으로 1씩 증가. - d
@Column(name = "id", updatable = false)
private Long id;
@Column(name = "name", nullable = false) // name이라는 not null 컬럼과 매핑 - e
private String name;
}
a
@Entity 애너테이션은 Member 객체를 JPA가 관리하는 엔티티로 지정한다. 즉, Member 클래스와 실제 데이터베이스의 테이블을 매핑시킨다.
- @Entity(name = "~") 또는 추가로 @Table(name = "~") 애너테이션을 사용시 name에 해당하는 클래스와 매핑이 된다.
- 따로 테이블 이름을 명시하지 않을 경우 클래스 이름과 같은 이름의 테이블과 매핑이 된다.
b
파라미터가 없는 기본 생성자를 protected 타입으로 생성한다.
엔티티는 반드시 기본 생성자가 있어야 하고 접근 제어자는 public 또는 protected여야 한다.
public 보다는 protected가 더 안전하므로 protected인 기본 생성자를 생성한다.
c
@Id는 Long 타입의 id 필드를 테이블의 기본키로 지정한다.
d
@GeneratedValue는 기본키의 생성 방식을 결정한다.
Identity 전략은 자동으로 기본키가 증가하는 방식으로 기본키를 생성한다.
- 자동키 생성 설정 방식
- AUTO
: 선택한 데이터베이스 방언(dialect)에 따라 방식을 자동으로 선택(기본값).
- Identity
: 기본 키 생성을 데이터베이스에 위임 (AUTO_INCREMENT).
- SEQUENCE
: 데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법. 오라클에서 주로 사용.
- TABLE
: 키 생성 테이블 사용
e
@Column 애너테이션은 데이터베이스의 컬럼과 필드를 매핑해준다.
- @Column 애너테이션의 속성
- name
: 필드와 매핑할 컬럼 이름. 설정하지 않을 시 필드 이름으로 지정한다.
- nullable
: 컬럼의 null 허용 여부. 설정하지 않을 시 true(nullable)
- unique
: 컬럼의 유일한 값(unique) 여부. 설정하지 않을 시 false(non unique)
- coulmnDefinition
: 컬럼 정보 설정. default 값을 줄 수 있다.
// MemberRepository.java
public interface MemberRepository extends JpaRepository<Member, Long> {
}
리포리티지는 엔티티에 있는 데이터들을 조회하거나 저장, 변경, 삭제를 할 때 사용하는 인터페이스이다.
스프링 데이터 JPA에서 제공하는 인터페이스인 JpaRepository클래스를 상속 받아 간단히 구현할 수 있다.