CS 잡지식 썸네일형 리스트형 요청 API에서 Paging 정보 넘기기!!! @GetMapping("/members") public Page list(Pageable pageable){ // Page, Pagealbe 모두 [인터페이스]이다. Page page = memberReposiotry.findAll(pageable); return page; } 위 API는 page 1의 결과를 보여준다.(3개의 row가 반환된다) 위 API는 page 2의 결과를 보여준다.(3개의 row가 반환된다) [page=?&size=?]를 입력하면, Spring FrameWork가 [PageRequest] 객체를 자동 생성해서 매개 변수인 Pageable 인터페이스에 삽입을 한다. 그 정보를 바탕으로 쿼리 메서드를 사용하여, 위와 같이 Page를 반환하여 요청 API에서 요구한 Page를 siz.. 더보기 [도메인 엔티티]로 API를 개발이 허용되는 유일한 경우! [조회]용으로만 사용하는 경우, 도메인 엔티티로 API를 개발해도 괜찮다. @GetMapping("/membersV2/{id}") public String findMemberv2(@PathVariable("id") Member member){ // PK인 ID를 받아서 [바로] 해당 엔티티로 반환! // PK값을 받아서 해당 객체를 찾는 [단순한] API일 때는 컨버터를 사용해도 괜찮지만, // 사실 실무에서 PK를 받아서 객체를 찾는 그런 단순한 API는 잘 없다. // 대부분의 경우, PK 값을 받아서 여러 로직들을 짜주는 경우가 대부분이다. // -> [도메인 엔티티]로 API 개발을 절대 해서는 안된다. // 만약에 [도메인 엔티티]로 API 개발을 한다고 하면 // 딱 [조회] 용으로만 사용해야.. 더보기 @Column(updateable , insertable .... ), @PrePersist, @PreUpdate @PrePersist JPA에서 persist()가 호출이 되면, 그 전에 @PrePersist가 붙은 메서드가 실해이 된다. @PreUpdate : JPA에서 Dirty Checking에 의해서 변경이 돼서, Context에 있는 쿼리가 날라 가기 직전에 , @PrePersist가 붙은 메서드가 실해이 된다. MappedSuperclass // 이 클래스는 진짜 [부모] 클래스로서 상속시키는 것이 아니라, 그냥 속성만 내려 받겠다는 에노테이션! @Getter public class JpaBaseEntity { @Column(updatable = false) // createdDate는 [수정]이 불가능! private LocalDateTime createdDate; // 등록일 private Local.. 더보기 사용자 정의 인터페이스(feat. Spring Data JPA) // 사용자 정의 인터페이스 선언! public interface MemberRepositoryCustom { List findMemberCustom(); } //사용자 정의 인터페이스 구현! @RequiredArgsConstructor public class MemberRepositoryCustomImpl implements MemberRepositoryCustom { private final EntityManager entityManager; @Override public List findMemberCustom() { return entityManager.createQuery("select m from Member m",Member.class) .getResultList(); } } // Member.. 더보기 Dirty Checking의 치명적인 Weakness(단점)(feat. hint,lock) Member member = repository.save(new Member("member1", 10)); entityManager.flush(); entityManager.clear(); Optional optional = repository.findById(member.getId()); // Context를 clear()하였으므로, DB에서 조회를 한다. Member findMember = optional.get(); // "member1" -> "member2"로 변경(dirty checking 기법으로 변경) findMember.setUsername("member2"); entityManager.flush(); // member2로 출력됨. System.out.println("findMember .. 더보기 SELECT ~~ FOR UPDATE(Feat. Concurrency Problem ) SELECT ~ FOR UPDATE란 SELECT ~ FOR UPDATE 구문은 "데이터 수정하려고 SELECT 하는 중이야~ 다른 사람들은 데이터에 손 대지 마!" 라고 할 수 있습니다. 좀 더 딱딱한 표현으로는 동시성 제어를 위하여 특정 데이터(ROW)에 대해 베타적 LOCK을 거는 기능입니다. 예를 들어 정단 단순무식한 예로 영화관의 영화 예매 테이블이 있다고 가정합니다. 영알못이라 잔여 좌석을 seat로 표현하였습니다. 여기서 사용자 A와 사용자 B가 월E를 예매하려 동시에 데이터에 접근합니다. A가 잔여좌석 정보를 SELECT하고 예매를 완료하면서 잔여좌석은 1 줄어든 11로 UPDATE 하려합니다. 그런데 그 사이에 B 사용자 또한 예매를 위해 SELECT하였고 A와 마찬가지로 잔여좌석 12를.. 더보기 @EntityGraph(feat. Spring Data JPA가 제공하는 Fetch Join) public interface MemberReposiotry extends JpaRepository { //Spring Data JPA로 Fetch Join 구현 1 @Query("select m from Member m left join fetch m.team") List findMemberFetchJoin(); //이 방법만으로도 충분히 fetch join을 간편하게 구현이 가능하나, //Spring Data JPA는 [@EntityGraph]를 이용하여, 기존과 같이 쿼리 메서드 명으로 fetch join을 구현하는 기능을 지원한다. //Spring Data JPA로 Fetch Join 구현 2 @EntityGraph(attributePaths = {"team"} ) // Member -> Team.. 더보기 Spring Data JPA가 제공하는 막강한 [페이징],[정렬] RDB이든, Mongo 같은 DB는 모두 아래 2개만으로 Spring Data JPA는 [모두] 해결한다. org.springframework.data.domain.Sort : 정렬 기능(인터페이스이다.) org.springframework.data.domain.Pageable : 페이징 기능(내부에 Sort 포함)(인터페이스이다.) 반환 타입 org.springframework.data.domain.Page : 추가 count 쿼리 결과를 [포함]하는 페이징 org.springframework.data.domain.Slice : 추가 count 쿼리 [없이] 다음 페이지만 확인 가능 (내부적으로 limit + 1조회) List (자바 컬렉션): 추가 count 쿼리 없이 결과만 반환 public int.. 더보기 이전 1 ··· 3 4 5 6 7 8 9 ··· 16 다음