Spring Data JDBC
와 Spring Data JPA
는 사람으로 치면 성이 Spring Data
고 이름이 JDBC
냐 JPA
냐 와 마찬가지입니다. Spirng Data
패밀리 기술 중 하나로써 실제 구현은 조금씩 다르지만 전반적인 흐름이나 인터페이스 등은 비슷합니다.
Spring Data JDBC
에서 레포지토리는 CrudRepository<엔티티,@Id타입>
을 상속받아 필요한 경우 쿼리메서드
정도를 추가하고 실제로 구현하지 않았음에도 서비스에서 사용할 수 있었습니다.
또, Page<엔티티>
를 사용해서 일부의 데이터만 가져오기 위할 때도 CrudRepository
를 상속받은 PagingAndSortingRepository
를 상속받아 Page<T> findAll(Pageable)
을 사용했었습니다.
Spring Data JPA
는 더 많은 기능을 제공하는 레포지토리 인터페이스를 상속 받습니다.
JpaRepository
는 PagingAndSortingReository
를 상속받아 기본적으로 SpringData JDBC
에서 사용하던 메서드들을 이용할 수 있습니다.
public interface 레포지토리 extends JpaRepository<엔티티,@Id타입>{
//쿼리메서드
//메서드
}
Spring Data JDBC에서 엔티티간의 관계를 표현시 다음처럼 나타냅니다.
@Getter
@Setter
@Table("테이블")
public class 엔티티{
@Id
private long id;
private AggregateReference<엔티티,@Id의타입> 다른_애그리거트_루트의_id;
@MappedCollection(idColumn = "엔티티_ID")
private Set<동일애그리게이트_엔티티> 앤티티s = new LinkedHashSet<>();
}
@Table("테이블")
: Spring Data JDBC가 자동으로 엔티티명으로 테이블명을 만들어 주지만, 다른 이름으로 테이블명을 정의하고 싶은경우 @Table에너테이션으로 이름을 지정할 수 있습니다.
AggregateReference<엔티티,@Id의타입>
: 다른 애그리거트의 루트 엔티티와 관계를 정의하기 위해 사용되는 클래스입니다. 제네릭으로 루트 엔티티의 클래스타입과, 루트엔티티의 @Id변수의 타입을 지정합니다.
애그리거트 루트와 애그리거트 루트 간에는 객체로 직접 참조하는 것이 아니라 @Id로 참조합니다.
MappedCollection(idColumn = "엔티티ID")
: 동일 애그리거트 내의 다른 엔티티 객체가 애그리거트 객체를 참조하기 위한 엔티티ID로 외래키를 지정해 줍니다.(해당 엔티티에서 별도 변수 지정X)
Set<동일애그리거트_엔티티> 엔티티s = new LinkedHashSet<>()
: 애그리거트 루트에서 동일 애그리거트내 엔티티 객체를 참조하기 위한 참조 변수입니다. 1:N관계이므로 Set<>을 통해 여러 개의 엔티티를 참조할 수 있습니다.
참조:
Spring Data JPA경우 엔티티 설정과 속성을 지정하는 에너테이션이 조금씩 다릅니다.
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "엔티티명1")
@Table(name= "테이블명1")
public class 엔티티1{
@Id
@GeneratedValeu(strategy = GenerationType.IDENTITY)
private Long 엔티티Id;
@Column(nullable = false, updatable = false, unique = true, length = 100, name = "컬럼명", ...)
private String 컬럼;
@ManyToOne
@JoinColumn(name ="외래키_컬럼명")
private 엔티티2 엔티티1_외래_필드;
...
}
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "엔티티명2")
@Table(name= "테이블명2")
public class 엔티티2{
@Id
@GeneratedValeu(strategy = GenerationType.IDENTITY)
private Long 엔티티Id;
@Column(nullable = false, updatable = false, unique = true, length = 100, name = "컬럼명", ...)
private String 컬럼;
@OneToMany(mappedBy="엔티티1_외래_필드")
private List<엔티티1> 엔티티1s = new ArrayList<>();
...
}
그외 JPA 정보는 이전 게시글에 정리해두었습니다.
참조:
https://velog.io/@ds02168/47%EC%9D%BC%EC%B0%A8-JPA-%EC%97%94%ED%8B%B0%ED%8B%B0-%EB%A7%A4%ED%95%91
Spring Data JDBC와 Spirng Data JPA 모두 동일하게 사용할 수 있습니다.
Spring Data JPA의 데이터 엑세스 뿐만아니라 서비스, 컨트롤러, 매퍼 등 전반적으로 사용할 때도 어떻게 작동하는 지와 Spring Data JDBC와는 어떤 차이점이 있는지 확인하였습니다. 다르게 지정해야 할 부분이 존재하긴 했지만 대부분 그대로 사용할 수 있다는 점에서 놀라웠습니다.
private!