월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! Querydsl
Dto로 조회 관련 질문드립니다!
안녕하세요 팀장님 강의 내용을 토대로 다양하게 혼자 연습해보고 있는데, Dto로 조회하는 과정에서 오류가 계속 발생했는데 어떤식으로 해결해야될지 몰라서 질문 남깁니다.! Member - Team 관계에서 Team을 Dto로 조회하는 과정입니다. 우선 Dto말고 Tuple로 조회했을때는 정상 동작했습니다. 1. Tuple 조회 ( 정상 동작) @BeforeEachpublic void setup() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member4", 10, teamA); Member member2 = new Member("member4", 20, teamA); Member member3 = new Member("member4", 30, teamB); Member member4 = new Member("member4", 40, teamB); Member member5 = new Member("member5", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); em.persist(member5); em.flush(); em.clear();} List<Team> fetch = queryFactory .selectFrom(team) .join(team.members, member).fetchJoin() .fetch();System.out.println("fetch.get(0).getMembers() = " + fetch.get(0).getMembers()); 정상동작 2. Dto 조회 @Datapublic class TeamDto { private String name; private List<MemberDto> members = new ArrayList<>();} @Datapublic class MemberDto { private String username;} List<TeamDto> result = queryFactory .select(Projections.fields(TeamDto.class, team.name.as("name"), Projections.fields(MemberDto.class, member.username ).as("members") ) ) .from(team) .join(team.members, member).fetchJoin() .fetch();System.out.println("dto = " + result.get(0).getMembers()); 실행결과 not compatible with java.util.List이 발생했습니다. ㅠㅠ 이것저것 바꿔가면서 다양하게 시도해봤는데도 계속 오류가 발생했습니다.. 어떤 식으로 변경해야 될까요? 추가로 시도하면서 느낀게 한 개 이상의 Dto가 있을 경우 코드의 가독성이 너무 떨어지게 되더라고요. 혹시 팀장님께서는 여러개의 Dto를 조회할 때 따로 사용하는 방식이 있으신가요?
- 해결됨실전! Querydsl
(해당 영상직접 연관x) 강의 전반 package 구성 질문
삭제된 글입니다
- 미해결실전! Querydsl
Left join 에서 on절에 BooleanExpress 적용 가능할까요?
안녕하세요. QueryDsl에서 left join에서 동적으로 on절을 만들 수 있나요? .selectFrom(lesson).leftJoin(lesson.enrollmentLessons, enrollmentLesson).on(eqTutee(condition)) 위와 같이 사용 시 잘 동작중인데 eqTutee가 null 인 경우 에러가 발생합니다. 물론 동적으로 if를 사용해서 분기를 할 수 있긴 한데 좀 더 쉽게 할 수 있는 방법이 있을까 해서 문의드립니다.
- 해결됨실전! Querydsl
Querydsl 적용시 service와 seeviceImpl
안녕하세요 mybatis환경에서 변경해보고자 배우고 있는 중입니다. 다름이 아니라 예시에서 보여주신 소스를 보면 service나 serviceimpl없이 바로 controller에서 repo를 호출하는 형식으로 되어있는데, 실무에서도 이와 같이 사용하는지 아니면 controller service serviceimpl repo repoimpl 형식으로 쓰는지 궁금합니다. 이른 시간에 질문 올려 죄송합니다
- 해결됨실전! Querydsl
JPAQueryFactory 의존성 질문드립니다..!
안녕하세요~ 강사님~수업시간에 JPAQueryFactory를 @Bean으로 등록하셨는데 이걸 주입받은 객체에서 다른 객체로 넣어줘도 멀티쓰레드 환경에서 문제가 없을까요?? 샘플 코드 public interface FruitBehavior { List<FruitList> getFruitList();} @RequiredArgsConstructorpublic class BananaRepository implements FruitBehavior { private final JPAQueryFactory queryFactory; @Override public List<FruitList> getFruitList() { queryFactory .selectFrom(fruit); }} @RequiredArgsConstructorpublic class TestRepositorySupport { private final JPAQueryFactory queryFactory; private final Map<String, FruitBehavior> map = new HashMap<>(); void doSomething() { map.put("Banana", new BananaRepository(queryFactory)); // 여기!!! }} 대충 이런식으로 ...TestRePositorySupport에서 주입받은 queryFactory를 BananaRepository를 만들때 넣어줘도 문제가 없을까요?실행해봤는데 결과는 잘 출력되는데.. 혹시나 싱글턴이 깨지거나 다른 이슈들이 생기진 않을까 궁금합니다..!!
- 해결됨실전! Querydsl
테스트 오류 질문드립니다!!
안녕하세요 강사님~ RepositoryCustom - RepositoryCustomImpl 구현하고 Repository에서 RepositoryCustom상속하는 커스텀 있잖아요~ 여기서 기존에 @SpringBootTest로 실행되는 통합테스트를 @DataJpaTest로 변경하니까 변경한 모든 테스트가 깨지더라고요.. 빈을 생성하는 과정에서 오류가 나더라고요 ㅜㅜ `Error creating bean with name 'memberRepositoryCustomImpl' defined in files ~ ` `No qualifying bean of type 'com.querydsl.jpa.impl.JPAQueryFactory' available: expected at least 1 bean which qualifies as autowire candidate` 단위 테스트에서는 기본적으로 Repository는 @DataJpaTest로 실행하는 걸로 알고있는데, 이럴 경우 어떤식으로 해결을 해야되는 건가요?
- 해결됨실전! Querydsl
chmod 에러
chmod 755 h2.sh 명령을 실행하면 'chmod'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다 라고 나옵니다. 구글링해보니 windows10에서는 chmod 명령어가 지원되지 않는다는 것 같은데 어떻게 해야 할까요?
- 해결됨실전! Querydsl
쿼리 최적화 질문 (N+1문제)
안녕하세요! 강의 복습을 위해서 토이 프로젝트를 하는 중에 N+1 문제를 어떻게 해결해야 할 지 모르겠어서 질문 드립니다. 먼저, 제가 원하는 출력 결과는 아래와 같습니다. ====== 메뉴 정보 ====== id = 101 메뉴 = 후라이드 가격 = 14000 수량 = 2 ====== 옵션 정보 ====== 옵션 = 눈꽃 치즈볼 4개 가격 = 3500 수량 = 2 옵션 = 치즈볼 4개 가격 = 3000 수량 = 2 ====== 메뉴 정보 ====== id = 22 메뉴 = 후라이드 가격 = 14000 수량 = 1 ====== 옵션 정보 ====== 1. 엔티티 [그림 1]. 엔티티 설계 ※ OrderMenu에서 옵션을 선택하지 않으면 OrderMenu, OrderOption 조인 한 뒤에 OrderOption 조회 시 NullPointerException 발생해서 OrderMenu에 양방향 연관관계 추가 [그림 2]. Join 시 <null> 발생 2. 데이터 [그림 3]. 입력한 데이터 아래와 같은 테스트를 작성했을 때 [그림 4]과 같은 N+1 문제가 발생했습니다. @Testpublic void 주문메뉴_주문옵션조회() throws Exception { Long orderId = 100L; List<OrderMenu> fetch1 = queryFactory .select(orderMenu) .from(orderMenu) .where(orderMenu.order.id.eq(orderId)) .fetch(); for (OrderMenu orderMenu : fetch1) { System.out.println("====== 메뉴 정보 ======"); System.out.println("id = " + orderMenu.getId()); System.out.println("메뉴 = " + orderMenu.getMenu().getName()); System.out.println("가격 = " + orderMenu.getMenu().getPrice()); System.out.println("수량 = " + orderMenu.getQuantity()); List<OrderOption> orderOptionList = orderMenu.getOrderOption(); System.out.println("====== 옵션 정보 ======"); for (OrderOption orderOption : orderOptionList) { System.out.println(" 옵션 = " + orderOption.getOption().getName()); System.out.println(" 가격 = " + orderOption.getOption().getPrice()); System.out.println(" 수량 = " + orderOption.getQuantity()); } }} [그림 4] N + 1 문제 발생 위 문제를 해결하기 위해서 fetch join을 사용해서 OrderMenu와 OrderOption을 한 번에 불러왔지만 OrderMenu의 Menu, OrderOption의 Option은 여전히 Lazy loading이 되었습니다. @Testpublic void 주문메뉴_주문옵션조회() throws Exception { Long orderId = 100L; List<OrderMenu> fetch = queryFactory .selectFrom(orderMenu) .distinct() .leftJoin(orderMenu.orderOption, orderOption).fetchJoin() .where(orderMenu.order.id.eq(orderId)) .fetch(); for (OrderMenu orderMenu : fetch) { System.out.println("====== 메뉴 정보 ======"); System.out.println("id = " + orderMenu.getId()); System.out.println("메뉴 = " + orderMenu.getMenu().getName()); System.out.println("가격 = " + orderMenu.getMenu().getPrice()); System.out.println("수량 = " + orderMenu.getQuantity()); List<OrderOption> orderOptionList = orderMenu.getOrderOption(); System.out.println("====== 옵션 정보 ======"); for (OrderOption orderOption : orderOptionList) { System.out.println(" 옵션 = " + orderOption.getOption().getName()); System.out.println(" 가격 = " + orderOption.getOption().getPrice()); System.out.println(" 수량 = " + orderOption.getQuantity()); } }} 출력 내용 select distinct ordermenu0_.order_menu_id as order_me1_7_0_, orderoptio1_.order_option_id as order_op1_8_1_, ordermenu0_.menu_id as menu_id3_7_0_, ordermenu0_.order_id as order_id4_7_0_, ordermenu0_.quantity as quantity2_7_0_, orderoptio1_.option_id as option_i3_8_1_, orderoptio1_.order_menu_id as order_me4_8_1_, orderoptio1_.quantity as quantity2_8_1_, orderoptio1_.order_menu_id as order_me4_8_0__, orderoptio1_.order_option_id as order_op1_8_0__ from order_menu ordermenu0_ left outer join order_option orderoptio1_ on ordermenu0_.order_menu_id=orderoptio1_.order_menu_id where ordermenu0_.order_id=? ====== 메뉴 정보 ====== id = 101 2021-01-27 15:12:12.595 DEBUG 35340 --- [ main] org.hibernate.SQL : select menu0_.menu_id as menu_id1_3_0_, menu0_.created_date as created_2_3_0_, menu0_.last_modified_date as last_mod3_3_0_, menu0_.menu_category_id as menu_cat8_3_0_, menu0_.name as name4_3_0_, menu0_.price as price5_3_0_, menu0_.image_url as image_ur6_3_0_, menu0_.share_url as share_ur7_3_0_, menucatego1_.menu_category_id as menu_cat1_4_1_, menucatego1_.name as name2_4_1_, menucatego1_.restaurant_id as restaura3_4_1_ from menu menu0_ left outer join menu_category menucatego1_ on menu0_.menu_category_id=menucatego1_.menu_category_id where menu0_.menu_id=? 메뉴 = 후라이드 가격 = 14000 수량 = 2 ====== 옵션 정보 ====== 2021-01-27 15:12:12.604 DEBUG 35340 --- [ main] org.hibernate.SQL : select option0_.option_id as option_i1_6_0_, option0_.name as name2_6_0_, option0_.option_category_id as option_c4_6_0_, option0_.price as price3_6_0_ from options option0_ where option0_.option_id=? 옵션 = 눈꽃 치즈볼 4개 가격 = 3500 수량 = 2 2021-01-27 15:12:12.609 DEBUG 35340 --- [ main] org.hibernate.SQL : select option0_.option_id as option_i1_6_0_, option0_.name as name2_6_0_, option0_.option_category_id as option_c4_6_0_, option0_.price as price3_6_0_ from options option0_ where option0_.option_id=? 옵션 = 치즈볼 4개 가격 = 3000 수량 = 2 ====== 메뉴 정보 ====== id = 22 메뉴 = 후라이드 가격 = 14000 수량 = 1 ====== 옵션 정보 ====== OrderMenu와 OrderOption을 조회할 때, 연관된 Menu와 Option을 한 번에 조회하는 방법이 있을까요? 아니면 엔티티 설계를 변경해야 할까요?
- 미해결실전! Querydsl
Slice 질문 있습니다.
안녕하세요, 만약 Page대신 Slice를 사용하려고 하면 리미트에 +1 만큼하고 쿼리를 날리고, 다음페이지가 있는지 확인해야하는데, 이 부분은 아래 코드처럼 개발하는 사람이 직접 처리해주어야 하는건가요? List<MemberTeamDto> content = queryFactory .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where( usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageBetween(condition.getAgeLoe(), condition.getAgeGoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize() + 1) .fetch();if (content.size() == pageable.getPageSize() + 1) { SliceImpl slice = new SliceImpl<>(content.subList(0, pageable.getPageSize()), pageable, true);} else { SliceImpl slice = new SliceImpl<>(content, pageable, false);} 그리고, 카운트 쿼리를 따로 날리는 Complex인 경우현재 Member와 Team이 다대일 이니깐 아래처럼leftJoin(member.team, team) 이부분 지워도 count는 똑같이 나오는게 맞죠?? queryFactory .selectFrom(member) .where( username(condition.getUsername()), teamName(condition.getTeamName()), ageBetween(condition.getAgeLoe(), condition.getAgeGoe()));
- 미해결실전! Querydsl
동적쿼리 BooleanBuilder 질문
안녕하세요 강사님, 강의 잘 보고 있습니다. 해당 강의 다른영상에서의 질문에서 BooleanBuilder와 자바 8을 이용해서 체이닝이 가능한 코드를 봣었습니다. 영상강의처럼 BooleanExpression을 사용한 ageBetween은 null이 반환될 수 있어서 테스트시 age를 안 넣으면 NPE가 뜨더라구요. 그래서 아래처럼 BooleanBuilder 사용한 코드로 바꾸면 null에 무조건 안전하게 되는게 맞는건가요? public List<MemberTeamDto> search(MemberSearchCondition condition) { return queryFactory .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.as("teamName"))) .from(member) .leftJoin(member.team, team) .where( usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageBetween(condition.getAgeLoe(), condition.getAgeGoe())) .fetch();}private BooleanBuilder usernameEq(String username) { return nullSafeBuilder(() -> member.username.eq(username));}private BooleanBuilder teamNameEq(String teamName) { return nullSafeBuilder(() -> team.name.eq(teamName));}private BooleanBuilder ageGoe(Integer ageGoe) { return nullSafeBuilder(() -> member.age.goe(ageGoe));}private BooleanBuilder ageLoe(Integer ageLoe) { return nullSafeBuilder(() -> member.age.loe(ageLoe));}private BooleanBuilder nullSafeBuilder(Supplier<BooleanExpression> f) { try { return new BooleanBuilder(f.get()); } catch (Exception e) { return new BooleanBuilder(); }}private BooleanBuilder ageBetween(Integer ageLoe, Integer ageGoe) { return ageLoe(ageLoe).and(ageGoe(ageGoe));} 익셉션마다 BooleanBuilder 객체를 새로 만드는데, 객체를 생성할 때 드는 비용은 null을 위해서는 크게 상관이 없는거죠? 그리고, ageBetween 부분에서 강의는 파라미터를 int 타입으로 받는데, 테스트시 NPE가 나와서 Integer로 바꾸니 되더라구요. 이유가 원래 Integer타입을 int로 자동 언박싱하는 중에 null을 int에 넣지 못해서 NPE가 뜨는건가요?
- 미해결실전! Querydsl
INSERT에 대한 부분을 개발하려고 합니다.
강의 내용을 훑어봤는데 INSERT에 대한 내용이 없는 것 같아 질문 남깁니다. INSERT의 경우에 RepositoryImpl클래스 내부에 만드는 것이 나은지 아니면 Spring JPA 를 통해서 서비스 클래스 내부에서 entity클래스를 만들어 save를 하는게 나은지 궁금합니다.
- 해결됨실전! Querydsl
BooleanBuilder 관련 질문이 있습니다..!
안녕하세요 강사님~ 질문 답변글들 정독하다가 강사님이 답변달아주신 답변에 대해서 궁금한게 생겨서 질문 남겨봅니다..! 해당 게시글에 질문 내용 답글 달아놨는데 혹시 확인 가능하실까요??! 감사합니다..! https://www.inflearn.com/questions/94056
- 미해결실전! Querydsl
tuple 출력에 대해서 질문드립니다.
해당 코드로 테스트 결과를 돌렸을 때 출력문이 다음과 같이 나옵니다. 테스트 결과는 동일한 것 같은데 선생님의 출력처럼 나오게 하려면 어떻게 해야되는 건지 궁금합니다.
- 미해결실전! Querydsl
jpa에서 Inline View를 포함한 구문은 지원하지 않는다고하셧는데요 이 말이 의미하는게 정확히 무엇인가요?
Inline View를 포함한 구문은 지원하지 않는 다고 하셨습니다. 이말은 다음과 같은 결론을 도출 할 수 있는건가요? 'Inline View 를 포함한 sql문의 결과와 동일한 결과를 영속성 컨텍스트에서 가져올 수 없다' 즉, 부득이하게 native query를 사용한다면 이는 영속성 컨텍스트의 장점 중에 하나인 1차 캐시에서 빠르게 가져오는 효과를 볼 수 없다. 저는 이렇게 이해 하였습니다. 그런데 인터넷에서 검색을 해보니 어떤 블로그에 다음과 같은 문장이 있었습니다. 그렇다면 JPA가 지원하는 네이티브 SQL과 JDBC API를 직접 사용하는 것에는 어떤 차이가 있냐? 그것은 바로 네이트브 쿼리는 엔티티를 조회할 수 있고 JPA가 지원하는 영속성 컨텍스트의 기능을 그대로 사용할 수 있다는 것이다! 정확히 블로그 내용이 맞는거지는 모르겠습니다만 위 블로그 내용이 맞다면 왜 Inline View를 포함한 구문을 지원하지 않는건가요? 너무 헷갈리고 어떤것이 정답인지 궁금합니다 도와주세요 김영한 선생님..
- 해결됨실전! Querydsl
개인 프로젝트 시작을 어떻게 하면 좋을까요?
안녕하세요! 스프링 부트와 JPA 실무 완전 정복 로드맵 강의를 완강한 학생입니다. 배운 내용을 바탕으로 토이 프로젝트를 시작하려고 하는데, 개발 경험이 없어서 어떻게 시작해야 할 지 감이 안잡히네요 ㅠㅠ 조언을 구하고 싶어서 질문을 드립니다... 프로젝트 목적은 취업 포트폴리오로 활용하는 것입니다. 1. 클론 코딩 vs 직접 만들기 1) 클론코딩을 하면 어떻게 설계하고 어떤 것들을 구현해야 할 지 쉽게 파악할 수 있을 것 같아서 좋은 것 같은데, 한편으로는 이미 누군가가 구현한 것을 따라한 수준 밖에 안될 것 같아서 취업 포트폴리오로 활용할 수 있을까 걱정이 되네요... 2) 반면에 직접 만들어보면 학습, 설계 ,구현 등 모든 것을 "스스로" 했다는 것을 어필할 수 있을 것 같지만, 퀄리티가 많이 떨어질 것 같아서 고민입니다 2. 프론트 부분 처리 (API vs thymeleaf로 화면 출력) 1) API로 구현하면 아무래도 화면 처리에 대한 부담이 줄어들어서 백엔드 구현에 더 집중할 수 있을 것 같습니다. 하지만 취업 포트폴리오 목적으로 하는 것이니 만큼 화면까지 엮어서 구현을 해야 좀 더 있어보일 것 같은데, API만 구현하면 좀 부족해보이지 않을까 하는 걱정이 됩니다. 2) thymeleaf를 이용해서 html, css까지 엮어서 화면 출력을 하면 API와는 반대로 좀 더 있어보이는 포트폴리오를 만들 수 있겠지만, 백엔드 부분의 완성도가 떨어지지 않을까 하는 걱정이 됩니다. 아니면 html 무료 템플릿에 thymeleaf만 적용해서 만들어도 괜찮을까요? 물론 정해진 답은 없겠지만, 각각의 선택지에 대해서 어떠한 장단점이 있는지, 어떠한 점들을 고려해야 하는지 알고 싶습니다. 개발 경험이 없어서 무엇을 여쭤봐야 할 지도 모르겠네요 ㅎㅎ.. 강의를 들으면서 정말 많은 것들을 배웠습니다! 항상 친절하고 자세한 설명 감사합니다^^
- 미해결실전! Querydsl
좋은강의감사합니다 ! 질문이있습니다.
querydsl의 벌크성쿼리는 스프링데이터에서의 @Modifying(clearAutomatically = true) 와 같은 기능은 없는것인가요?
- 미해결실전! Querydsl
계산성 결과물을 DB에 저장하는 것에 대해서 어떤 방법이 더 효율적인가요
안녕하세요, 강의 잘 보고있습니다. 평소에 가지고 있던 궁금증인데 age를 업데이트하는 부분을 보고 문득 떠올라 질문남깁니다. 기존 레거시 테이블들을 보면 이미 레코드에 포함하고 있는 계산성 데이터들을 많이 저장하고 있는 테이블들을 많이 보았습니다. 해당 강의 차수에서 말하는 age나 또는 팀-멤버간(fk) 조인되어 있는 테이블에서 팀 테이블의 전체 회원 수 같은 칼럼들이요. 저는 기본적으로 이런 데이터들을 테이블에 넣는것을 반대하고있습니다. 나이를 넣는 것 보다 생년월일을 넣어야되고 팀의 전체 회원수가 필요하면 필요 시 쿼리에서 count를 하거나 애플리케이션에서 항상 동적으로 구하는 방식을요. 제 경험상으로 이러한 계산성 데이터를 넣어버리면 변경점이 계속 생기는 것 같습니다. 예를들어 1년이 지날 경우 벌크로 나이를 +1씩 더해야 되는 상황들이요. 또한 팀 멤버가 추가될경우 실수로 팀 테이블의 총원 테이블을 업데이트 하지 않는 경우도 생길수도 있을 것 같습니다. 하지만 단점으로는 데이터 용량을 많이 조회할 경우에 계산을 해야하는 시간등도 있을 것 같습니다. 대용량 서비스 관점에서 위 의견에 대해 어떻게 생각하시는지, 어떤 방법을 선호하시는지, 제가 놓친 부분은 없는지 궁금합니다. 감사합니다.
- 미해결실전! Querydsl
선생님 searchTest 돌리는데 에러 질문 있습니다
선생님께서 하신 코드 그대로 해봤는데요, 다음과 같은 에러가 발생했습니다. 제가 볼때는 큰 문제는 없어보이는데 다른 엘레멘트가 기대되지 않았다고 뜨는 이 부분을 어떻게 해결해야 될지 모르겠습니다 ㅠㅠ 선생님의 가르침이 필요합니다.
- 미해결실전! Querydsl
인텔리제이 2019년 버젼 사용하시는 분들 중에 getId 인식이 안되는 분들
getId 인식이 안되고 추후에 진행하는 강의에서도 getMember가 인식이 안되는 같은 오류가 발생하는 문제가 발생하여 invalid cache /restart & rebuild 해도 안되서 2020.02년 버젼을 사용해봤더니 잘 되는 현상이 발생했습니다. 윈도우 컴퓨터 3대를 가지고 실험한거라 2019년 버전은 get 메소드를 직접 넣어줘야 인식이 되는 장애가 발생했습니다. 이를 김영한 선생님에게 여쭤보니 버젼문제가 있다고 판별이 났습니다. 선생님이 말씀하시기를, jpa 최신 버젼 업데이트가 안되서 발생된것 같으니 아무래도 이번 querydsl 강의를 들을 때는 최신버젼의 인텔리제이 버젼을 설치해야 할 수 있을 것 같다고 하셨습니다 안되시는 분들은 이를 참고하셔서 인텔리제이 최신버젼으로 업데이트 하셔야 될 것 같습니다
- 미해결실전! Querydsl
mysql 하시는 분들은 function 설정(질문 아님)
function('regexp_replace' ~~~ 라고 적어주셔야 되고 application.yml 파일에서 dialect : org.hibernate.dialect.MySQL8Dialect 라고 적어주셔야 합니다