월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! Querydsl
DTO 사용 범위에 대한 질문
강의에서 일반적으로 repository에서 만든 dto를 service와 controller에서 사용한다고 하셨습니다. 그런데 이전 강의에서 tuple은 repository계층에서만 사용하고 service나 controller에서 사용하는건 비추한다고 하셨습니다. tuple의 경우엔 하부 구현기술에 class이니 앞단에서 알면 좋지 않다.(jpa를 바꾸게 되는 경우 수정할 로직이 많아진다) 라고 이해했는데요. dto도 비슷하지 않을까 생각이 들었습니다. repository에서 만든 dto를 바꾸게 될 경우 앞단에서 수정할 로직이 많으니까요. dto와 tuple(resultset 등)은 다르게 보아야 하는걸까요? repository에서 만든 dto는 repository나 service에서까지만 사용하고 controller에서는 새로운 dto로 매핑하는게 맞을까요? 아니면 repository는 뒷단(안쪽) 영역이니 앞쪽에서 의존성을 가져가도 된다고 생각하는게 맞을까요?
- 미해결실전! Querydsl
BooleanBuilder, dto 변환, fetchCount() 질문 있습니다
강의 너무 감사합니다~ 다 듣고 여러가지 시도해보니 3가지 의문점이 있어서 질문드립니다! 1. where에 BooleanBuilder 사용보다는 BooleanExpression을 사용하는게 좀 더 좋다는 강의를 들었습니다. https://www.inflearn.com/questions/94056 그런데 위 링크를 보면 강의에서 where(builder)를 쓰시는 것과 달리 BooleanBuilder를 강의에서 소개해주신 BooleanExpression 방법처럼 체인해서 사용하고 계십니다. BooleanBuilder를 사용하면 BooleanExpression과 달리 where절에 전체 null일 경우 예외가 터지는 경우도 해결할 수 있는 것으로 보이는데 링크에서 사용하신 방법을 쓰는게 바람직할까요? 2. domain을 dto로 변환하는 과정에서 domain에 있지 않은 좋아요 갯수, 좋아요 여부 등의 추가 변수들을 어디에서 처리하면 좋을까요? java service쪽에 가져와서 해결하는게 좋을까요, 아니면 repository에서 querydsl로 조회하고 모두 가공한 뒤에 그 결과를 service쪽에 가져오는게 나을까요? 엔티티 편의 메서드를 사용하면 원하는 결과를 바로 dto로 조회하지 못하므로 domain을 불러와서 변경 작업 후 dto로 또다시 변경해줘야한다고 생각이 들어서 깔끔하게 처리하는 방법이 있나 궁금합니다 3. 카운트 쿼리를 날릴 때 성능을 위해서 fetchResults()대신에 fetch()와 fetchCount()를 따로 날리면 좋다고 배웠습니다. 개인적으로 이 경우 그냥 fetch()로 받아온 List를 .size()로 count를 가져오는게 편하다고생각되는데 따로 fetchCount()로 조회하는 이유가 있을까요?
- 미해결실전! Querydsl
벌크연산 후 em.flush(), em.clear()에 동시성 이슈는 없나요?
안녕하세요 영한님. 강의 정말 잘 듣고 있습니다. 감사합니다. 궁금한것이 생겨 다른 질문들도 확인해 보았는데 궁금증이 해소되지 않아 질문드립니다. ㅜ 질문 내용은- 벌크연산의 JPQL 쿼리 직후(em.flush() 실행 전),- 다른 쓰레드에 의해 영속성 컨텍스에서 엔티티 수정이 이루어지면, - em.flush()에 의해 DB가 영속성 컨텍스 내용으로 덮어씌워져 벌크연산 결과가 사라질 수 있지 않은지? 입니다. 그리고 문제가 있다면 어떻게 해결해야 하는지 알고싶습니다. 예시) 시간순서로 나열했습니다. member1의 age는 20이라고 가정하겠습니다. Thread1 Thread2 member1 조회 (영속상태가 됨) QueryDSL로 벌크연산 (DB 수정, age 를 2배로 변경) (JPQL로 인한 flush가 실행되나 아직까지 DB와 영속성 컨텍스트 차이 없음) member1 수정 (age에 1 추가) (dirtycheck 체크됨) em.flush(), em.clear() (여기서 문제발생?) em.flush()가 실행되는 시점에 member1이 수정되어 있으니 영속성 컨텍스트에 있는 member1의 age값 21이 DB에 있는 age값 40을 덮어쓰지 않나요? 만약 이런 문제가 발생한다면 이를 막기위해 어떻게 해야 하나요?
- 미해결실전! Querydsl
QueryDsl 바인드 변수 질문있습니다.
안녕하세요. 좋은 강의 내주셔서 감사합니다. 다름이 아니라 사용자가 전달한 DTO 프로퍼티가 아니라 실행되는 SQL내에서 항상 고정 값으로 사용되는 where 절 조건이 있을 경우 최적화를 위해 해당 값을 Parameter 바인딩 형식이 아니라 Literal 값으로 SQL 구문에 포함 시키고 싶습니다. 혹시 입력 값을 Literal로 포함시킬 수 있는 방법에 대해서 여쭙고 싶습니다.
- 미해결실전! Querydsl
DTO변환 Projections.bean 관련 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. JPA를 넘어 QueryDsl까지 잘 보고 배우고 있습니다. QueryDsl을 사용한 DTO변환 1단계인 Projections.bean 을 사용중에 강의에서는 DTO 클래스의 Getter와 Setter를 이용하여 변환을 한다고 하셨었습니다. 영상에서는 getter와 setter가 포함되어있는 @Data 어노테이션을 사용하였었습니다. 그런데, 여러가지 실험 차원에서 @Data를 빼고도 잘 작동이 되어 그 이유가 궁금합니다 @NoArgsConstructorpublic class MemberDto { private String username; private int age; public MemberDto(String username, int age) { this.username = username; this.age = age; }} /** * DTO 조회하기 방법 1. QueryDsl : 프로퍼티 접근 * DTO에 GETTER, SETTER가 존재해야함. */@Testpublic void findDtoBySetter() { List<MemberDto> result = queryFactory .select(Projections.bean(MemberDto.class, member.username, member.age)) .from(member) .fetch(); for (MemberDto memberDto : result) { System.out.println("memberDto = " + memberDto); }}결과-> /* select member1.username, member1.age from Member member1 */ select member0_.username as col_0_0_, member0_.age as col_1_0_ from member member0_ memberDto = study.querydsl.dto.MemberDto@35329a05 memberDto = study.querydsl.dto.MemberDto@36c783ca memberDto = study.querydsl.dto.MemberDto@17136390 memberDto = study.querydsl.dto.MemberDto@273293c8
- 미해결실전! Querydsl
null처리 관련 질문드립니다.
안녕하세요. 항상 좋은 강의 제공해주셔서 진심으로 감사의 말씀 드립니다. 강사님께서 약 8분 17초경에 이런 경우에는 null처리를 따로 해주어야한다고 말씀하셨는데 '이런 경우'라고함은 어떤 상황을 말씀하시는건가요..?조금 찾아보니(allEq를 만들 때) usernameEq(username)이 null이라면 체이닝이 되지 않는 상황이 생기는 것을 확인하였습니다. 이 경우를 말씀하시는 것인가요? 이것 외에도 이런 상황에서 null과 관련하여 발생할 수 있는 상황들을 말씀해주시면 학습하는데 많은 도움을 받을 수 있을 것 같습니다. 감사합니다 :)
- 미해결실전! Querydsl
안녕하세요 DTO반환 관련 질문있습니다.
안녕하세요 영한님 강의 재밋게 잘보고 있습니다. 다름이 아니라 회사에서 QueryDSL 처음 도입을 하려고했는데 멀티?프로젝트로 현재 구성이 되어있습니다. 예를들면 Porjects projcet1 projcet2 projcet1Common 이런식으로 되어있고 projcet1 / projcet2 는 projcetCommon을 참조하는 구조입니다. 모든 Entity는 projcetCommon를 참조하고 있습니다. 근데 여기서 질문드리고 싶은것은 projcetCommon에는 공통으로 사용하는 util이나 Entity만 있고 각각 project마다 DTO는 다르게 사용을 합니다. 이유는 Entity는 자주 변화가 없지만 DTO는 자주 변할 가능성이 있기때문에 각각사용을 합니다. 제가 queryDSL로 서브쿼리를 사용하여 alias를 줘서 보내는 컬럼이 있는데 그거에 맞는 DTO는 project1 에 있다보니 Entity에 @Transient를 주어서 Entity반환을 해서 사용합니다.... Common에 DTO를 만드는것 말고는 다른 방법이 없을까요..?
- 미해결실전! Querydsl
안녕하세요 궁금한 것이 있어서 질문 남깁니다
안녕하세요 프로젝트를 하다보니 궁금한게 생겼습니다. 파일과 패키지 위치에 관한 것입니다 querydsl로 작성된 repository 는 domain layer인지 아니면 persistence layer 인가에 대한 궁금증입니다. 제 생각엔 jpa repository는 인터페이스이므로 도메인이라 볼 수 있을 것 같은데 querydsl 로 직접 작성된 쿼리가 있는 querydsl repository는 애매한 것 같습니다 (jpa repository 가 상속받지 않게 만들었습니다) web-domain-persistence 의 계층이라고 본다면 쿼리가 직접 작성되어 있으니 persistence layer가 맞을 것 같습니다. 그렇다고 굳이 인터페이스와 구현으로 나눠서 인터페이스는 도메인, 구현부는 persistence layer 로 가는게 맞나 싶기도 합니다. https://jojoldu.tistory.com/372이 블로그를 참고해봤는데 그냥 두 개 다 도메인에 두시기도 하시네요 영한님의 의견이 궁금합니다!
- 미해결실전! Querydsl
queryDSL 다중DB에 대해서 질문드립니다.
안녕하세요 선생님의 querydsl 강의를 수강하고 현업에서 적용을 하고 있는 개발자입니다. 위의 sql은 2개의 다른DB의 테이블을 조인하는 쿼리문인데요. fenoteDB.st_send는 fenoteDB의 st_send 테이블이고fe_order는 femarketDB의 fe_order 테이블입니다. 이를 queryDSL로 바꾸는 작업을 하고 있는데 구글링을 많이 해봤지만 2개의 DB의 경우 서로다른 엔티티를 사용하는 경우에 대한 자료만 나오고 따라서 위의 사진과 같은 쿼리를 querydsl로 바꾸는 자료가 나오질 않는데요. 계속 방법을 찾다 결국 영한 선생님께 도움을 청하게 되었습니다..혹시 이와 관련된 자료가 있으면 부탁드려도 될까요? 아니면 아예 방법이 없는 건지 알고 싶습니다!
- 미해결실전! Querydsl
BeforeEach에서 데이터를 제공할때 캐시를 비우지 않아도 될까요?
BeforeEach 어노테이션된 메소드를 이용해서 데이터를 제공할때 em.flush(); em.clear()를 수행해서 DB동기화를 하고 최종적으로 컨텍스트를 비워주는 작업이 필요치 않는지요? Test가 수행될때, 1차 캐시에 의존하게 되면 부정확하게 맺어진 양방향 연관관계 등이 있을때, 이를 테스트로 발견하기 어렵게 되지 않을까 라는 생각이 들었습니다.
- 미해결실전! Querydsl
sql 로그 질문
영한님 안녕하세요. 오늘 2번째 질문이네요..핫.. 다름이 아니라 제 sql 쿼리가 줄 바꿈 없이 쭉 한줄로 출력됩니다. 학습하기에 너무 불편해서 바꾸고 싶은데 구글링을 해봐도 관련 사항이 보이지 않아서 여기에 질문하게 되었습니다. 혹시 쿼리문을 보기 쉽도록 바꾸려면 어떤 설정을 추가해야할까요?
- 미해결실전! Querydsl
Member의 pk질문
영한님 안녕하세요. 먼저 항상 좋은 강의를 제공해주시는 점 깊은 감사의 말씀 드립니다.사실 질문이 querydsl보다는 다른 것과 관계된 질문일 수 있을 것 같습니다. 현재 코드에서 member가 1~4까지 만들어졌는데 왜 db의 pk는 3~6이 되는 것인가요? 제 생각대로라면 당연히 pk가 1부터 4가 되어야할 것 같습니다.
- 미해결실전! Querydsl
group by 시, count 하는 방법 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. group by 할때 전체의 raw count 를 찾고싶은데요 그래서 제가 작업한거의 샘플입니다.. List<Long> fetch = queryFactory.select( A.sId ) .from(A) .leftJoin(b).on(b.id.eq(A.bId), b.deleteDate.isNull()) .leftJoin(s).on(s.id.eq(A.sId), s.deleteDate.isNull()) .where( likeBTitle(where.getBT()), eqSN(where.getSN()), eqBI(where.getBI()), eqId(where.getSI()), goeSDate(where.getSD()), loeEDate(where.getED()) ) .groupBy(date, A.sId, A.bId) .fetch(); return fetch.size(); 이게 제가 생각하는 한계인데 혹시 이것보다 더 좋은 방법이 있을까요ㅠㅠㅠ 위에 제가 작업해 놓은거는 데이터 양이 많아지면 서버에 무리가 갈것같아서.. 많이 구글링을 해보았는데요 잘 모르겠습니다ㅠㅠ
- 미해결실전! Querydsl
Spring Data JPA 날짜 비교
Spring Data JPA 날짜 비교 문의드립니다. List<BbsContents> all = bbsContentsRepository.findAllByDelYnAndImagePathNotNullAndImagePathNotContainingAndCreatedAtGreaterThan(YnType.N, "thumb", LocalDateTime.of(LocalDate.now().minusMonths(6), LocalTime.of(0,0,0))); 이런 식으로 쿼리를 작성했습니다. reg_dtm 은 LocalDateTime 입니다. @Column(name = "REG_DTM")private LocalDateTime createdAt; 실제 쿼리는 아래와 같이 생성되는데요. 제가 원하는 것은 reg_dtm>'2021-08-03 00:00:00.000' 인데, 아래와 같이 쿼리가 생성되어 원하는 결과가 나오지 않습니다. 혹시 원인이나 해결 방법을 찾을 수 있을까요? where bbscontent0_.del_yn='N' and (bbscontent0_.rep_img_file_path_nm is not null) and (bbscontent0_.rep_img_file_path_nm not like '%thumb%' escape '\') and bbscontent0_.reg_dtm>'08/03/2021 00:00:00.000'
- 미해결실전! Querydsl
fetchResults, fetchCount deprecated
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]fetchResults, fetchCount deprecated 되었는데, 그래도 알려주신대로 써야할지 아님 다른 대안이 있는지 궁금합니다.
- 해결됨실전! Querydsl
JPA, Querdsl 환경에서 팬텀리드는 어떻게 방지하나요?
안녕하세요. 초보개발자 명아주입니다. 새해복많이 받으세요! 이번에 QueryDSL 를 이용한 페이징 기능을 공부하면서 느꼈던 의문점이 있습니다. 일반적인 경우 쿼리가 2번 나가게 되는데, 그 사이에 팬텀리드가 발생한다면 어떻게 막을수 있을지 입니다. 어디서 언뜻 보기로, JPA 가 어플리케이션 레벨에서 Repeatable Read를 보장해준다고 봤었던것 같습니다. 물론 Repeatable Read더라도 phantom Read가 발생하는 걸로 알고 있지만요. 그래서 실무에서 이런 phantom read가 발생하는 걸 겪으신 경험이나 어떻게 해결하셨었는지 궁금합니다! 감사합니다!
- 해결됨실전! Querydsl
QueryProjection 수동으로 만들면 어떨까요?
안녕하세요! 초보개발자 명아주입니다. QueryProejction 사용 시, DTO가 QueryDSL 에 의존적인게 단점이라고 하셨습니다. 그 외에는 컴파일 레벨에서 체크할 수 있다는게 정말 큰 장점인 것 같습니다. 그래서 혹시 의존성을 갖지 않으면서 이걸 사용할 방법이 없을까? 라는 의문으로 한가지 테스트를 해보고 찾은 해결 방법은 CustomQUserDto 를 직접 만들어서 쓰면 어떨까 싶습니다. CustomQUserDto는 레포지토리 계층에서만 쓰고, 반환값은 UserDto로 나가니까 서비스에서는 CustomQUserDto를 몰라도 상관이 없을것 같다고 생각했습니다. package study.querydsl.repository.dto;import com.querydsl.core.types.ConstructorExpression;import com.querydsl.core.types.Expression;import com.querydsl.dto.UserDto;public class CustomQUserDto extends ConstructorExpression<UserDto> { public CustomQUserDto(Expression<String> name, Expression<Integer> age) { super(UserDto.class, new Class<?>[]{String.class, int.class}, name, age); //혹은 심플하게 super(UserDto.class, name, age); 라고 해도 됩니다. }} 샘플코드는 자동생성된 QMemberDto를 참고해서 이렇게 짜봤습니다. serialVersionUID는 어떻게 처리해야될지 몰라서 없앴고 없어도 테스트 상에서는 문제없었습니다. @Testpublic void findUserDtoByManualQueryProjection() throws Exception { //given //when List<UserDto> result = query .select(new CustomQUserDto(member.username, member.age)) .from(member) .fetch(); //then for (UserDto userDto : result) { System.out.println("userDto = " + userDto); }} 위처럼 테스트를 진행해봤을때 정상적으로 동작하는걸 확인했는데요. 혹시 이런식으로 QueryProjectionDto를 수동으로 만들어서 사용하시는 경우가 있으신지 궁금합니다. 감사합니다. 명아주 드림 새해 복많이 받으세요~~~~ p.s 한가지 질문드리고 싶은점이 있는데, 강의들으면서 따라 치는 코드를 깃허브에 올리고 있는데 혹시 문제가 된다면 비공개 레포로 변경하려고 합니다. 답변 주시는 대로 원하시는대로 처리하겠습니다!
- 미해결실전! Querydsl
querydsl 작성과 최적화에 문제가 있습니다! 도와주세요!
해당 유저(to_user)가 팔로우한 유저(from_user)가 작성한 모든 게시글(playlist)을 가져오는 쿼리를 작성하고 싶습니다. 정확히 말씀드리자면 작성은 하고 제대로 가져는 오는데 오답같습니다... public List<Playlist> findFolloweesMakePlaylist(Long userSeq){ return jpaQueryFactory .selectFrom(playlist) .join(userLikes).fetchJoin() .on(playlist.user.userSeq.eq(userLikes.toUser.userSeq)) .where(userLikes.fromUser.userSeq.eq(userSeq)) .fetch();} 제가 작성한 코드는 위와 같습니다. 나의 userId인 userSeq를 받아서 게시글 작성자 ID와 내가 좋아요 한 사람ID가 같은 부분을 on절로 join 하고, 플레이리스트 작성한 사람에게 좋아요를 한 사람이 저인지 where절로 체크하였습니다. 테스트 돌리면 답은 나오지만 team member처럼 직접적으로 이어져있지 않으니 join 과정에서 막대한 곱하기 연산이 나올것 같고 애초에 잘못짠것 같습니다... 도와주세요!
- 해결됨실전! Querydsl
countQuery 질문(질문수정)
countQuery는 count할 때, 쿼리 최적화를 위해서 하는 걸로 알고 있는데 public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) { List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto(member.id.as("memberId"), member.username.as("memberName"), member.age, team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where(member.username.eq(condition.getUsername()), team.name.eq(condition.getTeamName()), member.age.goe(condition.getAgeGoe()), member.age.loe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); JPAQuery<Member> countQuery = queryFactory .selectFrom(member) .leftJoin(member.team, team) .where(member.username.eq(condition.getUsername()), team.name.eq(condition.getTeamName()), member.age.goe(condition.getAgeGoe()), member.age.loe(condition.getAgeLoe())); return PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount()); } 어차피 실행될 List<MemberDto> content = queryFactory.select(..생략.. 에다가 long count = content.size(); 하면 count가 나오지만 위처럼 굳이 countQuery를 짜서 쓰는 건 PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount()); 오직 이 기능 때문인가요 ?
- 미해결실전! Querydsl
안녕하세요 영한님!
안녕하세요 영한님! Fecthjoin에 대해서 하나 여쭤보고 싶습니다! 모델 : @Entity@Table(name = "articles")class Article( @field:Id @field:GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long?, @field:ManyToOne(fetch = FetchType.LAZY) @field:JoinColumn(name = "user_id") val user: User,) : BaseTimeEntity() @Entity@Table(name = "users")class User( @field:Id @field:Column(length = 64, name = "user_id") val userId: String, @field:ManyToOne(fetch = FetchType.LAZY) @field:JoinColumn(name = "profile_image_id") var image: Image? = null) : BaseTimeEntity() @Entity@Table(name = "images")class Image( @field:Id @field:GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null,) 목적 : article을 가져올 때 article의 user와 user의 image까지 한 번에 가져오는 것입니다! 처음엔 아래처럼 유저와 이미지를 단순 Join을 했더니 게시글을 찾아올 수 없었는데 그 이유가 무엇일지 여쭤보고 싶습니다. override fun findByIdWithBoardUserAndUserImage(id: Long): Article? { return queryFactory.selectFrom(article) .where(article.id.eq(id)) .join(article.board, board).fetchJoin() .join(article.user, user).fetchJoin() .join(user.image,image).fetchJoin() .fetchOne()} 개인적으로 고민도 해봤는데 join(article.user, user).fetchJoin() 게시글과 유저를 조인할 때 innerJoin을 하게되고 이로인해 join(user.image,image).fetchJoin() 유저와 이미지를 조인할 때 조인할 유저 대상에 문제가 생기는것아닐까?라는 생각이 들었습니다. 그래서 유저와 이미지를 조인할 때 유저를 기준으로 leftJoin하여 유저를 모두 불러오면 해결할 수 있지않을까 생각하여 아래처럼 사용을 했고 게시글을 찾아올 수 있었습니다. override fun findByIdWithBoardUserAndUserImage(id: Long): Article? { return queryFactory.selectFrom(article) .where(article.id.eq(id)) .join(article.board, board).fetchJoin() .join(article.user, user).fetchJoin() .leftJoin(user.image,image).fetchJoin() .fetchOne()} 그렇지만 문제의 원인과 올바른 해결방법?이 무엇일지 정확한 답을 알고 분명하게 알고가고자 질문을 남깁니다!.