묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
도메인 모델의 화살표는 특별한 의미가 있을까요?
draw.io에서 도메인 모델을 설명해주시는 부분에 대해서 질문드립니다.도표의 다른 선들은 모두 화살표가 없는데, 수강은 회원과 강의 모델로 화살표가 있어서 어떤 의미인지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프로젝트 생성의 실행
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/[질문 내용]여기에 질문 내용을 남겨주세요.질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/ 프로젝트 생성의 13:24의 실행이 되지 않습니다.Cause: class java.util.concurrent.ExecutionException cannot be cast to class java.lang.RuntimeException (java.util.concurrent.ExecutionException and java.lang.RuntimeException are in module java.base of loader 'bootstrap')java.lang.IllegalArgumentException: Could not create problems-report directory '/build/reports/problems'* 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.Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.For more on this, please refer to https://docs.gradle.org/8.13/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.BUILD FAILED in 55ms1 actionable task: 1 executed 두가지의 오류가 뜨는데 어떻게 해결해야할까요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
쓰레드와 서블릿
전에 배웠던 쓰레드 내용과 함께 질문드립니다 사용자로부터 요청이 오면 쓰레드 풀로부터 쓰레드를 할당을 받고이 쓰레드가 HttpServlet 클래스에 있는 public void service를 실행하고그 안에서 수업 시간에 직접 재정의한 protected void service가 실행된다고 이해하면 될까요? 제일 궁금한 점은 Http 요청이 올 때 서블릿 코드를 수행하는 쓰레드가 처음으로 실행하는 메서드가 무엇인지 입니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
JUnit5 테스트시 DB 구동
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]현재 주문 기능 테스트에서 JUnit5를 이용하여 테스트 중입니다. 앞선 강의(회원 기능 테스트)에서 JUnit으로 테스트할때 메모리 DB 사용한다고 application.yml 을 test 쪽에 복사해서 사용할때도 url: jdbc:h2:mem:testdb 부분을 주석해도 돌아간다고 했었던 것으로 기억이 납니다. 그래서 TEST 시에는 DB를 연결 안해도 무방하다고 생각하고 있었는데요.오늘 주문 기능 테스트시 DB 끄고 했더니 에러가 나서 DB 연결했더니 정상적으로 동작합니다. TEST에서도 DB를 연결해주어야 하는 걸까요?
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
헥사고날 아키텍처에서 Specification 패턴과 Strategy 패턴을 함께 사용하는 것이 적절할까요?
안녕하세요, 토비님 강의 정말 잘 보고 있습니다.하나 궁금한 점이 있어서 질문드립니다.헥사고날 아키텍처(Hexagonal Architecture)를 도입할 때, Specification 패턴과 Strategy 패턴을 함께 사용하는 것에 대해 어떻게 생각하시나요?좋은 선택이 될 수 있을지, 아니면 둘 중 하나만 선택해서 사용하는 것이 더 나은 접근일지 고민하고 있습니다.두 패턴을 함께 사용하는 사례나 장단점에 대해 조언해주시면 감사하겠습니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션과 세션 저장소는 같은말인가요?
질문 그대로 두 단어의 뜻이 같은지 궁금합니다.
-
미해결[1.5탄] 옆집 개발자와 같이 진짜 이해하며 만들어보는 첫 Spring Boot 프로젝트
강의자료
안녕하세요! 혹시 강의자료 첨부는 따로 없을까요 ?-?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
인텔리제이 변경 사항 저장
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요현재 맥북 M2 모델로 강의를 따라가고 있는데 인텔리제이에 변경사항을 저장 후 실행 or 테스트를 진행 시 변경 사항이 적용되지 않는 문제점이 계속 발생하고 있습니다.따라서, 변경 사항이 생기고 저장한 후 인텔리제이를 계속 껐다가 다시 켜는 방식으로 하고 있는데 너무 불편해서 해결 방법이 있는지 여쭙고 싶어서 글 남깁니다..!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ModelAndView에 값을 줄 시.
예외 발생 후 ExceptionResolver에서 ModelAndView에 값을 주지 않고 반환시 뷰를 랜더링하지 않고 WAS에 정상 응답으로 돌아가고 WAS에서는 sendError() 이 호출됐었으니 ErrorPage를 찾고 그에 맞는 요청을 하고 BasicErrorController에서 다시 뷰를 랜더링 할텐데요.만약에 ModelAndView에 값을 준다면..ModelAndView가 그 값에 맞는 뷰를 랜더링 하고 화면에 보여준 후 WAS에서 진행한 ErrorPage의 뷰도 보여주는건가요..?그럼 제가 보는 입장에서는 두개의 화면이 렌더링되어 보게되는 걸까요? 더해서 이것이 맞다면, ModelAndView에서 뷰를 랜더링 해서 이미 처리 완료했는데 sendError 때문에 또 다시 ErrorPage를 처리하기 위해 뷰를 랜더링하는 상황이 좀 이상하게 느껴지는데 이게 정상인가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
커리큘럼 방향에 대해서...
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]스프링핵심원리HTTP웹기본지식MVC1편스프링DB 1편수강완료 했고ORM표준JPA프로그래밍 완강 목표로 수강중입니다.혼자 프로젝트를 하나 만들어보고 싶은데JPA활용1편까지는 수강을 하고 시작하는게 좋을까요?아니면 실전 스프링 데이터 JPA를 수강하는게 좋을까요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
비관적 락, 원자적 업데이트
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요? 4강 트랜잭션과 락 트랜잭션과 락 관련 챕터를 수강 중입니다. 쿠폰 동시성 발급 사례를 보여주셨는데, 락이 필요하고, 왜 동시성 문제가 일어나고 어떻게 해결하는지에 대해 이해하고 있습니다. 쿠폰 동시성 발급 사례에서 코드를 보면 단순히 max값을 보고 current값을 증가하는 코드를 이용해 "락이 걸려있지 않아 의도대로 동작하지 않음"을 보여주시는 것 같습니다. 이런 사례 관련해서 많은 사람들이 "낙관적 락", "비관적 락"에 대해 공부하고, "비관적 락으로 해결"로 마무리를 하는 것 같습니다. 근데 저는 비관적 락이 아니라, query를 직접 작성해서 SELECT와 UPDATE를 한번에 사용할 수 있지 않을까 라는 관점에서 "원자적 업데이트"를 사용했습니다. 비관적 락: select + for update -> update 원자적 업데이트: update + where current < n물론 select와 update를 한 번에 해결하는 상황이 아니라, 로직이 중간에 추가되면 비관적 락을 써야된다는 것을 알고 있습니다. 하지만 다른 사람들의 블로그를 보면 하나의 쿼리로 해결할 수 있는 상황을 비관적 락으로 해결하는 게 맞는건가 라는 의문이 들었습니다. 아무튼 이런 배경에서 질문은 아래와 같습니다. 비관적 락이 아니라 원자적 업데이트 라는 말을 이력서에 쓰면 더 도움이 될까요? 실제는 SQL 쿼리 하나 작성한건데, 비관적 락이 더 있어보이는 느낌인 거 같다...?비관적 락으로 해결해야 되는 상황을 만들고 싶은데, select와 update 사이에 어떤 로직을 추가해야할까요? 기획을 변경 가능한 상황입니다!외부 API: 결제말고 다른 거... 문자 알림?다른 테이블 조회 또는 업데이트: SQL join문 잘 짜면 해결되는 거 아닌가...위 내용과 관련해서 작성한 블로그 글입니다.https://velog.io/@suhwani/QRworld-동시성-해결-원자적-업데이트감사합니다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
오타 확인
☠ 질문 가이드 ☠ " 시스템 종결자의 지령이다. 질문하기 전에 이 규칙들을 숙지하도록. " 1. 코드 실행에 문제가 있다고?전체 코드를 보여줘라. 단편적인 에러 메시지만으로는 아무것도 알 수 없다.실행 환경도 알려달라. JDK 버전, 스프링 버전 등을 함께. 2. 오타를 발견했나?즉시 제보하도록. 자네같은 날카로운 눈을 가진 동료가 필요하다.StepExecution stepExecution = contribution.getStepExecution(); ExecutionContext stepExecutionContext = stepExecution.getExecutionContext(); Integer infiltrationCount = (Integer) stepContext.get("infiltrationCount"); JobExecution jobExecution = stepExecution.getJobExecution(); jobExecution.getExecutionContext().put("totalInfiltrations", infiltrationCount);혹시 stepExecutionContext가 stepContext인데 이름이 오타가 난게 맞는지??7강 자료에서 찾은것이다. 3. 질문은 자유롭게"이런 걸 물어봐도 될까요?" 같은 소심한 멘트는 불필요하다. 궁금한 건 바로 물어봐라. 배치 시스템에 소심한 건 없다. 4. 검색은 기본비슷한 질문이 있는지 먼저 확인하도록.하지만 이해가 안 된다면? 주저하지 말고 추가 질문해라.GPT가 거짓말친다고? 나에게로 오라. 💀 5. 서로 존중하라여기는 모두가 시스템을 지배하고자 하는 동료들이다.서로를 이해하고 돕는 문화를 만들어가자. ⛔ 인프런 서비스 자체에 대한 문의는 1:1 문의하기로.💀그쪽 서버는 막강한 CTO가 있어 건드리지 않는 게 좋을 거다 💀- KILL-9 올림 P.S.존댓말로 질문하면 rm -rf를 시전한다. 편하게 물어보도록.강의에서 놓친 부분이나 더 보충하면 좋을 내용도 자유롭게 제보하라. 너희의 피드백이 이 강의를 더 강력하게 만든다. 🔥 시스템을 함께 진화시켜 나가자.🔥
-
미해결Spring AI 실전 가이드: RAG 챗봇 만들기
좋은 강의 퀄러티 감사합니다 질문있습니다 !
2번째 챕터를 하던 와 중 gpt 모델을 mini로 바꾸고pdf 변환을 하려고했으나 여전히 429 에러가 나타는데 해결법이 어떻게 되는지 알 수 있을까요?!(llm 채팅 메세지 전송은 정상적으로 됩니다)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontController 패턴을 사용하는 이유에 대해 제대로 이해했는지 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 원리부터 차근차근 설명해주신 덕분에 스프링 소스 코드도 살펴볼 수 있을 것 같습니다. 감사합니다.다름이 아니라 이 섹션과 다음 섹션을 듣고 나서 학습한 내용을 정리하려고 보니 잘 이해했는지 확실하지 않은 부분이 생겨 질문드립니다.이해한 바는 다음과 같습니다.FrontController 패턴 도입 동기많은 컨트롤러에서 사용하는 공통 처리 로직을 보일러플레이트 없이, 누락 없이 사용하기 위함.궁금한 부분은 다음과 같습니다.이 문제를 언급하신 필터와 인터셉터로도 해결할 수 있을 것 같은데, 왜 FrontController 패턴을 사용하는지 궁금합니다.뒤에 호출되는 컨트롤러의 구조가 HttpServlet으로 제한되지 않기 때문이라고 현재 생각하고 있습니다. 스프링에서 공통 로직을 도입할 때 실제로 DispatcherServlet(FrontController)을 확장하는 방식으로 처리하는지도 궁금합니다.감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 database에 member 테이블이 생성되지 않아요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)네, jpa와 db 설정, 동작 확인 동영상 입니다.2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)아니요. 있는 내용인데 찾아보고 해결하지 못했습니다.3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용]여기에 질문 내용을 남겨주세요.테스트 코드 실행 시 member 테이블이 생성되지 않습니다. ddl 설정은 create이고, 관련 설정 확인해도 못찾아서 문의 드려요.테스크 코드 맨 마지막에 로그를 찍어놨는데, 해당 로그가 찍히고 이 뒤에 테이블이 왜 drop될까요?도저히 모르겠습니다...ㅎ https://drive.google.com/file/d/1WT3dZ7HexApj0xAYZsFJSkKVpaSmGEFM/view?usp=sharing구글 드라이브 프로젝트 첨부 드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터가 처음에도 호출제외 되어야하는것 아닌가요?
필터부분은 DispatcherType으로 구분하기때문에 이해를 한 것 같은데..인터셉터는 잘 이해를 못했습니다.인터셉터에서 excludePathPatterns("/css/**", "/*.ico", "/error", "/error-page/**") 하여 경로를 제외했는데요.그렇다면 첫 요청에서 에러 발생 후 인터셉터 호출은 아예 제외되어야하는 것아닌가요..?그러니까 6:00 경부터 말씀하시는 전체흐름에서WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 -> View가 첫 흐름인데 지금 호출된 로그를 보면 afterCompletion 만 호출된 상황입니다.이것은 요청 완료 이후 서블릿?에서 호출되는 것으로 기억하고 있는데요. 그런데 인터셉터에서 경로를 제외했으니 afterCompletion 역시 호출 자체가 안되어야 하는 것아닌가요? 지금 강의에선 첫 요청에서의 인터셉터는 호출되고 이후 에러 발생후 요청에서의 인터셉터는 제외 경로 설정대로 로그 출력이 되지 않는데요. 에러가 발생하면 addInterceptors() 와 extendHandlerExceptionResolvers() 은 호출이 안되고 afterCompletion 만 호출되는 것으로 기억하는데, excludePathPatterns() 에서 경로를 아예 제외했으니 그냥 자체가 호출 되지 말아야하는것 아닌지 궁금합니다.왜 첫 요청에서의 인터셉터는 호출되고 에러 발생 했을 떄의 인터셉터에서만 호출 되지 않는건가요? DispatcherType 은 필터에서만 적용되는 거라 인터셉터에 적용되는 경우는 아닌 것 같은데 말이죠.. 지금 머릿속으로 제대로 정리가 되지않아 질문 이해가 잘 되셨을지 모르겠습니다. 감사합니다.Dis
-
해결됨토비의 스프링 6 - 이해와 원리
빈에 대한 질문
안녕하세요. 제가 빈에 대해 정리한 문장에 대해 교정 부탁드립니다.빈은 스프링 컨테이너(즉, 스프링)에 의해 관리되는 객체이다.관리라는 것은 객체의 생성부터 의존성 주입 등 기존 프로그래머가 해줘야 했던 작업을 스프링이 해 주는 것이다.즉 스프링 빈은 제어의 역전의 주 대상이다.내가 작성한 클래스의 객체의 제어권을 스프링에게 넘겨주려면, 그 객체를 반환하는 멤버함수를 작성해서 @Bean을 붙여준다. 멤버함수가 소속된 클래스에는 @Configuration을 붙여서, 이 클래스의 멤버함수는 빈을 반환한다고 스프링에게 선언한다.빈이라는 개념이 참 햇갈리네요. 식견이 짧아 저 정도밖에 이해를 못하겠습니다. 틀린 부분 교정 부탁드립니다.
-
미해결스프링 핵심 원리 - 기본편
MemberRepository 2개 빈으로 확인 오류
안녕하세요. CoreApplication을 돌려서 아래와 같은 결과가 나왔는데 해결은 했습니다만, MemberRepository는 인터페이스고 Component 안해줬는데 왜 이런 오류메세지가 뜰까요 ? MemoryMemberRepository에 @Primary를 써서 해결하긴했는데 이해가 안되네요Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined in file [D:\Dev\Java\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] - memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class]
-
해결됨토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
Kotlin 에서 JPA Entity 생성시 질문
안녕하세요. 토비님!현재 저는 강의 내용을 Kotlin springboot 로 따라가고 있습니다.JPA Entity 클래스를 생성할 때, 자바에선 롬복까지 이용해서 Getter 만 만들어놓고 setter 는 닫아놓는 게 쉽게 되는데, 이걸 코틀린에서는 롬복을 사용하지 않다보니 코틀린스러우면서도 깔끔하게 사용하는 방법에 대해서 애를 먹고 있습니다. 찾아보니 3가지 방법 있는 것 같습니다.방법1. 자바랑 가장 비슷하게, 필드를 모두 private 으로 생성하고 getter 는 롬복 대신 직접 선언.@Entity open class Member( @Column(name = "email", unique = true, nullable = false) private var email: String, @Column(name = "nickname", nullable = false) private var nickname: String, @Column(name = "passwordHash", nullable = false) private var passwordHash: String, @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) private var status: MemberStatus = MemberStatus.PENDING, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L fun getEmail(): String = email fun getNickname(): String = nickname fun getPasswordHash(): String = passwordHash fun getStatus(): MemberStatus = status } 방법2. getter 를 좀 더 코틀린스럽게 사용하기 위해 내부 필드를 _를 붙여서 선언 @Entity class Member2( @Column(name = "email", unique = true, nullable = false) private var _email: String, @Column(name = "nickname", nullable = false) private var _nickname: String, @Column(name = "passwordHash", nullable = false) private var _passwordHash: String, @Enumerated(EnumType.STRING) @Column(name = "status", nullable = false) private var _status: MemberStatus = MemberStatus.PENDING, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L val email: String get() = _email val nickname: String get() = _nickname val passwordHash: String get() = _passwordHash val status: MemberStatus get() = _status }방법3. protected set 사용@Entity open class Member3( email: String, nickname: String, passwordHash: String, status: MemberStatus = MemberStatus.PENDING, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L @Column(name = "email", unique = true, nullable = false) var email: String = email protected set @Column(name = "nickname", nullable = false) var nickname: String = nickname protected set @Column(name = "passwordHash", nullable = false) var passwordHash: String = passwordHash protected set @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) var status: MemberStatus = status protected set } 방법4(?). 전부 public val 로 선언하고, 변경시 새로운 객체 생성@Entity @Table(name = "members") class Member4( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long = 0L, @Column(name = "email", unique = true, nullable = false) val email: String, @Column(name = "nickname", nullable = false) val nickname: String, @Column(name = "passwordHash", nullable = false) val passwordHash: String, @Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) val status: MemberStatus = MemberStatus.PENDING, ) { fun updateNickname(newNickname: String): Member4 { require(newNickname.isNotBlank()) { "Nickname cannot be blank" } return Member4( id = this.id, email = this.email, nickname = newNickname, passwordHash = this.passwordHash, status = this.status, ) } } 어느 방식을 선택하는게 현명할까요? 토비님은 평소에 어떻게 하시는지 궁금합니다.
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
application.yml driver-class-name 연결오류
spring: datasource: # 데이터의 원천 spring이 어떤 데이터를 가르키냐 url: "jdbc:mysql://localhost/library" #스프링이 붙을(연결할) 데이터베이스의 주소 #jdbc- java database conenncter 말그대로 자바가 데이터베이스에 연결할수있게해주는 프로그램 #이때 데이터종류는 mysql이고 데이터베이스는 우리 컴퓨터 localhost에있다. 그리고 사용할데이터베이스는 library이다. username: "root" password: "비밀번호" driver-class-name: com.mysql.cj.jdbc.Driver #데이터베이스에 접근할 때 사용할 프로그램위와 같이 코드를 작성했는데 인텔리제이 얼티메이트를 사용하고 있는데도 com.mysql.cj.jdbc.Driver클릭이 안돼서 뭔가 이상하다 싶었는데 다른 질문들 답변을 보니 잘될수도 있다해서 일단 인강 코드대로 따라 갔습니다. 그런데 api를 전부 수정하고 서버를 동작하려고하니 mysql연결이 안된다는 오류와 함꼐 서버 실행이안돼서 질문 남깁니다..! plugins { id 'org.springframework.boot' version '2.7.6' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } 위처럼 그래들파일에도 runtimeOnly 'mysql:mysql-connector-java:8.0.42'이코드가 잘 있는데 안되는것같습니다. 다른답변들 참고해서 위처럼 자바 버전을 붙이고 캐시지워서 리스타트한다음 다시 서버 켜봐도 안돼서 질문남깁니다..!