Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:143) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final] 이런식의 오류가 났는데 데베설정이 잘못돼서 그런건가요 코듣상의 문제는 없는거 같습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의 보고 똑같이 코딩했는데 localhost:8080 이렇게넣었을때 welcom화면으로 index.html이 뜹니다 다른분들이질문하신 글들을 다 읽어보고 답변해주신내용들 대로 다 실행해보았으나 해결이 되지 않아, 같은 내용이지만 글을 올립니다.. home에서 ctrl + B했을때 home.html화면이 잘 떴었고, 전체기간 캐시도 삭제해 봤습니다.. 그리고 index.html지우면 화이트라벨 에러뜨면서 안되더라구요. 제거 https://drive.google.com/file/d/1mDv9-Z_r6aChpDBx1ZhtlJZL0dZG6Hzj/view?usp=sharing
안녕하세요! 강사님 덕분에 현재 진행중인 프로젝트 코드에 동시성 문제 잘 적용하고 있습니다. 다름이 아니라, 현재 MSA 프로젝트를 하고 있어 쿠폰 쪽 DB는 쿠폰만 쓰기 때문에 부하에 따른 걱정은 덜어도 될 것 같아 카프카가 아닌 Redis의 INCR 명령어를 통해서 선착순 쿠폰 로직의 Race condition 문제를 잡아보려고 하고 있는데요. 질문에 앞서 프로젝트 환경을 말씀드리자면 강의와 동일하게 docker pull redis 해서 이미지로 다운받아 실행했고, 6380 포트로 연결해줘서 yml 설정과 Config 설정 또한 해줬습니다. INCR 키 값을 살짝 바꿔서 coupon_count:{couponId} 가 되도록 해줬습니다. 문제는 1000개의 쓰레드로 요청을 날렸을 때 여러번의 요청 테스트는 통과가 안된다는 점입니다.. 쿠폰 발급이 100개 되어야하는데 102, 103번 애매하게 되고 있습니다. (postman으로 API 요청 날릴 때마다 해당 키 값의 value가 1씩 잘 증가하는 것은 확인했습니다) RDB 상에서도 100개의 발급 내역이 잘 들어오고 있구요. (물론 테스트가 DB에 영향을 미치면 안되지만요ㅠㅠ) 이런 경우는 왜 그런건가요?? 코드도 첨부 하겠습니다. 감사합니다!! /* * 선착순 쿠폰 발급 */ @Transactional public CouponIssuedResponseDto issueFirstComeCoupon(CouponIssuedRequestDto request) { // 쿠폰 ID로 쿠폰을 찾고, 존재하지 않으면 예외 처리 Coupon coupon = couponRepository.findById(request.couponId()) .orElseThrow(() -> new CustomException(ErrorCode.COUPON_NOT_FOUND)); // 발급 가능한 쿠폰 수량 확인 -> Redis Long currentCount = couponCountRepository.getCount(request.couponId()); if (currentCount > coupon.getMaxQuantity()) { throw new CustomException(ErrorCode.COUPON_ISSUE_LIMIT_EXCEEDED); } // 새로운 쿠폰 발급 -> Redis에서 수량 증가 Long newCount = couponCountRepository.increment(request.couponId()); if (newCount > coupon.getMaxQuantity()) { throw new CustomException(ErrorCode.COUPON_ISSUE_LIMIT_EXCEEDED); } CouponIssued issued = CouponIssued.builder() .coupon(coupon) .userId(request.userId()) .issuedAt(LocalDateTime.now()) .build(); CouponIssued saved = couponIssuedRepository.save(issued); return CouponIssuedResponseDto.fromEntity(saved); } @Repository public class CouponCountRepository { private final RedisTemplate<String, Long> redisTemplate; public CouponCountRepository(RedisTemplate<String, Long> redisTemplate) { this.redisTemplate = redisTemplate; } public Long increment(Long couponId) { String key = "coupon_count:" + couponId; return redisTemplate.opsForValue().increment(key, 1); } public Long getCount(Long couponId) { String key = "coupon_count:" + couponId; Long count = redisTemplate.opsForValue().get(key); return count != null ? count : 0L; } } @BeforeEach public void setUp() { // Redis 초기화 redisTemplate.opsForValue().set("coupon_count:10", 0L); } @AfterEach public void tearDown() { couponRepository.deleteAll(); couponIssuedRepository.deleteAll(); redisTemplate.delete("coupon_count:10"); // 테스트 끝난 후 Redis 데이터 삭제 } @Test public void multipleUserIssueCoupon() throws InterruptedException { // Given // 쿠폰을 생성 Coupon coupon = Coupon.builder() .name("Test Coupon") .couponCode("TEST100") .discountRate(10) .maxQuantity(100L) .issuedQuantity(0L) .expiresAt(LocalDateTime.now().plusDays(30)) .couponType(CouponTypeEnum.FIRST_COME) .build(); couponRepository.save(coupon); Long couponId = coupon.getCouponId(); // 고정된 couponId 사용 Long userId = 1L; // 고정된 userId 사용 // When int threadCount = 1000; ExecutorService executorService = Executors.newFixedThreadPool(50); CountDownLatch latch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { executorService.submit(() -> { try { CouponIssuedRequestDto request = new CouponIssuedRequestDto(10L, userId); couponIssuedService.issueFirstComeCoupon(request); } catch (CustomException e) { // Expected exception when limit is exceeded } finally { latch.countDown(); } }); } latch.await(20, TimeUnit.SECONDS); // Then Long count = redisTemplate.opsForValue().get("coupon_count:10"); System.out.println("coupon_count:10 = " + count); // 디버깅용 로그 추가 assertThat(count).isNotNull(); // count가 null이 아닌지 확인 assertThat(count).isEqualTo(100); // 발급된 쿠폰의 수를 확인 long issuedCount = couponIssuedRepository.count(); assertThat(issuedCount).isEqualTo(100); }
Aborting installation. Unexpected error. Please report it as a bug: Error: EACCES: permission denied, open '/Users/jeonginn/Library/Preferences/create-next-app-nodejs/config.json.tmp-982595282012e022' at openSync (node:fs:581:18) at attempt (/Users/jeonginn/.npm/_npx/efeac22998af9bf2/node_modules/create-next-app/dist/index.js:8:43165) at Object.writeFileSync (/Users/jeonginn/.npm/_npx/efeac22998af9bf2/node_modules/create-next-app/dist/index.js:8:38664) at Conf._write (/Users/jeonginn/.npm/_npx/efeac22998af9bf2/node_modules/create-next-app/dist/index.js:8:74912) at set store [as store] (/Users/jeonginn/.npm/_npx/efeac22998af9bf2/node_modules/create-next-app/dist/index.js:8:73358) at Conf.set (/Users/jeonginn/.npm/_npx/efeac22998af9bf2/node_modules/create-next-app/dist/index.js:8:71962) at run (/Users/jeonginn/.npm/_npx/efeac22998af9bf2/node_modules/create-next-app/dist/index.js:74:51291) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) { errno: -13, code: 'EACCES', syscall: 'open', path: '/Users/jeonginn/Library/Preferences/create-next-app-nodejs/config.json.tmp-982595282012e022' } 설치할 때 터미널에서 이런 메세지가 나오네요 ㅠㅠ 권한 문제인거 같아서 구글링 계속 해보면서 해봤는데 안되서 글 남깁니다 ㅠㅠ
https://github.com/ZeroCho/next-app-router-z/blob/master/lecture/src/app/(afterLogin)/layout.tsx 제로초님 강의를 다 듣고 코드를 살펴보던 중 의문이 있어 질문 드립니다. 해당 코드를 보면 lecture/src/app/(afterLogin)/layout.tsx 파일에서 거의 최고 부모컴포넌트인 <RQProvider>가 "use client"를 사용하여 클라이언트 컴포넌트가 되는것으로 알고있는데 이렇게 한다면 그 하위 컴포넌트들은 전부 클라이언트 컴포넌트가되는게 아닌가요? 어떻게 서버컴포넌트를 사용할 수 있는건지 궁금합니다.
안녕하세요 선생님 완강하고 채팅을 구현해보려고 합니다. 그런데 강의와 깃헙을 보면 soket으로 보내는 내용, 쿼리에 데이터 추가하는 내용은 있는데 소켓으로 보낸 내용이 백엔드에 저장되는 부분이 보이질 않더라구요, 클라이언트에서 소켓으로 데이터를 보내면 그걸 받고 백엔드에서 저장해주는 로직이 따로 있는걸까요?
선생님 문제풀이 하실 때 짝수, 약수를 구분해서 빠르게 문제를 파악하는 스킬은 매우 좋은 방법 같아요 그런데 코드가 한번 돌아가면서 변수 숫자가 바뀌는데 그냥 풀어버리시니까 어떻게 하는 지 프로그램을 사용해보지 않은 비전공자 입장에서는 이해가 덜 가는 것 같아요 조건 반복문에서 변수가 증감되는 것이 헷갈리거든요 문제를 풀 때는 하나 하나 숫자를 적어가면서 변하는 값을 알고 대입해야 하는데.. 풀이를 보니 쫒아가지를 못하겠네요 조건 반복문 문제풀이에서 어떻게 계산하라는 거지? 라는 생각이 들어요. 제가 표도 그려서 적어보기도 하고.. 여러 방법을 시도해봤는데 여러개의 변수가 들어가면 헷갈리더라고요 (15분 전 문제, 15분 문제) 조금만 더 자세하게 천천히 알려주시면 감사하겠습니다. 수포자는 더 힘들어요. ㅋㅋ
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
안녕하세요! 잘 따라가면서 설치하고있었는데, 시뮬레이터에서 실행하면 아래 이렇게 뜨면서 오류가 납니다 ㅠㅠ Error (Xcode): Target debug_unpack_ios failed: Exception: Failed to codesign /Users/kimminseo/Desktop/test_proj/build/ios/Debug-iphonesimulator/Flutter.framework/Flutter with identity -. Could not build the application for the simulator. Error launching application on iPhone 15 Pro Max. 이건..어찌 해결해야하는지 모르겠어서 ㅠㅠ 문의드립니다. 감사합니다!
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
메모리에 있지 않은 데이터의 캐시처리는 어떻게 하는지 가르쳐주셨는데 만약 음식탭에서 레스토랑에 없는 음식을 선택해서 state 를 추가하게 되면 레스토랑 페이지에서 추가 데이터를 가져오게 되면 paginate(after: 새롭게 추가된 id) 가 되서 새롭게 추가된 id이후로 fetchCount를 가져올테니 중간에 건너뛰는 일이 중간에 누락될 거 같은데 선생님은 어떻게 생각하세요??
[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
paginate를 일반환하는 과정에서 meta가 중요한 곳은 따로 처리를 안하고 data를 쓰는 부분에서 <T>를 추가해서 다음과 같이 final pState=State as CursorPagination<T>;라고 사용하셨는데 사실 일반화 전에도 Restaurant만paginate할떄도 final pState=State as CursorPagination<RestaurantModel>; 을 안쓰셨는데 , 일반화 때문이 아니라도 dynamic 타입이 들어가니까 원래 써야 하는 곳이 아닌가 해서요 이때는 왜 안썼는지 궁금합니다. 강의 항상 잘보고 있습니다 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 강의대로 application.yml로 했을 때는 생성이 잘 되었습니다. 그런데 test -resource - application-test.yml로 넘어가니 h2에 Member테이블이 생성되지 않습니다. 어떻게 해야할까요?
java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar 강의에서 처럼 주소 지정이 안찾아지는 분들은 왼쪽 상단바에 jar검색하셔서 해당하는 주소값을 마지막에 적으시면됩니다. 왼쪽 파일 검색 jar검색 java -jar target/해당하는 파일명.jar ex) java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar
안녕하세요 ! 항상 좋은 강의 감사합니다. 😃 강의 10:09 에서 말씀해주실때 firstEntry 와 lastEntry 만 immutable이라고 말씀해주셔서 테스트를 해봤습니다. pollFirstEntry 와 pollLastEntry 도 unmodifiable copy 객체를 반환하는 거같아서요 public static void main(String[] args) { LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("key1", "value1"); linkedHashMap.put("key2", "value2"); linkedHashMap.put("key3", "value3"); Map.Entry<String, String> firstEntry = linkedHashMap.pollFirstEntry(); firstEntry.setValue("new value"); } 이렇게 했는데 예외가 발생했습니다. 추가로 14강 9:50 에 reversed()도 immutable 이라고 말씀해주셨었는데 호기심에 테스트를 해보니 데이터가 수정됩니다. @Test @DisplayName("reversed 데이터 추가 및 원본 데이터 수정가능하다.") void add() { LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("key1", "value1"); linkedHashMap.put("key2", "value2"); linkedHashMap.put("key3", "value3"); SequencedMap<String, String> reversed = linkedHashMap.reversed(); reversed.put("key4", "value4"); Assertions.assertSame(4, linkedHashMap.size()); }
12강 11:24 쯤 질문이 있습니다 sealed interface AnimalDto를 구현한 Dto 2개를 switch와 sealed를 사용해서 코드를 깔끔하게 할 수 있다는 걸 알게되었습니다. 실제 코드로 작성하면 of의 반환 타입은 인터페이스인 AnimalDto가 되는데 이때 DogDto와 CatDto의 필드를 조회할 수 있는 추상 메서드가 모두 있다는 전제로 말씀해주시는게 맞을까요?