inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

[사례] Maven에서 TestContainers 플러그인 적용시 예외발생

해결됨

실전 jOOQ! Type Safe SQL with Java

앞으론 과거에 겪었던 이슈들도 생각날때마다 여기에 기록하도록 하겠습니다. Maven에서 TestContainers 공식 플러그인을 활용해 DSL을 만들면 에러가 출력됨 결론부터 말하자면 TestContainers의 자체적인 문제고 실제 DSL 생성에는 문제가 없음. 무시하고 사용하면됨 See Also https://github.com/testcontainers/testcontainers-jooq-codegen-maven-plugin/issues/37 https://github.com/testcontainers/testcontainers-java/issues/1454 설명 maven 프로젝트에서 Testcontainer + flyway를 활용해 jOOQ DSL을 만드려면 아래 testcontainer에서 공식적으로 제공해주는 플러그인을 사용하는게 제일 편리함 https://github.com/testcontainers/testcontainers-jooq-codegen-maven-plugin 다만 PostgreSQL, MySQL등을 Testcontainer로 띄워서 DSL을 만들다보면 작업 마지막에 다음과같이 NoClassDefCoundError라를 에러메시지가 나옴 (다만 작업은 정상적으로 완료됨) 관련해서 이미 아래와 같이 이슈가 올라와있음 (필자도 겪어보고 여기에 의견을 남겼었음) https://github.com/testcontainers/testcontainers-jooq-codegen-maven-plugin/issues/37 결과적으론 공식 플러그인의 문제가 아니라 TestContainers 자체이슈임 TestContainers과 Maven 간의 자체적인 문제로 인해 발생하는 거였고, TestContainer의 이 이슈 가 해결되기 전까진 해결 할 수 없음 다만 이걸 플러그인 없이 수동으로 작업하는건 유지보수하기도 어렵고, 수동으로 작업해도 동일한 이슈가 발생할것이기 때문에 에러로그가 뜨더라도 사용하는것을 추천함.

  • java
  • sql
  • spring-boot
  • jooq
  • dsl
설동민 댓글 0 좋아요 0 조회수 167

무한 depth 구현 설계에서 질문이 있습니다.

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 00a0z의 prefix(parentPath)를 가지고 모든 자손 댓글에서, 가장 큰 path(descendantsTopPath)를 찾는 과정인데요. 현재 childrenTopPath가 00a0z 00002 이지만 해당 댓글에 대댓글이 없고 00a0z 00001의 대댓글만 있는 상황에서는 00a0z 00002 자기 자신이 childrenTopPath 이자 descendantsTopPath가 되는걸까요? 00a0z 00002 와 00a0z 00001 00000 을 비교했을때 앞의 것이 더 큰 path라고 판단하면 되는걸까요?

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
fb1014 댓글 2 좋아요 0 조회수 242

서비스 구동하며 테스트와 디버깅하기 - 1 에서 기동하는 방법

해결됨

Spring Boot를 활용하여 채팅 플랫폼 만들어보기

서비스 구동하며 테스트와 디버깅하기 - 1에서 기동하는 방법을 알려주실 수 있을까요?? 강의에서 갑자기 포트번호가 왜 3000으로 설정되어 나오는지도 모르겠고, start.sh로 실행시켜서 localhost:7002로 하면 이렇게 나옵니다... /register 이건 어디서 설정하는 건가요?? 대체 뭐가 문제인걸까요..ㅠㅠ

  • mysql
  • spring-boot
  • jpa
  • jwt
  • websocket
cloverj0 댓글 2 좋아요 0 조회수 149

회원 리포지토리 테스트케이스 작성파트

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예! 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니요 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] @AfterEach 관련해서 clearStore함수가 import 되지 않는다고 합니다. 강의에서는 작동이 되는데.. 사실 저도 이게 이해가 안가는 부분인데 어떻게 인터프리터에 import를 하지 않았는데 이 함수가 테스트 하는 쪽에서 작동이 될수 있는거죠?? 다른분들도 여기까지하고 질문이 다 마무리 되지 않아서 올려봅니다..ㅠㅠ

  • java
  • spring
  • mvc
  • spring-boot
최윤선 댓글 2 좋아요 0 조회수 362

authenticationManagerBuilder 주입받은거 vs 만든 거

미해결

스프링 시큐리티 완전 정복 [6.x 개정판]

HttpSecurity에서 가져오는 AuthenticationManagerBuilder와 주입받는 AuthenticationManagerBuilder가 사로 다르지만 타입이 같아 메서드는 똑같을텐데 managerBuilder.authenticationProvider(new DaoAuthenticationProvider()); builder.authenticationProvider(new DaoAuthenticationProvider()); 후자일경우 수업 내용처럼 부모 프로파이더에는 DaoAuthenticationProvider() 가 들어가고 providers 에는 커스텀과 익명 프로바이더 2개가 들어가는데요 전자 즉 직접 참조하는 AuthenticationManagerBuilder는 부모 프로바이더는 null 인데 반해 기존 providers 에 생겨서 총 3개가되고있습니다 물론 실제 실행할때에는 똑같은 결과지만 함수authenticationProvider 은 public AuthenticationManagerBuilder authenticationProvider(AuthenticationProvider authenticationProvider) { this.authenticationProviders.add(authenticationProvider); return this; } 인데 왜 각각의 작동이 다른지 궁금합니다

  • spring
  • spring-boot
  • spring-security
  • security
  • web-security
kkkkkk 댓글 1 좋아요 0 조회수 126

hashMap<Long Member>설정에서 궁금한 점이 있습니다.

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문내용] HashMap을 설정할 때, <ID, Member>로 설정하는 이유를 알 수 있을까요? <ID, name>으로 설정하면, 더 간단하게 처리할 수 있지 않을까요?

  • java
  • spring
  • mvc
  • spring-boot
jaehak choi 댓글 2 좋아요 0 조회수 119

회원 도메인과 리포지토리 만들기- 람다 질문

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 질문을 드립니다. 자바 고급 2편을 어느 정도 끝내고 스프링 입문 으로 넘어왔는데, findBy 부분에서 옵셔널, 및 람다가 나와서, 무슨 내용인지 이해가 안됩니다. 옵셔널은 영한님이 설명해주니 어느 정도 이해가 가능한데, 람다에서 filter() 및 findAny() 라는 메서드가 어떤식으로 작동되는지 이해가 안가는 상황 입니다. 이럴 때에는 고급3편 으로 가서 filter() 및 findyAny() 라는 것을 공부하고 오는게 나은가요? filter() 안에 있는 내용은 어느 정도 이해 가능합니다. member 객체를 찾은 다음 member의 getName을꺼내서 인자값name이랑 비교 해라.. 이정도? 추가1 자바 고급3편은 나올 때 구매 해둔 상태입니다. 답변 부탁 드립니다.

  • java
  • spring
  • mvc
  • spring-boot
생각하는자 댓글 1 좋아요 0 조회수 121

업로드 파일 보여주기(교재 191~199) 관련 질문

미해결

코드로 배우는 React 19 with 스프링부트 API서버

위 그림은 교재 195페이지 내용입니다. localhost:8080으로는 교재의 내용대로 잘 실행이 되었습니다. 그래서, 지금은 aws beanstalk에서(localhost:8080이 아니 aws 서버)에서 윗 부분을 실행 시켜볼려고 하니, 3가지에 부딪혔는데... 당장 내 서버(aws서버)의 upload폴더는 어디에서 볼 수 있으며, 어떻게 upload 폴더에 aaa.jpg를 올리며, 'localhost:8080/api/products/view/aaa.jpg 대신에 "beanstalk도메인/api/products/view/내파일이름"으로 위의 사진 처럼 실행시킬 수 있는지 위 3가지에 대해서 정중히 질문드립니다. (수정 추가) 지금 aws RDS 의 CRUD는 원활히 이루어지고 있습니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
hee woong Yoo 댓글 1 좋아요 0 조회수 155

락 처리

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

안녕하세요 선생님 동시성 처리 방법에는 redisson을 활용한 방법도 있는데요 혹시 이 방법은 언제 써야할까요? 감사합니다

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
wnsqud70 댓글 2 좋아요 0 조회수 183

rowLock

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

안녕하세요 강의 잘 보고 있습니다. rowLock 단점에 대해서 질문드리고 싶습니다. 강의에 나온내용 말고 rowLock이 걸려도 격리레벨때문에(mysql기준) 이미 조회시 같은 값을 조회 했기때문에 동시서 이슈가 해결되지 않는다고 봐도 괜찮을까요?? 감사합니다

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
wnsqud70 댓글 2 좋아요 0 조회수 157

querydsl QTodo관련 문의

미해결

코드로 배우는 React 19 with 스프링부트 API서버

안녕하세요. 강의를 듣다가 QTodo 사용하는 시점에서 문제가 발생하여 문의드립니다. gradle 빌드시점에 QTodo 클래스를 생성하는 것 까진 확인을 하였는데 search1 메소드에서 QTodo를 사용하려고 하니 클래스 인식 자체를 못하고 있습니다.(import도 안됨) 강의 내용상으로 봤을 때 build 디렉토리에서 인위적으로 복사한 것 같진 않은데 해당 클래스를 어떻게 import해서 사용해야 할지 몰라서 문의드립니다. springboot 버전은 3.3.10입니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
김종민 댓글 3 좋아요 0 조회수 167

강의 듣기 전 질문

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

프로젝트에서 IOT와 결합한 게임을 만들 예정인데, 실시간 통신인 Websocket이 필요하다고 해서 강의를 급하게 결제하였습니다. 여기에서는 실시간 채팅을 구현하는 걸로 보이는데 혹시 여기 내용을 공부하면 프로젝트에 실시간 통신 방식에서도 활용할 수 있을까요? 실시간 방 생성이나 IOT 현물과의 통신에서 WebSocket을 이용할거 같습니다.

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
edwin.dkim 댓글 1 좋아요 0 조회수 116

todo list 검색 기능 문의

해결됨

코드로 배우는 React 19 with 스프링부트 API서버

todo list 에서 검색어를 입력하여 검색된 결과를 화면에 출력하려면 어떻게 구현해야 하는지요? 예제에는 이런 것이 없는 거 같은데 제가 대충봐서 잘못 이해하고 있는 건가요? 전체적인 흐름으로 설명해주시면 감사하겠습니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
Link 댓글 2 좋아요 0 조회수 76

jwt 인증, 검증 질문입니다.

미해결

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요. jwt 11 버전 설명해주시면서 생성과 검증에 대한 궁금증이 생기는데요. 생성을 위해서는 base64로 인코딩 된 값을 디코더 하신 뒤 SecretKeySpec을 이용한 뒤 HS512로 암호화 하셨는데요. 검증 부분에서는 base64로 인코딩 된 값(디코더와 SecretKeySpec가 이루어지지 않은 채로)으로 토큰 검증 및 claims를 추출하는데 이 부분에서 문제가 없는 걸까요?

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
sw 댓글 2 좋아요 0 조회수 176

순수 라이브러리 사용하기 2 - memory-v1

해결됨

스프링 부트 - 핵심 원리와 활용

memory-v1 을 project-v1에 적용하는 과정에서 dependencies { implementation files('libs/memory-v1.jar') } 해당 방식으로 의존성 추가해주는 것이 되지 않습니다. 인텔리제이 재실행 해봐도 안됩니다. repositories { flatDir { dirs 'libs' } } dependencies { implementation name: 'memory-v1' } 따라서 위처럼 등록해주니 됐습니다.

  • spring
  • spring-boot
  • prometheus
  • grafana
한현진 댓글 1 좋아요 0 조회수 144

카프카에 담긴 이벤트 순서가 올바르지 않을 가능성 관련 질문

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

안녕하세요 쿠케님, 강의를 복습하다 새로운 궁금증이 생겨 질문 남깁니다. 본론부터 말씀드리자면, 카프카는 큐에 이벤트가 담기고, 동일 토픽 및 동일 파티션의 경우 동일한 offset을 쓰기 때문에 순서가 지켜져서 소모가 된다고 이해했습니다. 즉, 컨슈머가 몇개든 동일 토픽, 파티션인 경우 큐에 담겨진 순서대로 명확하게 소비된다고 이해했습니다. 그런데 만약 큐에 담겨진 순서가 올바른 순서가 아니라면 어떻게 되는 것일까요? 예를 들어, 2명의 클라이언트가 거의 같은 시간에 게시글 A에 대해 댓글을 생성했고 각 클라이언트는 서로 다른 댓글 서버에서 요청이 처리됐다고 가정하겠습니다. 이때 유저 A가 게시글 A에 대한 댓글을 먼저 생성했고, 유저 B가 간발의 차로 같은 게시글에 대한 댓글을 생성했을 때, 유저 A가 생성했을 때의 게시글 댓글 수는 4였고 B가 뒤 이어서 생성했다면 5가 될 것입니다. 백엔드 서버가 전송한 유저 A의 이벤트가 알 수 없는 문제로 카프카로 늦게 도착했고, 그 사이에 유저 B의 이벤트가 먼저 큐에 담겨졌습니다. 그렇다면 제가 첨부한 그림과 같이 됩니다. ( 이벤트는 지연 전송 방식이 아닌 트랜잭션 After Commit 이후에 즉시 전송됐다고 가정. ) 이때 컨슈머인 article-read 서비스에서 이벤트를 순서대로 소비하며 레디스에 저장된 게시글 A의 ArticleQueryModel 댓글 수를 최신화하는데 먼저 최신 값인 5로 최신화하고 다시 과거 값인 4로 최신화 할 것입니다. 이렇게 되면 게시글 A의 댓글 수 데이터의 일관성이 깨진다고 볼 수 있을 것 같습니다. 그래서 이에 대한 해결책으로 이벤트 payload에 댓글의 스노우플레이크 id가 담겨 있고, 스노우 플레이크는 시간 순으로 생성되기 때문에 레디스에 게시글 A에 대해 가장 마지막으로 처리된 이벤트의 스노우플레이크 id를 저장하고 다음으로 소비될 이벤트가 가장 마지막으로 처리된 이벤트 id보다 과거에 생성된 이벤트면 이 이벤트를 무시하면 되지 않을까? 생각했지만, 게시글에 대한 이벤트 타입이 여러가지이기 때문에 다른 타입의 이벤트가 무시될 수도 있겠다는 생각이 듭니다. 쓰고 나니까 너무 길게 질문 드린 것 같은데, 쿠케님의 강의가 정말 도움이 많이 돼서 이렇게 염치 불구하고 길게 질문드립니다. 이에 대한 의견 주시면 너무 감사하겠습니다. 강의 항상 잘 듣고있습니다.

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
알알이 댓글 2 좋아요 1 조회수 339

질문 하나 있습니다!

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

저번에 다음 강의 관련 글을 본 적이 있었는데요. 다음 강의는 Redis Cache Hit 관련 강의가 맞을까요? 맞다면 한 언제쯤 출시가 될까요! 다음 강의도 무척 기대되어서 그렇습니다!

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
리나 댓글 1 좋아요 0 조회수 93

management 서브넷 질문

미해결

인프라공방 - 그럴듯한 서비스 만들기

이전 실습 보면서 확인하는 데 bastion ec2 생성시 서브넷 중에 management 라는 서브넷 관련 내용이 없네요 제가 어디서 놓친걸까요? 아니면 생략된걸까요?

  • 네트워크
  • linux
  • aws
  • mysql
  • spring-boot
sonyjangho 댓글 2 좋아요 0 조회수 145

로그 레벨을 기준으로 알람 설정할 때, Kibana를 사용할 수 는 없나요?

미해결

개발자에게 필요한 로그 관리

안녕하세요 강사님. 이번에 강의를 복습하면서 한가지 궁금증이 생겨서 질문을 남기게 되었습니다. 섹션 5의 로그 레벨을 기준으로 알람 설정하려면? 강의를 보면 엘라스틱 서치 로 직접 http 요청을 보낸 후 받은 응답을 기준으로 알람 설정을 하도록 설명을 해주시는데요 요즘 시각화 툴 (Ex. 그라파나) 들은 Alert 같은 기능들이 있어서, 해당 기능들을 사용하면 간단하게 노코드로도 알람 설정이 가능한 것 같던데 키바나 는 해당 기능이 따로 없는 걸까요? 그래서 엘라스틱 서치 기준으로 알람 설정 하는 방법을 알려주신 걸까요? 좋은 강의 잘 봤습니다!!

  • spring-boot
  • elasticsearch
  • logstash
  • Kibana
  • logback
denia park 댓글 2 좋아요 1 조회수 269

JWT와 @PreAuthorize 사용하기에서 권한오류

미해결

코드로 배우는 React 19 with 스프링부트 API서버

동영상 강의에 있는 내용대로 ProductController에서 @GetMapping("/list")에 @PreAuthorize("hasAnyRole('ROLE_USER','ROLE_ADMIN')")를 작성하고나서 postman에 login 후 accessToken을 가져와서 get방식으로 토큰을 넣어서 입력하면 status : 500, "error": Interner Server Error가 뜹니다.. @PreAuthorize부분을 주석처리하고 실행해보면 list값이 잘 나오네요.. 어디부분이 잘못 된걸까요?? 참고로 CustomSecurityConfig클래스에 @EnableMethodSecurity추가도 했습니다. @PreAuthorize("hasAnyRole('ROLE_USER','ROLE_ADMIN')") @GetMapping("/list") public PageResponseDTO<ProductDTO> list(PageRequestDTO pageRequestDTO){ return productService.getList(pageRequestDTO); } 여기가 ProductController 클래스 package org.zerock.apiserver.security.filter; import com.google.gson.Gson; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.log4j.Log4j2; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.filter.OncePerRequestFilter; import org.zerock.apiserver.dto.MemberDTO; import org.zerock.apiserver.util.JWTUtil; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Map; @Log4j2 public class JWTCheckFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { //true == not check String path = request.getRequestURI(); log.info("------check uri---------"+path); if(path.startsWith("/api/member/")){ return true; } //false == check return false; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { log.info("----------------------"); log.info("----------------------"); log.info("----------------------"); String autoHeaderStr = request.getHeader("Authorization"); //bearer // 7개 후 JWT 문자열 try { String accessToken = autoHeaderStr.substring(7); Map<String, Object> claims = JWTUtil.validateToken(accessToken); log.info("JWT claims: " + claims); // filterChain.doFilter(request, response); String email = (String) claims.get("email"); String pw = (String) claims.get("pw"); String nickname = (String) claims.get("nickname"); Boolean social = (Boolean) claims.get("social"); List<String> roleNames = (List<String>) claims.get("roleNames"); MemberDTO memberDTO = new MemberDTO(email, pw, nickname, social.booleanValue(), roleNames); log.info("---------------------------------"); log.info(memberDTO); log.info(memberDTO.getAuthorities()); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(memberDTO, pw, memberDTO.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authenticationToken); filterChain.doFilter(request, response); }catch(Exception e){ log.error("JWT Check Error --------------------"); log.error(e.getMessage()); Gson gson = new Gson(); String msg = gson.toJson(Map.of("error", "ERROR_ACCESS_TOKEN")); response.setContentType("application/json"); PrintWriter printWriter = response.getWriter(); printWriter.println(msg); printWriter.close(); } //destination filterChain.doFilter(request, response); } } 여기가 JWTCheckFilter부분입니다.

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
tobot222 댓글 2 좋아요 0 조회수 180

인기 태그

인프런 TOP Writers

주간 인기글