월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 데이터 JPA
테스트 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]테스트 할 때 ItemRepositoy 생성자 주입을 했는데 계속 null이라고 나와서요! 혹시 뭐가 문제인걸까요??package study.datajpa.repository; import jakarta.persistence.Id; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import study.datajpa.entity.Item; import static org.junit.Assert.*; @SpringBootTest public class ItemRepositoryTest { @Autowired ItemRepository itemRepository; @Test public void save() { Item item = new Item("A"); itemRepository.save(item); } }package study.datajpa.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.datajpa.entity.Item; public interface ItemRepository extends JpaRepository<Item, Long> { }package study.datajpa.entity; import jakarta.persistence.Entity; import jakarta.persistence.EntityListeners; import jakarta.persistence.Id; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.domain.Persistable; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.LocalDateTime; @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @EntityListeners(AuditingEntityListener.class) public class Item implements Persistable<String> { // @GeneratedValue @Id private String id; public Item(String id) { this.id = id; } @CreatedDate private LocalDateTime createdDate; @Override public String getId() { return id; } @Override public boolean isNew() { // 해당 데이터가 new냐 아니냐에 따라 새로운 객체인지 아닌지 판단 return createdDate == null; } }아래는 오류 내용입니다Cannot invoke "study.datajpa.repository.ItemRepository.save(Object)" because "this.itemRepository" is nulljava.lang.NullPointerException: Cannot invoke "study.datajpa.repository.ItemRepository.save(Object)" because "this.itemRepository" is null at study.datajpa.repository.ItemRepositoryTest.save(ItemRepositoryTest.java:19) at java.base/java.lang.reflect.Method.invoke(Method.java:580)
- 미해결실전! 스프링 데이터 JPA
단방향으로 코드를 짜도 Lazy 로딩으로 바꿔야하나요??
양방향으로 코드를 짤때 Lazy로 바꿔야하는건 이유를 아는데단방향일때는 굳이 안바꿔도 되지 않을까 생각이 들어 질문합니다.
- 미해결실전! 스프링 데이터 JPA
단건 조회 시 Optional
<순수 JPA 기반 리포지토리 만들기>에서 단건 조회 시 Optional로 반환하는데, repository layer에서 orElseThrow를 던지는 방법은 별로인가요?
- 미해결실전! 스프링 데이터 JPA
벌크성 수정 쿼리도 select를 한 후에 update?
안녕하세요,예시로 team_id가 2인 member를 team_id가 1인 member로 변경하고 싶은 경우가 있다고 가정해보겠습니다. @Modifying @Query("update Member m set m.team.id = 1 where m.team.id = :id") void updateMemberTeamTo1(@Param("id") Long id);위 코드처럼 단순히 team_id 로 수정하면 update 쿼리 한 번으로 변경이 가능합니다.@Modifying @Query("update Member m set m.team = :tobe where m.team = :asis") void updateMemberTeamTo1(@Param("asis") Team asis, @Param("tobe") Team tobe);하지만 team 엔티티를 넘긴다면 team id가 1인 Team과 변경할 team id를 가진 Team을 select 해야하니 쿼리가 총 3번 나갑니다. 단건 update 를 할 때 변경감지를 사용하기 위해 먼저 PK로 select 하고 있습니다. 그런데 여러건을 벌크성 수정 쿼리로 변경을 할 때도 select를 해서 영속성 컨텍스트에 올린 후 변경해야 할까요? 좋은 강의 항상 감사드립니다.
- 미해결실전! 스프링 데이터 JPA
junit5쓴다는건가요ㅠ
강의 영상에서는 위와같이 구성해서 4를 제외 시켰자나요? 그런데 왜 강의 pdf 에서는 4를 쓴다는건가요?ㅠ
- 미해결실전! 스프링 데이터 JPA
ID에 @GeneratedValue를 적용하지 않았는데 강의처럼 동작하지 않습니다.
@Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Item { @Id private String id; public Item(String id) { this.id = id; } } public interface ItemRepository extends JpaRepository<Item, String> { } @SpringBootTest class ItemRepositoryTest { @Autowired ItemRepository itemRepository; @Test void save() { Item item = new Item("A"); itemRepository.save(item); } } 위와 같이 강의를 따라서 테스트 코드를 작성했습니다. 그런데디버깅 찍은 곳을 확인해보니Member(id=null, username=user0, age=0)이렇게 나왔습니다. 분명 생성자에서 Item의 id를 "A"로 세팅했는데 어디서 문제가 생긴걸까요?
- 미해결실전! 스프링 데이터 JPA
트랜젝션 옵션의 전파에 대해 질문드립니다.
예전에 영한님이 답변하신 내용 중에스프링이 제공하는 트랜잭션은 처음 시작한 트랜잭션을 기반으로 전파됩니다.그러니까 서비스에서 트랜잭션을 시작하면 리포지토리의 트랜잭션이 해당 트랜잭션을 그대로 이어 받습니다.라는 내용이 있었습니다.그렇다면, 컨트롤러, 서비스, 리포지토리 순으로 코드가 진행된다고 할 때, 만약 서비스 계층에 @Trasnactional(readonly=false)가 걸려있고 리포지토리 계층에 @Trasnactional(readonly=true)가 걸려있으면 서비스 계층이 먼저 호출되므로 readonly=false 옵션이 적용된 채로 리포지토리 계층까지(기존 리포지토리 계층의 옵션은 무시된채로) 코드가 흘러가는걸까요?
- 미해결실전! 스프링 데이터 JPA
Spring Data JPA에서 update 하는 방법
검색해보니 Spring Data JPA는 순수 JPA와 다르게 save() 조차 하지 않아도 자동으로 변경감지가 일어난다고하는데, 제가 작성한 코드를 바탕으로 테스트해보니 save()를 하지 않으면 업데이트가 되지 않았습니다. 조금 더 디테일한 설명을 해주실 수 있을까요? save()는 @PostMapping의 postRepository.save(findPost); 부분을 지칭하는 것입니다. @Controller @RequestMapping("/post") @RequiredArgsConstructor @Slf4j public class PostController { private final BoardService boardService; private final BoardRepository boardRepository; private final PostService postService; private final PostRepository postRepository; /** * 게시물 수정 */ @GetMapping("/edit/{id}") public String showEdit(@PathVariable Long id, @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { Post findPost = boardRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("No Post Found."));// findPost 게시물 보여주기 model.addAttribute("findPost", findPost); return "editPost"; } @PostMapping("/edit/{id}") public String editPost(@PathVariable Long id, Post editPost) { Post findPost = boardRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("No Post Found.")); findPost.setTitle(editPost.getTitle()); findPost.setContent(editPost.getContent()); findPost.setCategory(editPost.getCategory()); findPost.setLastModifiedTime(LocalDateTime.now()); postRepository.save(findPost); return "redirect:/board/post/" + id; } } public interface PostRepository extends JpaRepository<Post, Long> { /** * 게시물 저장 */ Post save(Post post); }
- 미해결실전! 스프링 데이터 JPA
LazyInitializationException에 대해 질문드립니다!
배운것을 바탕으로 개인적으로 게시판을 만들어보는 중입니다. 게시물을 추가할 때 다음과 같은 에러가 발생해서 몇시간째 애를 먹고있는 중입니다.org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.myproject.jpaboard.domain.Member.posts: could not initialize proxy - no Session아무래도 Post(게시물) 엔티티의 연관관계 편의 메서드에서 문제가 발생하는 것 같습니다. 서비스 계층에 @Transactional도 붙여줬음에도 계속해서 문제가 발생해서 질문 남깁니다. 유일한 해결책은 Member의 posts에 EAGER을 붙이는 방법이었습니다. 하지만 이는 적절치 않아보입니다. 어떻게 해야 해결할 수 있을까요.핵심이 되는 코드들을 아래에 추가했습니다. package com.myproject.jpaboard.web.controller; import com.myproject.jpaboard.domain.Member; import com.myproject.jpaboard.domain.Post; import com.myproject.jpaboard.web.SessionConst; import com.myproject.jpaboard.web.form.PostForm; import com.myproject.jpaboard.web.repository.BoardRepository; import com.myproject.jpaboard.web.service.BoardService; import com.myproject.jpaboard.web.service.PostService; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @Controller @RequestMapping("/post") @RequiredArgsConstructor @Slf4j public class PostController { private final BoardService boardService; private final BoardRepository boardRepository; private final PostService postService; /** * 게시물 추가 */ @PostMapping("/new") public String addPost(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, @Validated PostForm postForm, BindingResult bindingResult) { log.info("postForm={}", postForm); if (bindingResult.hasErrors()) { log.info("errors={}", bindingResult); return "newPost"; } postService.addPost(postForm, loginMember); return "redirect:/board/list"; } } // Post.java @Entity @Getter @Setter public class Post { @Id @GeneratedValue @Column(name = "post_id") private Long id; private String title; private String writer; @Lob @Column(columnDefinition="LONGTEXT") private String content; @Column(updatable = false) private LocalDateTime createdTime; private LocalDateTime lastModifiedTime; private Long viewCount; @ManyToOne(fetch = FetchType.LAZY) // 다쪽이 연관관계의 주인 @JoinColumn(name = "member_id") private Member member; @Enumerated(EnumType.STRING) private CategoryType category; @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) private List<Comment> comments = new ArrayList<>(); public Post() {} // 연관관계 편의 메서드 public void setMember(Member member) { this.member = member; member.getPosts().add(this); } @Override public String toString() { return "Post{" + "id=" + id + ", title='" + title + '\'' + ", writer='" + writer + '\'' + ", content='" + content + '\'' + ", createdTime=" + createdTime + ", lastModifiedTime=" + lastModifiedTime + ", viewCount=" + viewCount + ", category=" + category + '}'; } } // Member.java @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String email; private String password; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL) private List<Post> posts = new ArrayList<>(); /** * POST 추가 로직 (도메인 모델 패턴) */ // public void addPost(Post post) { // // // } @Override public String toString() { return "Member{" + "address=" + address + ", name='" + name + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", id=" + id + '}'; } } // PostService.java @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class PostService { private final BoardRepository boardRepository; private final PostRepository postRepository; /** * 게시물 추가 */ @Transactional public void addPost(PostForm postForm, Member loginMember) { Post post = new Post(); postForm.setCreatedTime(LocalDateTime.now()); // setter로 세팅 post.setTitle(postForm.getTitle()); post.setWriter(postForm.getWriter()); post.setContent(postForm.getContent()); post.setCreatedTime(postForm.getCreatedTime()); post.setCategory(postForm.getCategory()); post.setViewCount(0L); post.setWriter(loginMember.getName()); post.setMember(loginMember); postRepository.save(post); } }
- 미해결실전! 스프링 데이터 JPA
@Transaction을 서비스, 리포지토리 계층 모두에 적용해야하나요
Spring Data JPA의 경우 자동으로 @Transaction이 적용되는 것으로 알고있는데, 이를 사용하는 서비스 계층에도 @Transaction을 적용해야하는지 궁금합니다.
- 해결됨실전! 스프링 데이터 JPA
테스트 시 생성자 주입에 관하여
package com.myproject.jpaboard.web.service; import com.myproject.jpaboard.domain.Post; import com.myproject.jpaboard.web.repository.BoardRepository; import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; @SpringBootTest @RequiredArgsConstructor class PostServiceTest { private final BoardRepository boardRepository; private final PostService postService; @Test void addViewCount() { Optional<Post> byId = boardRepository.findById(1L); Post post = byId.get(); System.out.println("post.getViewCount() = " + post.getViewCount()); postService.addViewCount(1L); System.out.println("post.getViewCount2() = " + post.getViewCount()); } }안녕하세요. 개인적으로 배운것들을 따로 테스트중입니다. 위의 코드와 같이 생성자 주입을 하니 boardRepository에 NullPointerException이 발생하였습니다. @Autowired를 이용한 필드 주입으로 코드를 수정해보니 문제가 해결되었습니다. 원인을 추측해보면, 테스트 메서드 실행할 때 주입받을 빈이 초기화되어있지 않기 때문으로 보입니다.이런 상황이 처음이라 지식 공유자님의 의견을 듣고싶습니다.
- 미해결실전! 스프링 데이터 JPA
spring data jpa의 merge() 를 쓰지 말고 persist() 만 쓰라는 걸까요??
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서 merge 를 쓰지 않는게 좋다고 이야기 해 주셨는데, spring data jpa의 save() 를 실무에서 쓰지 말라는 뜻일까요?? 아니면 쓰되 isNew 로직을 타도록 잘 세팅해두라는 뜻일까요?? 실무에서는 객체 저장 어떻게 하는지 궁금합니다~!
- 미해결실전! 스프링 데이터 JPA
Member 엔티티의 연관관계 메서드에 대해 질문드립니다.
Member 엔티티의 연관관계 메서드(changeTeam)는 멤버가 기존에 속한 팀을 매개변수로 전달한 새로운 팀으로 변경합니다. 그런데 기존에 속한 팀의 리스트에서 멤버를 제거해주는 작업도 추가해줘야 하지 않나 싶은데, 예제기 때문에 단순화하기 위해 생락햐신건가요? private void changeTeam(Team team) { this.team = team; team.getMembers().add(this); // add()로 추가는 했지만, 기존의 팀에서 제거하는 코드는 없음 }
- 미해결실전! 스프링 데이터 JPA
스프링 부트 3.x버전은 쿼리가 다르게 나오나요?
slice 설명해주시는 부분인 16:30 부분에 쿼리가 저는 아래와 같이 나오는데 하이버네이트6 버전이여서 다르게 나오는 걸까요?selectm1_0.member_id,m1_0.age,m1_0.team_id,m1_0.usernamefrommember m1_0wherem1_0.age=?order bym1_0.username descoffset? rowsfetchfirst ? rows onlyList로 테스트 하는 경우도(18:57) 아래와 같이 다르게 나옵니다.selectm1_0.member_id,m1_0.age,m1_0.team_id,m1_0.usernamefrommember m1_0wherem1_0.age=?order bym1_0.username descoffset? rowsfetchfirst ? rows only
- 미해결실전! 스프링 데이터 JPA
JPA join 관련 질문
안녕하세요 JPA 학습중 join 관련하여 질문 드립니다. public class Score{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long scoreId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "game_id") private Game game; }Score라는 클래스가 있고, Game 엔티티와 ManyToOne 연관관계가 있을 때 public interface ScoreRepository extends JpaRepository<Score,Long>{ @Query("select s from Score s join s.game g left join s.member m left join m.profileImg p " + "where g.gameId=:gameId and (p.type = 'PROFILE' OR p IS NULL) order by s.totalScore desc") Slice<Score> findByGameId(@Param("gameId") Long gameId, Pageable pageable); } Game별 Score를 가져올 경우 해당 게임에 등록된 스코어가 없는 경우 결과가 반환되지 않아서 Game 엔티티의 게임명이나 게임타입 같은 게임정보를 가져올수가 없습니다. right join을 사용해보려 했는데 리턴값이 Slice<Score>라서 그런지 형변환 오류가 발생하는 것 같구요..이럴경우에는 Game 엔티티에서 @OneToMany 연관관계를 사용해서 결과를 가져와야하나요?? 그럴 경우 페이징은 어떻게 해결해야하는지 잘모르겠습니다..
- 미해결실전! 스프링 데이터 JPA
낙관적 락에 대해 질문이 있습니다.
Hibernate는 @Version을 사용하고, Lock 옵션을 @Lock(LockModeType.OPTIMISTIC)을 사용할 경우에 NONE 모드와 다르게 엔티티를 수정하지 않고 단순히 조회만 해도 버전을 확인한다고 강사님 JPA 책에 작성되어있습니다. 실제 코드로 구현해보니 버전만 확인하는거 같더라구요그 사이에 다른 트랜잭션이 해당 엔티티를 수정하여 버전이 변경되어도 ObjectOptimisticLockingFailureException 예외가 발생하지 않습니다. 간단하게 로직을 설명드리면 트랜잭션 A가 옵티미스틱 락 모드로 회원을 조회합니다. version = 0트랜잭션 A를 5초 대기합니다.트랜잭션 B가 회원을 수정하여 버전이 변경됩니다. version = 1트랜잭션 B가 종료됩니다.5초가 지나 트랜잭션 A가 종료됩니다.트랜잭션 A가 종료될 때 옵티미스틱 락 모드라서 마지막에 버전을 확인합니다.select version as version_ from member where id=?그런데 트랜잭션 A가 종료될때에 회원 버전이 다르지만 예외가 발생하지 않습니다. 이러면 OPTIMISTIC의 용도가 트랜잭션을 커밋할 때 버전 정보를 조회해서 현재 엔티티의 버전과 같은지 검증한다. 만약 같지 않으면 예외가 발생한다고 작성되어있는데 예외가 발생하지 않는다면 강사님께서 설명해주신 조회한 엔티티는 트랜잭션이 끝날 때까지 다른 트랜잭션에 의해 변경되지 않아야한다. 조회 시점부터 트랜잭션이 끝날때까지 조회한 엔티티가 변경되지 않음을 보장한다.이 말의 다른 의미가 어떤건지 궁금합니다 !아니면 제가 테스트를 잘못하고 있는 걸까요..? 아래는 로직에 대한 간단한 코드입니다.도메인package org.example.stock_rt_1.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; private long personId; private int age; @Version private Long version; public Member(long personId, int age) { this.personId = personId; this.age = age; } public void addAge() { ++this.age; } }리포지토리package org.example.stock_rt_1.repository; import jakarta.persistence.LockModeType; import org.example.stock_rt_1.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; import java.util.Optional; public interface MemberRepository extends JpaRepository<Member, Long> { @Lock(LockModeType.OPTIMISTIC) Optional<Member> findByPersonId(Long id); }서비스package org.example.stock_rt_1.service; import lombok.RequiredArgsConstructor; import org.example.stock_rt_1.domain.Member; import org.example.stock_rt_1.repository.MemberRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @Service @RequiredArgsConstructor public class MemberService { public final MemberRepository memberRepository; @Transactional public void addAge(long personId) { sleep(500); //findMember가 먼저 실행되야하기 때문에 넣었습니다. Member member = memberRepository.findByPersonId(personId).orElseThrow(); member.addAge(); } @Transactional public void findMember(long personId) { memberRepository.findByPersonId(personId); sleep(5000); } private void sleep(long mills) { try { Thread.sleep(mills); } catch (InterruptedException e) { System.out.println("e = " + e.getMessage()); } } }테스트코드package org.example.stock_rt_1.service; import org.example.stock_rt_1.domain.Member; import org.example.stock_rt_1.repository.MemberRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class MemberServiceTest { @Autowired private MemberService memberService; @Autowired private MemberRepository memberRepository; @Test @DisplayName("회원 정보를 조회중 다른 트랜잭션에서 정보를 변경했다.") void addAge() throws InterruptedException { // given int personId = 5555; memberRepository.save(new Member(personId,15)); // when Thread selectThread = new Thread(() -> memberService.findMember(personId),"트랜잭션-A"); selectThread.start(); Thread updateThread = new Thread(() -> memberService.addAge(personId),"트랜잭션-B"); updateThread.start(); selectThread.join(); updateThread.join(); } }로그[트랜잭션-A] : select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? Hibernate: select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? [트랜잭션-B] : select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? Hibernate: select m1_0.id,m1_0.age,m1_0.person_id,m1_0.version from member m1_0 where m1_0.person_id=? [트랜잭션-B] : update member set age=?,person_id=?,version=? where id=? and version=? [트랜잭션-B] : select version as version_ from member where id=? [트랜잭션-A] : select version as version_ from member where id=?
- 미해결실전! 스프링 데이터 JPA
PageRequest, pageable
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이전 강의에서는 PageRequest.of(pagenum, pagesize, sort.by()) 를 사용해서 직접 설정해줘서 리포지토리 매서드에 인자로 넘겼는데 mvc의 @PageableDefault를 사용하면 이런 부분을 자동으로 처리해준다라고 이해해도 괜찮을까요?
- 미해결실전! 스프링 데이터 JPA
SpringDataJPA 의 page.getTotalElements 메서드의 공식 문서 링크는?
안녕하세요. Spring data jpa 페이징과 정렬 강의를 듣고있습니다. 아래 메서드를 사용하셨던데, 아래 메서드들에 대한 공식 문서를 찾고있는데 나오지가 않습니다.제가 공식 문서를 찾아보는데 익숙하지 않아 찾지 못한거같은데아래 메서드들에 대한 공식 문서가 있을까요?page.getTotalElements : 전체 Element 개수page.getNumber()page.getTotalPages()page.isFirst()page.hasNext
- 해결됨실전! 스프링 데이터 JPA
gavlyukovskiy 의존성을 추가했는데도 파라미터 로그가 보이지 않슴니다.
안녕하세요 다음과 같이 의존성을 했지만 보이지 않습니다. 무슨 문제가 있을까요?다음과 같이 로그가 뜨며 현재 psy 관련 로그는 보이지 않습니다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7' }
- 미해결실전! 스프링 데이터 JPA
@SQLInsert 관련 질문입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요?아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]@Data @Entity(name="ha2_meta_usable_customlog_table") @Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"category", "grouping"}) }) @SQLInsert(sql="REPLACE INTO ha2_meta_usable_customlog_table(category, grouping) VALUES(?,?)") public class Table{ @Id @GeneratedValue private long idx; @Column private String category; @Column private String grouping; } 코드가 위와 같은데 @SQLInsert 가 어떻게 적용되는건지 잘 모르겠어서 질문남깁니다...