[49일차] Spring Data JPA 데이터 접근 계층

유태형·2022년 7월 7일
0

코드스테이츠

목록 보기
49/77

오늘의 목표

  1. Spring Data JDBC -> Spring Data JPA



내용

Spring Data JDBCSpring Data JPA는 사람으로 치면 성이 Spring Data고 이름이 JDBCJPA냐 와 마찬가지입니다. Spirng Data패밀리 기술 중 하나로써 실제 구현은 조금씩 다르지만 전반적인 흐름이나 인터페이스 등은 비슷합니다.




Spring Data JDBC -> Spring Data JPA

레포지토리

Spring Data JDBC에서 레포지토리는 CrudRepository<엔티티,@Id타입>을 상속받아 필요한 경우 쿼리메서드정도를 추가하고 실제로 구현하지 않았음에도 서비스에서 사용할 수 있었습니다.

또, Page<엔티티>를 사용해서 일부의 데이터만 가져오기 위할 때도 CrudRepository를 상속받은 PagingAndSortingRepository를 상속받아 Page<T> findAll(Pageable)을 사용했었습니다.

Spring Data JPA는 더 많은 기능을 제공하는 레포지토리 인터페이스를 상속 받습니다.

JpaRepositoryPagingAndSortingReository를 상속받아 기본적으로 SpringData JDBC에서 사용하던 메서드들을 이용할 수 있습니다.

public interface 레포지토리 extends JpaRepository<엔티티,@Id타입>{
	//쿼리메서드
    //메서드
}


엔티티

Spring Data JDBC

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<>을 통해 여러 개의 엔티티를 참조할 수 있습니다.

참조:

https://velog.io/@ds02168/45%EC%9D%BC%EC%B0%A8-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%97%94%ED%8B%B0%ED%8B%B0-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A0%95%EC%9D%98-%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A0%88%ED%8F%AC%EC%A7%80%ED%86%A0%EB%A6%AC-%EA%B5%AC%ED%98%84

Spring Data JPA

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



컨트롤러, 서비스, Mapper, Dto, ...

Spring Data JDBC와 Spirng Data JPA 모두 동일하게 사용할 수 있습니다.




후기

Spring Data JPA의 데이터 엑세스 뿐만아니라 서비스, 컨트롤러, 매퍼 등 전반적으로 사용할 때도 어떻게 작동하는 지와 Spring Data JDBC와는 어떤 차이점이 있는지 확인하였습니다. 다르게 지정해야 할 부분이 존재하긴 했지만 대부분 그대로 사용할 수 있다는 점에서 놀라웠습니다.




GitHub

private!

profile
오늘도 내일도 화이팅!

0개의 댓글