묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
comment_v2에서 unique index 를 추가하지 않고 table 생성 시 path에 unique 제약을 걸어도 효과가 같을까요?
안녕하세요 쿠케님. 우선 좋은 강의 감사합니다.다름이 아니라 댓글 무한 depth - 테이블&구현 설계에서 unique index를 작성하는 부분이 나오는데 unique index 대신 index로 구현하고 table 생성 시 path에 unique 제약을 걸어도 효과가 같을지 궁금합니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
hot article 로직 변경
안녕하세요 선생님 !선생님 코드로 구현을 완료하고 제가 커스텀 해보고 있는 중에 고민이 있어 질문글 남깁니다.추천 수가 특정 개수 이상일때 hot article이 되고, 매일 갱신하는 것이 아닌, 한번 hot article이 되면 계속해서 hot article 게시판에 게시하고 싶습니다.이럴 때 hot article을 데이터베이스에 저장하는 것이 좋을까요 아니면 redis에 저장하는 것이 좋을까요 ?선생님의 의견이 궁금하여 질문 남깁니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
MSA -> 모놀리식 패턴으로 수정
안녕하세요 선생님현재 애플리케이션을 MSA에서 모놀리식으로 바꾸고 있습니다.MSA 에서는 hot-article 애플리케이션에서는각각의 서비스들과 통신하지 않고 데이터를 저장하기 위해ArticleCommentCountRepository, ArticleViewCountRepository,ArticleLikeCountRepository 를 따로 만든 것으로 이해했습니다 .모놀리식에서는 이 3개의 Count Repository를 따로 만들지 않고 각각의 서비스에 있는 Count Repository 에서 가져오는 것이 더 좋을까요, 아니면아니면 MSA hot-article 패키지에 따로 count repository를 만드는 것이 좋을까요 ..선생님의 의견이 궁금합니다 .
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
M2는 업데이트가 끝난건가요?
안녕하세요! M2 업데이트 끝날 때 몰아서 듣고 싶어서 기다리고 있는데공지사항과 일정 변동?을 보면 업데이트가 끝났다는 뉘앙스로 말씀하셨지만본 강의 커리큘럼을 보면 아직 챕터 이름?이 살아 있어서 업데이트가 끝난건지 업데이트 예정인지 궁금합니다!
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
RedisTemplate<String, String>
RedisTemplate<String, String> 빈으로 등록하지 않고 생성자 주입으로 사용하던데 빈으로 등록하지 않아도 스프링 내에서 자동으로 빈 등록해주나요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
노션에 오타가 있서요
첫번째로딩:5두번째로딩:5이 맞는 거 같아요5주차15) 대표적인 문제 사례 1, 2 해결 방법 에 있습니다
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
@Async 여부의 차이가 궁금합니다.
@Async @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handleEventJoinCompleted(EventJoinCompletedEvent event) { try { kakaoTalkMessageApi.sendEventJoinMessage( event.getPhoneNumber(), event.getEventName() ); } catch (Exception e) { log.error("알림 발송 실패. eventId={}, eventName={}", event.getEventId(), event.getEventName(), e); } }이 로직은 비동기적으로 이벤트를 처리하는 알림서비스 로직입니다. @TransactionalEventListner(Aftercommit)를 사용하면 메인 로직이 commit 된 이후에 해당 이벤트가 실행하는 걸로 알고있는데@Asnyc를 붙히지 않았더라도 메인 로직에서 끝마치고 해당 이벤트를 실행하니깐 똑같은 결과가 나오지 않나요?차이가 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
45강 빌드 오류입니다.
안녕하세요?강사님 덕분에 열공하고 있습니다.2가지 문의드립니다.1) 프론트엔드의 리액트 소스 부탁드립니다. ==> cyj10241@gmail.com2) 45강 빌드를 하려는데 오류가 납니다. 저는 java를 17를 인스톨했습니다.[ec2-user@ip-172-31-43-148 Spring_Web]$ java -versionopenjdk version "17.0.15" 2025-04-15 LTSOpenJDK Runtime Environment Corretto-17.0.15.6.1 (build 17.0.15+6-LTS)OpenJDK 64-Bit Server VM Corretto-17.0.15.6.1 (build 17.0.15+6-LTS, mixed mode, sharing)[ec2-user@ip-172-31-43-148 Spring_Web]$ chmod +x ./gradlew[ec2-user@ip-172-31-43-148 Spring_Web]$ ./gradlew build -x testFAILURE: Build failed with an exception.* What went wrong:Could not determine the dependencies of task ':bootJar'.> Could not resolve all dependencies for configuration ':runtimeClasspath'. > Failed to calculate the value of task ':compileJava' property 'javaCompiler'. > Cannot find a Java installation on your machine (Linux 6.1.134-152.225.amzn2023.x86_64 amd64) matching: {languageVersion=17, vendor=any vendor, implementation=vendor-specific, nativeImageCapable=false}. Toolchain download repositories have not been configured.* Try:> Learn more about toolchain auto-detection and auto-provisioning at https://docs.gradle.org/8.14/userguide/toolchains.html#sec:auto_detection.> Learn more about toolchain repositories at https://docs.gradle.org/8.14/userguide/toolchains.html#sub:download_repositories.> 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.위와 같은 오류가 나는데 해결 방법을 알고 싶습니다.감사합니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
active profiles는 인텔리제이 커뮤니티 버전에 없네요
무료버전은 해당 기능설정을 지원하지 않네요.뭐지? 했던분들 참고하시면 좋겠네요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
MSA 에서 Monolithic Architecture로 마이그레이션
안녕하세요 강사님 ! 강의 잘듣고 있습니다.강의를 거의 다들었는데, Monolithic Architecture로 마이그레이션 해보고 싶다는 생각이 들어 해보려고 합니다.각각의 모듈을 하나의 어플리케이션의 패키지로 만들기만 하면 될까요 ? 어느 부분을 신경쓰면 좋을지 간단하게라도 조언해주시면 정말 감사드리겠습니다 .!!이 강의를 듣기를 진심으로 잘했다는 생각이 듭니다. 좋은 강의 해주셔서 감사드리고 다음 강의도 기대하겠습니다 !!
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
[2주차] 곁다리 질문
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요?2주차 성능 테스트 챕터까지 수강했습니다. 제목처럼 강의 주요 내용은 아니지만 궁금한 점이 생겨 글 작성하였습니다.질문에 악의가 없는데, 쓰다보니 공격적인 말투로 느껴지네요... 죄송합니다. 공격이 아니고 제가 공부한 부분과 달라서 어떤 게 맞는지를 여쭙고자 작성한 질문입니다. 작성해주신 포트폴리오 코드를 보면, A Service에서 A Repository, B Repository, C Repository 등을 주입받아 사용하셨는데 이게 올바른 구조인가요?? 상황: 현재 저는 계층형 폴더 구조(Controller, Service, Repository 등)가 아닌 도메인형 폴더 구조(User, Post, Tag 등)를 가져가고 있습니다. 계층형과 도메인형 모두 자신의 도메인이 아닌 다른 도메인의 다른 레이어 파일을 주입받기 보다는 Service는 Service끼리 주입을 받는 게 결합도를 낮추고 리팩토링하기 편한 방향이라고 생각했습니다. 이러다보니 Controller에서 호출하는 함수는 DTO로 통신을 하고, Service끼리 사용하는 함수는 Entity로 통신을 하게 되었습니다. 주석으로 "Interal method"라고 명시를 하였지만, 응답 형식만 다를 뿐 같은 일을 하는 함수도 많아져서 이게 맞는건가 싶은 고민이 있었습니다. 애초에 Repository를 쓰는 것도 여러 파일에서 쉽게 불러쓰기 위해서라는 말도 봤던 것 같아서 뭐가 맞는지 정답이 궁금합니다. TPS 기준이 궁금합니다. 현재 쿠폰 시스템 비슷한 프로젝트를 하고 있는데, "우리 서비스의 TPS가 몇이다"라고 할 때는 가장 주요한 로직 기준으로 측정한 결과일까요? 아니면 모든 API 중 가장 낮은 TPS가 기준이 될까요? 또한 TPS 300이 되기 위해서, 400이 되기 위해서 이런 식으로 말씀해주셨는데, Insert 또는 Update 작업이 포함된 경우 어느정도 TPS가 나오면 적지 않은 수준일까요? 감사합니다.
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
실행계획에서 드라이빙 테이블과 드리븐 테이블을 판단하는 기준
1. 현재 학습 진도몇 챕터/몇 강을 수강 중이신가요?3-9 여기까지 이해하신 내용은 무엇인가요?MySQL에서 조인 연산을 수행할 때, 드라이빙 테이블과 드리븐 테이블로 구분되어 테이블의 각 행마다 연산이 진행되는 것으로 이해했습니다.2. 어려움을 겪는 부분어느 부분에서 막히셨나요?회원별 주문통계 쿼리 수행 시, 참조되는 주문 테이블과 멤버 테이블 중 멤버 테이블이 드라이빙 테이블이며, 실행계획 결과에서 멤버 테이블이 먼저 나왔기 때문이라고 하셨는데, 언급하신 실행결과가 다이어그램인가요? 아니면 DESC 로 출력한 결과표인가요?만약, DESC로 출력한 결과표를 말씀하신거면 그림 상에서는 주문 테이블이 먼저 나와있고, 다이어그램으로 봤을 때는 테이블의 표시 순서가 보이지는 않는데, 어떠한 근거로 멤버 테이블이 드라이빙 테이블이라고 한건지 궁금합니다.교안 내용MySQL에서 두 테이블을 조인할 때 가장 기본적인 메커니즘은 Nested Loop Join입니다.드라이빙 테이블(outer table)에서 한 행씩 가져오고,각 행마다 드리븐 테이블(inner table)을 인덱스 등을 이용해 조회하는 방식으로 이루어집니다.위 EXPLAIN 결과에서 m 테이블이 첫 번째로 표시되고, o 테이블이 두 번째로 표시되는 것은, m이 외부(outer) 루프 테이블, o가 내부(inner) 루프 테이블이 된다는 의미입니다. 실행계획 결과두 사진 모두 강의 교안에 있는 사진입니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
각 application.java에서 빈 스캔할때 차이
안녕하세요 Transactional Outbox 모듈 적용 부분을 듣던중에 차이가 발생해서 질문드립니다.강의에서는 이제 각 나눠진 기능마다 XXXAplication 클래스에EntityScan과 EnableJpaRRepositories 애노테이션을 달아주는것만으로도 다른패키지에있는 outboxEventPublisher를 사용할 수 있는데 저는 인식을 못합니다. application클래스에 @componentScan(...)까지 달아주고나서야 비로서 인식이 되기 시작하는데 혹시 뭐가 문제고 무슨 차이가 있는걸까요 ... 찾아봤는데 잘 안보입니다 ㅠㅠ
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
섹션4 (좋아요)의 댓글 수 구현 강의에서 질문 있습니다.
안녕하세요 ! 좋은 강의 해주셔서 감사합니다.섹션 4의 댓글 수 구현 강의 3분 39초 경에서 질문 있습니다 .선생님의 코드에서는 댓글을 물리적 삭제할때만 댓글 수를 decrease를 통해 줄여주고 있는데, 논리적 삭제 시에도 count를 줄여주는 것이 맞다고 생각해서 질문글 남깁니다. 왜 물리적 삭제 시에만 댓글 수를 decrease 하시는 건가요 ?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
ArticleDeletedEventHandler
handle()에 조회 수, 좋아요 수, 댓글 수 캐시도 삭제해주어야 하는데 누락되어야 한다고 생각이 하는데 어떻게 생각하시는지 궁금합니다! 아니면 다른 의도가 있으셨을까요?강의에서는 생성 시간 및 인기글 캐시만 삭제하고 있습니다!
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
TransactionalEventListener 관련 문의드리고자 글 남깁니다.
안녕하세요, 강사님 늘 강의 잘 듣고 있습니다, 감사합니다 !다름이 아니고, @Transactional과 @TransactionalEventListener 설정 관련해 궁금한 사항이 있어서 문의드리게 되었습니다.강의내용은 @Transactional, @TransactionalEventListener가 전역적으로 선언되었고 outbox 관련 로직만 존재하기 때문에 괜찮지만제 업무환경에서는 @TrasnactionalEventListener가 사용되면 프로젝트의 모든 @Transactional으로 관련된 내용이 바인딩되기 때문에 이를 scope 별로 구분하는 방법이 필요해보였는데요. 따로 알아보았지만, payload(강의에서는 OutboxEvent) 를 통해 분기처리하는 방법만 보이다보니 혹시 관련하여 TrasnactionalEventListener 어노테이션 필드 혹은 커스텀 어노테이션만으로 구분할 수 있는 방법이 있을까요 ?문의드리는 가장 큰 이유는 outbox 로직이 필요없는 DB처리에도 TrasnactionalEventListener이 우선은 호출되고 payload를 통해 early return 시키려고 하다보니, 불필요한 리소스 사용을 방지하고 싶어서 문의드리게 되었습니다.
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
오타 문의
안녕하세요! 우선 강의 너무 잘 듣고 있습니다!강의 자료에서 좋아요 수 설계 부분에서11:171:1 관계이지만, 테이블 비정규화의 필요성을 살펴본 것이다.이 부분은 1:1 관계이므로 비정규화의 필요성이 있지만, 레코드 락으로 인한 자원 한계를 고려하여 '정규화'의 필요성을 살펴본 것 이 맞지 않나 싶습니다! 혹시 제가 잘못 이해한 부분이 있다면 알려주시면 감사하겠습니다!
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
406 Not Acceptable에러 발생
현재 테스트 코드 작성하고 있는데 다음과 같이 에러 발생합니다.코드package board.article.api; import board.article.service.request.ArticleCreateRequest; import board.article.service.response.ArticleResponse; import lombok.AllArgsConstructor; import lombok.Getter; import org.junit.jupiter.api.Test; import org.springframework.web.client.RestClient; public class ArticleApiTest { RestClient restClient = RestClient.create("http://localhost:9000"); @Test void createTest() { ArticleResponse response = create(new ArticleCreateRequest( "hi", "my content", 1L, 1L )); System.out.println("response = " + response); } ArticleResponse create(ArticleCreateRequest request) { return restClient.post() .uri("/v1/articles") .body(request) .retrieve() .body(ArticleResponse.class); } @Getter @AllArgsConstructor static class ArticleCreateRequest { private String title; private String content; private Long writerId; private Long boardId; } @Getter @AllArgsConstructor static class ArticleUpdateRequest { private String title; private String content; } } 에러 > Task :common:snowflake:compileJava UP-TO-DATE> Task :common:snowflake:processResources NO-SOURCE> Task :common:snowflake:classes UP-TO-DATE> Task :common:snowflake:jar UP-TO-DATE> Task :service:article:compileJava> Task :service:article:processResources UP-TO-DATE> Task :service:article:classes> Task :service:article:compileTestJava> Task :service:article:processTestResources NO-SOURCE> Task :service:article:testClassesorg.springframework.web.client.HttpClientErrorException$NotAcceptable: 406 Not Acceptable: "{"timestamp":"2025-05-29T06:00:40.838+00:00","status":406,"error":"Not Acceptable","path":"/v1/articles"}" at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:118) at org.springframework.web.client.StatusHandler.lambda$defaultHandler$3(StatusHandler.java:86) at org.springframework.web.client.StatusHandler.handle(StatusHandler.java:146) at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.applyStatusHandlers(DefaultRestClient.java:672) at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:195) at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:659) at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:605) at board.article.api.ArticleApiTest.create(ArticleApiTest.java:26) at board.article.api.ArticleApiTest.createTest(ArticleApiTest.java:15) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)> Task :service:article:testArticleApiTest > createTest() FAILED org.springframework.web.client.HttpClientErrorException$NotAcceptable at ArticleApiTest.java:261 test completed, 1 failed> Task :service:article:test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':service:article:test'.> There were failing tests. See the report at: file:///C:/Users/zxc86/Desktop/study/springboot/board/service/article/build/reports/tests/test/index.html* Try:> Run with --scan to get full insights.BUILD FAILED in 4s6 actionable tasks: 3 executed, 3 up-to-dategpt에서는 accept 설정이 없어서 그렇다는데 강사님 코드에는 없어서요원인이 뭘까요?
-
해결됨Spring Boot, AWS로 백엔드 서비스 한 사이클 완성하기
다운받은 강의자료 압축풀기가 안되요
다운은 되는데 압축풀기에서 오류가 뜨네요. 파일에 문제가 있을까요?
-
해결됨6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
Redis 캐싱 시 발생하는 대표 문제 사례와 해결책 3 강의가 누락된 거 같습니다.
Redis 캐싱 시 발생하는 대표 문제 사례와 해결책 3 강의가 없습니다.바로 6주차 숙제로 넘어가네요