위강의에 MemberDto에 만약 address필드까지 추가해야한다면 MemberDto 리스트를 만들때 List<MemberDto> collect = findMembers.stream() .map(m -> new MemberDto(m.getName(),m.getAddress())) .collect(Collectors.toList()); 위와 같이 해준다면 MemberDto에서의 address와 findMembers에서의 address가 같은 주소값을 참조하고 있어 상황에 따라 뜻하지 않는 에러가 발생할 수 있다고 생각하는데 MemberDto에서 address 객체를 아예 새로 만드는 것이 더 좋을까요?? 현업에서는 어떻게 사용하는지 궁금합니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 함수를 연속으로 호출할 때 함수().함수().함수() 이런 형식으로 사용하곤 합니다. 인텔리제이에서 이런 문법을 쓰면 자동완성으로 탭이 연달아 일어나 보기가 껄끄럽습니다. 자동완성을 일자로 해주는 해결방법 있을까요??
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세 문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요. 안녕하세요. 호돌맨님 강의 잘 보고 있습니다! Post 관련 테스트를 작성할 때, 저는 @Transactional을 이용해서 DB에 데이터가 반영되지 않도록 시도했습니다.그리고 테스트를 진행하였습니다. 메서드를 각각 테스틀 할 때는 통과했지만, 메서드 모두 동시에 돌릴 때는 테스트 통과에 실패하였습니다. @Transcational, 영속성 컨텍스트로 구글링을 시도했었습니다. @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)를 사용하면 영속성 컨텍스트를 새로 생성함으로써 테스트가 모두 통과가 되었지만, 매번 영속성 컨텍스트를 새로 생성하는 것은 비효율적이라고 생각했습니다.. 결론적으로 제가 본 바로는 유의미한 결과를 얻을 수 없었습니다.. 아래 코드와 그에 출력되는 결과를 이미지로 첨부해두었습니다. 혹시 어떤 것이 원인인건지 힌트라도 알려주실 수 있을까요?? 구글링 키워드를 알려주셨으면 좋겠습니다..! (해결법은 제가 찾겠습니다!!) PostService.java @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class PostService { private final PostRepository postRepository; @Transactional public void save(PostCreateDto postCreate){ // Post post = new Post(postCreate.getTitle(), postCreate.getContent()); Post post = Post.builder() .title(postCreate.getTitle()) .content(postCreate.getContent()) .build(); postRepository.save(post); } public Long findPostById(Long postId){ Post post = postRepository.findById(postId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 게시물입니다.")); return post.getId(); } } PostServiceTest.java import com.toktok.core.domain.post.Post; ... @SpringBootTest @Transactional. //똑같이 영속성 컨텍스트를 공유하고 있기 때문에 save가 롤백되어야 하지 않나요??.. class PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("데이터가 저장 되어야합니다.") void save_test(){ //given PostCreateDto postDto = PostCreateDto.builder() .title("제목입니다.") .content("내용입니다.") .build(); //when postService.save(postDto); //then Post post = postRepository.findAll().get(0); assertThat(post.getId()).isEqualTo(1L); assertThat(post.getTitle()).isEqualTo(postDto.getTitle()); } @Test @DisplayName("데이터는 하나 조회") void find_test(){ //given Long postId = 1L; PostCreateDto postDto = PostCreateDto.builder() .title("글 제목입니다.") .content("글 내용입니다.") .build(); postService.save(postDto); //when Long postById = postService.findPostById(1L); //then assertThat(postById).isEqualTo(1L); } @Test @DisplayName("존재하지 않는 데이터 확인") void not_exist_post(){ //given Long notExistPostId = 2L; Post post = Post.builder() .title("글 제목입니다.") .content("글 내용입니다.") .build(); Post savedPost = postRepository.save(post); //when postService.findPostById(savedPost.getId()); //then assertThrows(IllegalArgumentException.class, ()-> postService.findPostById(notExistPostId)); } }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요 영한님. QueryDsl과 @EntityGraph 사용 기준에 대해 궁금한 부분이 생겨서 질문 남깁니다. fetchJoin을 할 때, 여러가지 방법이 있겠지만 QueryDsl과 @EntityGraph이 가장 편리한 방법이라고 생각합니다. 저의 경우엔 @EntityGraph가 가독성이 더 좋다고 느껴서 간단한 조회용 페치조인의 경우에 사용하고, 검색조건이 있는 복잡한 조회의 경우엔 Querydsl을 사용하는데요. 실제로 이 둘을 사용할 때 어떤 것에 우선순위를 두시는지 궁금합니다. 강의 잘 듣고 있습니다. 감사합니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강사님 test 부분에서 계속 오류가 나네요...
java11, springboot2.7.1로 프로젝트 진행했던 프로젝트를 열어 실행하니 에러가 발생합니다. 해결하지 못하여 질문드립니다! 발생에러 11:46:16 AM: Executing ':RandomApplication.main()'... > Task :compileJava FAILED Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. See https://docs.gradle.org/7.4.1/userguide/command_line_interface.html#sec:command_line_warnings 1 actionable task: 1 executed FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileJava'. > Could not resolve all files for configuration ':compileClasspath'. > Could not find javax.xml.bind:jsxb-api:. Required by: project : * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 652ms 11:46:16 AM: Execution finished ':RandomApplication.main()'. Execution failed for task ':compileJava'. > Could not resolve all files for configuration ':compileClasspath'. > Could not find javax.xml.bind:jsxb-api:. Required by: project : Possible solution: - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html 시도 java JDK 버전 확인, 빌드 자동 실행 설정 등.. 구글링해서 찾아봤으나 해결하지 못했습니다ㅠㅠ 검색해보면 jaxb -api:. 를 기준으로 나오는데, 제 에러는 jsxb -api 입니다 이 둘의 차이는 무엇인가요?
안녕하세요! Querydsl강의를 들으며 직접개발을해보며 적용해보고 있습니다! 근데 예제에 나와있지 않고 궁금증이 해소되지 않아 질문 남기게 되었습니다. bulk연산 수행시 join 조건을 사용할 수 없나요? member에서 그 전에 활동한 내역이 있는 사람이면, haveBeenActive값을 모두 true로 만들고 싶습니다.. (member의 email정보는 unique해서 식별자로 같은 사람인지 인식하게 했습니다) 2023-03-24 07:45:35.099 ERROR 33353 --- [nio-8080-exec-1] o.s.m.i.c.GlobalExceptionHandler : [Unknown Error] : null 이러한 오류가 납니다.. bulk연산 수행할때 join을 사용할 수 없나요? 계속해서 골머리를 앓다가 질문 남깁니다.. 감사합니다! public void 함수(Integer activityNum) { val member = QMember.member; val sub_member = new QMember("sub"); // 자기 자신과 join queryFactory.update(member) .set(member.haveBeenActive, true) .where(member.activity.eq(activityNum) .and(member.id.eq( JPAExpressions.select(member.id) .from(member) .join(sub_member) .where(member.activity.between(1,activityNum - 1) .and(member.email.eq(sub_member.email))) .fetchOne() ))).execute(); }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 테스트 하려고 하면 자꾸 이렇게 뜨네요..ㅠ package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.jupiter.api.Assertions.*; @RunWith(SpringRunner.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long saveId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(saveId)); } @Test public void 중복_회원_예제() throws Exception{ //given //when //then } } package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } package jpabook.jpashop.service; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(readOnly = true) public class MemberService { @Autowired private MemberRepository memberRepository; //회원 가입 @Transactional public Long join(Member member){ validateDuplicateMember(member); memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member) { //EXCEPTION List<Member> findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()){ throw new IllegalStateException("이미 존재하는 회원입니다."); } } //회원 전체 조회 public List<Member> findMembers() { return memberRepository.findAll(); } public Member findOne(Long memberId){ return memberRepository.findOne(memberId); } } 아 수정해서 올렸습니다! /Users/changha/Documents/Infrun/jpashop/src/main/java/jpabook/jpashop/service/MemberService.java:24: error: cannot find symbol return member.getId(); ^ symbol: method getId() location: variable member of type Member
"/api/v2/simple-orders " 이 url로 호출했을 때, (1) order테이블에서 가져오는 쿼리 1번 => (2개의 데이터) (2) member 쿼리 1번 * 2 (3) delivery 쿼리 1번 * 2 해서 총 5번이 나오는 걸로 알고 있습니다. 근데 현재 로그에서 총 쿼리가 7번이 나가고 있습니다. 코드를 따라쳐보면서 했는데도 왜 다르게 나가는지 원인을 짐작하기가 힘듭니다. 현재 제 쿼리는 (1) order 테이블에서 가져오는 쿼리 1번 (2) member 쿼리 1번 (3) delivery 쿼리 1번 (4) delivery id 조건절로 order 찾는 쿼리 1번 (2)~(4)번 한 번 더 반복 이렇게 해서 총 7번 쿼리가 나가게 됩니다. 쿼리만 보고 어떤 부분때문에 더 나가게 됐는지 짐작할 수 있을까요? 엔티티 간의 연관관계 매핑은 강의를 보면서 했기 때문에 제가 중간에 놓쳤나 생각이 들기도 하네요ㅜ 원인을 짐작하기가 어렵습니다. select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first ? rows only 2023-03-23T19:03:54.387+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2023-03-23T19:03:54.390+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2023-03-23T19:03:54.393+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 2023-03-23T19:03:54.395+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2023-03-23T19:03:54.396+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2023-03-23T19:03:54.397+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=?
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 프로젝트를 새로 만들어도 html 파일이 절대 연결이 되지 않네요..
안녕하세요! 좋은 강의 제공해주셔서 감사합니다. 다름이 아니라, 수업에서 JWT 토큰 유효성 로직을 api gateway service에 구현했는데, user-service가 아닌 gateway service에 구현한 이유가 있을까요? api gateway에 토큰 유효성 로직을 구현하게 되면, 만료된 토큰으로 api gateway를 거치지 않고 바로 user-service에 요청하는 경우, 토큰 유효성 검사를 하지 않아서 문제가 발생할 수 있지 않나요?
강사님 강의를 보고 최근에 프로젝트를 하다 궁금한게 생겨 질문 남기게 되었습니다. Product <-> Category Entity 다대다 매핑을 위해 product(OneToMany) <-> product_category(ManyToOne) <-> category(OneToMany) 위와 같은 테이블로 매핑한 상태이고 join 상속 전략으로 district_category 테이블도 생성 하였습니다. district_category를 쿼리 파라미터로 받고 해당 district_category를 갖고 있는 상품들을 검색하고 페이징을 하는 로직을 짠다고 했을때 두가지 방법이 생각났는데 둘 중 어느게 더 적합한지 모르겠습니다 검색어를 바탕으로 product_category에서 Product를 EntityGraph로 같이 찾은 후에 찾은 ProductCategory.getproduct() 와 같은 방식 SearchService Category category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return new ProductCategoryToProductPage(productCategoryRepository.findAllByCategory(pageable, category)); ProductCategoryRepository @EntityGraph(attributePaths = "product") Page<ProductCategory> findAllByCategory(Pageable pageable, Category category); ProductCategoryToProduct public ProductCategoryToProductPage(Page<ProductCategory> page) { this.content.addAll(page.getContent().stream() .map(ProductCategory::getProduct) .map(ProductListGetResponseDTO::new) .collect(toList())); this.totalPages = page.getTotalPages(); this.totalElements = page.getTotalElements(); this.pageNumber = page.getNumber() + 1; this.size = page.getSize(); } 발생 쿼리문 select districtca0_.category_id as category2_1_, districtca0_1_.parent_id as parent_i3_1_, districtca0_.district_enum as district1_2_ from district_category districtca0_ inner join category districtca0_1_ on districtca0_.category_id=districtca0_1_.category_id where districtca0_.district_enum=? select productcat0_.product_category_id as product_1_8_0_, product1_.product_id as product_1_7_1_, productcat0_.category_id as category2_8_0_, productcat0_.product_id as product_3_8_0_, product1_.created_date as created_2_7_1_, product1_.content_detail as content_3_7_1_, product1_.product_content as product_4_7_1_, product1_.product_name as product_5_7_1_, product1_.product_price as product_6_7_1_, product1_.product_status as product_7_7_1_, product1_.product_thumbnail as product_8_7_1_ from product_category productcat0_ left outer join product product1_ on productcat0_.product_id=product1_.product_id where productcat0_.category_id=? limit ? select count(productcat0_.product_category_id) as col_0_0_ from product_category productcat0_ where productcat0_.category_id=? 검색어를 바탕으로 product에서 직접 찾기 (데이터 뻥튀기의 문제는 쿼리dsl 이용 productId로 groupBy로 해결) 글 쓰고 생각해보니 A카테고리는 B라는 상품 안에서는 하나밖에 있을 수가 없으니 굳이 groupBy를 안써도 될거 같네요 SearchService Category category = districtCategoryRepository.findByDistrictEnum(districtEnum) .orElseThrow(() -> new ProductException(ProductExceptionType.CATEGORY_NOT_FOUND)); return productRepository.findAllByCategory(pageable, category); ProductRepository @Override public Page<Product> findAllByCategory(Pageable pageable, Category category) { List<Product> content = queryFactory.selectFrom(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .groupBy(product.productId) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); Long total = queryFactory .select(Wildcard.count) .from(product) .join(product.productCategories, productCategory) .where(productCategory.category.categoryId.eq(category.getCategoryId())) .fetchOne(); return new PageImpl<>(content, pageable, total); } 발생 쿼리문 select districtca0_.category_id as category2_1_, districtca0_1_.parent_id as parent_i3_1_, districtca0_.district_enum as district1_2_ from district_category districtca0_ inner join category districtca0_1_ on districtca0_.category_id=districtca0_1_.category_id where districtca0_.district_enum=? select product0_.product_id as product_1_7_, product0_.created_date as created_2_7_, product0_.content_detail as content_3_7_, product0_.product_content as product_4_7_, product0_.product_name as product_5_7_, product0_.product_price as product_6_7_, product0_.product_status as product_7_7_, product0_.product_thumbnail as product_8_7_ from product product0_ inner join product_category productcat1_ on product0_.product_id=productcat1_.product_id where productcat1_.category_id=? group by product0_.product_id limit ? select count(*) as col_0_0_ from product product0_ inner join product_category productcat1_ on product0_.product_id=productcat1_.product_id where productcat1_.category_id=?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요 영한님, 강의 잘 듣고 있습니다! 강의에서 JPA가 생성해준 테이블을 그대로 쓰면 안되고, JPA가 쓴 DDL을 다듬어서 쓴다고 하셨는데 생각해보니 저는 토이프로젝트에서 항상 JPA가 만들어주는 그대로 썼던 것 같습니다. 그렇다면 지금 예제에서는 어떤 점을 보완하는게 필요할까요? 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 좋은 강의 잘 보고 있습니다. 감사합니다 다름이 아니라 선생님 강의 jpa로드맵과 스프링 완전 정복을 완강하고 토이 프로젝트 전에 리마인드 할겸 다시 보고 있는데요~ 지금 선생님께서는 서비스단 클래스 영역에서 트랜잭션을 걸어주고 계시는데 그럼 그 하위에 있는 로직 전체가 같은 커넥션을 사용하고 반환하는데 지금 이 예제에서 그 이점이 있을까요!? 이유가 따로 있으시다면 궁금합니다. 저는 지금 서비스 클래스에서 로직 단위별로 트랜잭션을 걸어주고 있었는데 갑작스럽게 의문점이 생겨 질문드려요!~
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의 자료에서 도메인 모델, 엔티티 설계, 테이블 설계 다이어그램을 어떤 도구를 통해 작성하셨는지 궁금합니다!
일대다 컬렉션 페치조인과 페이징은 기본적으로 양방향을 전제하고, 일 을 기준으로 페이징을 하기 때문에 Batch Size 를 이용하는 것은 이해했습니다. Q. 그렇다면 컬렉션이 생기지 않는 다대일 단방향 매핑 구조에서 일 을 기준으로 페이징하려면 어떻게 해야할지 궁금합니다. 예를 들어 게시글(1) : 댓글 (N) 이고 댓글 -> 게시글 방향으로 다대일 단방향 매핑이라면, 게시글을 기준으로 페이징하고 싶을 때 어떻게 하면 될까요? 항상 영한님과 서포터님들께 감사드립니닷!!🙇♂️