혹시 실습중에 Quota 초과되어서 호출 안되시는 분들은 gpt-4o 대신 비용이 더 낮은 gpt-5-nano 모델로 호출해보세요 저는 모델 바꾸니까 결제 안해도 호출은 되더라구요 (결국 여러번 시도하면 quota 때문에 막히긴합니다) https://platform.openai.com/docs/pricing
안녕하세요 딩코님, 클라우드 환경에서 비용이 발생하지 않는 올바른 테스트 방법에 대해 여쭙고자 질문 남깁니다. 제 스스로 느끼기에, 제가 프리티어로 사용하고 있는 EC2 인스턴스 내부에서 k6 스크립트를 실행하게 되면 EC2 과부화는 물론 RDS 에도 몇백만건의 데이터가 삽입이 되니 비용적, 컴퓨팅 자원적 문제가 발생할 것 으로 생각이 됩니다. 그래서 혹시 다음과 같은 방법으로 클라우드 환경 테스트를 진행하면 될지 여쭤보고 싶습니다. 테라포밍을 통해 AWS EC2 + RDS 조합으로 서버 배포 배포된 해당 주소로 제가 가지고 있는 노트북(EC2 아니고 제 로컬 PC) 터미널에서 k6 스크립트 실행 이때도 비용문제가 발생하는지? -> 아니라면 저비용으로 테스트하는 국룰 방법을 좀 소개해 주시면 감사드리겠습니다 ! 강의 너무 재밌습니다 ㅋㅋㅋ 감사합니다 !
안녕하세요 . 강의에서 애그리거트 루트가 하위 도메인을 일관성을 유지하기 위해 member.updateInfo() 로 MemberDetail updateinfo() 를 호출하는것을 보았는데요 만약 Profille에 여러 속성(프로필주소, 프로필이미지를 불러올 수 있는 주소,정보 등이 존재)이 있어 값 타입이 아닌 Entity로 존재해야 할 경우엔 member.updateInfo() -> memberDetail.updateInfo() -> profile.updateInfo() 로 depth가 내려갈 것 같은데요. 뭔가 잘못된 방법 같아서요.. 혹시 이런 경우에는 어떻게 도메인을 설계해야 좋을지 궁금합니다...!!
안녕하세요 공부하다가 보니 FetchGroups방식으로 했을때 Map으로 반환되고 DTO로 변환해야하는 오버헤드가 발생하는데요 Multiset방식으로 하면 1:N 관계에서 바로 DTO로 반환 할 수 있는데요 코드 보기가 조금은 더 복잡해 보이지만 WHERE절이 있을때 현재 테이블 데이터와 인덱스 상으로는 성능적으로 더 괜찮은거 같아서 multiset방식은 강의에 없어서 어떤지 궁금해서 여쭤봅니다 public List<ActorFilmography> findActorFilmographyWithMultiset(ActorFilmographySearchOption searchOption) { final JFilmActor FILM_ACTOR = JFilmActor.FILM_ACTOR; final JFilm FILM = JFilm.FILM; return dslContext.select( ACTOR, DSL.multiset( DSL.select(FILM.fields()) .from(FILM) .join(FILM_ACTOR) .on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID)) .where( FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID), containsIfNotBlank(FILM.TITLE, searchOption.getFilmTitle()) ) ).convertFrom(r -> r.into(Film.class)) ) .from(ACTOR) .where( containsIfNotBlank(ACTOR.FIRST_NAME.concat(" ").concat(ACTOR.LAST_NAME), searchOption.getActorName()) ) .fetch(record -> new ActorFilmography( record.value1().into(Actor.class), record.value2() )); } WHERE 조건 포함 시 성능 비교 fetchGroups 방식 (cost=405, rows=609) Film 필터링 먼저 → FilmActor 조인 → Actor 필터링 1. film 테이블 스캔 (1000 rows) └─ LIKE '%COMMANDMENTS EXPRESS%' → 111 rows 2. film_actor 인덱스 조회 (idx_fk_film_id) → 609 rows 3. actor PRIMARY KEY 조회 → 609 rows └─ LIKE '%LOLLOBRIGIDA%' → 1 row (최종) 특징: - Film 조건이 선택적이면 먼저 필터링하여 조인 범위 축소 - 하지만 Actor 필터링은 마지막에 수행 (비효율) - 609개 row가 네트워크 전송 → 애플리케이션에서 1개로 그룹핑 --- multiset 방식 (cost=20.2 + 13.3 × filtered_actors) Actor 필터링 먼저 → 각 Actor의 Film 서브쿼리 1. actor 테이블 스캔 (200 rows) └─ LIKE '%LOLLOBRIGIDA%' → 1 row (필터링 후) 2. 필터링된 1개 actor에 대해 서브쿼리 실행: - film_actor PRIMARY KEY 조회 (27.3 rows 추정) - film PRIMARY KEY 조회 (27.3번) - LIKE '%COMMANDMENTS EXPRESS%' → 1개 매칭 특징: - Actor 조건을 먼저 적용하여 서브쿼리 실행 횟수 최소화 - 필터링된 1개 Actor만 네트워크 전송 (JSON 포함) - Film 필터링은 각 actor 서브쿼리 내부에서 수행 --- 실제 Total Cost 계산 fetchGroups Total: 405 네트워크 전송: 609 rows (Actor + Film 중복 포함) 애플리케이션 처리: Map 생성 + Stream 변환 multiset Total: 20.2 + (13.3 × 1) = 33.5 네트워크 전송: 1 row (Actor + JSON array) 애플리케이션 처리: JSON 역직렬화 결론: WHERE 조건이 있으면 multiset이 압도적으로 유리 (405 vs 33.5) FetchGroups는 Actor를 나중에 필터링하고 multiset은 actor를 먼저 필터링해서 1개에 대한 film을 여러개 가져와서 현재 데이터에서는 더 유리한데 일반적인 사용법이 궁금합니다
안녕하세요 딩코딩코 선생님. 다름이 아니라 궁금한 점이 있어 Q&A에다가 글을 올립니다. 6주차 까지 진행을 하며 현재 실제 업무를 하며 해결한 내역들에 대해 다시 한번 정리 해 보는 시간을 가지려고 합니다. 이러한 과정을 수행했을 때 혹시 피드백을 해 주실 수 있는지 궁금합니다.
안녕하세요. 다른질문에도 동일하게 있는데 답변이 조금 모호한거같아서 다시 질문 드립니다. 강의 자료의 해당 강의 부분을 보면 org.springframework.data .repository.Repository 를 구현한 클래스는 스캔 대상 라고 되어있는데, 제가 이해한 바로는 이 부분이 org.springframework.data .jpa.repository.JpaRepository 를 상속받은 인터페이스 는 스캔 대상 이렇게 수정되어야 할 것 같은데 맞을까요..??
킬구형 잘 지내고 있는가? 날이 차가워졌다가 말다가 뒤죽박죽 3장 작전1의 JpaCursorItemReader 를 활용한 postBlockBatchJob 에 문제가 있어 보인다. 킬구형이 해킹을 잘한다지만, 우리는 못한다!!! 명령어에 jobParameters 가 제외 되었는데 이런 좋은 해킹 공유 해주면 좋겟다! postBlockBatchJob 은 startDateTime / endDateTime 를 필요로 하는 명령어로 보인다. 아래와 같이 구동해야 정상 작동이 되는걸로 보인다 ./gradlew bootRun --args='--spring.batch.job.name=postBlockBatchJob startDateTime=2025-11-16T00:00:00,java.time.LocalDateTime endDateTime=2025-11-20T00:00:00,java.time.LocalDateTime'
현재 윈도우 환경에서 학습 중이어서 형님께서 싫어하실 수 있겠지만, 꽤나 흥미로운 것을 발견해서 형님께(강의내용에 도움이 되실 수도 있을까 하여) 제보드립니다! 참고로 저의 경우 IntelliJ의 powershell에서 echo를 하고 csv/txt내용수정은 IntelliJ에서 직접 하였습니다. 1) csv 실행시 오류 최초 실행시 파싱불가 오류가 발생하였는데, csv파일에서 문제점은 없을 것으로 판단하여 프로젝트의 인코딩을 utf-8에서 EUC-KR로 변경해주었습니다. 이러면 정상 작동하였습니다. 2) fixedLength 실행시 오류 역시 최초 실행시 파싱불가 오류가 발생하였습니다. 로그를 살펴보았을때 인코딩이 잘못되었을 것으로 판단하여 프로젝트의 인코딩 설정과 해당 txt파일의 인코딩 설정을 모두 utf-8로 바꿔주었습니다(utf-16/utf-16LE/utf-16BE 모두 오류 발생, 특히 저 인코딩 문제는 utf-8에서만 유일하게 발생하지 않아서 utf-8 인코딩만 가능한 것으로 보임). 이래도 파싱문제가 발생하였는데, .columns(new Range[]{ new Range(1, 8), // errorId: ERR001 + 2 new Range(9, 29), // errorDateTime: 19 + 2 new Range(30, 38), // severity: CRITICAL/FATAL + padding new Range(39, 44), // processId: 1234 + 2 new Range(45, 66) // errorMessage: msg + \n }) severity 부분을 30 ~ 39 가 아닌 30 ~ 38로 바꿔주었고 마지막 errorMessage 부분을 46 ~ 66이 아닌 45 ~ 66으로 바꿔주었습니다(21자리 -> 22자리) echo로 공백을 입력해주었지만 실제 파일을 보았을때는 공백이 먹히지 않았던 것 같습니다. 그래서 아래와 같이 공백대신 문자열 1개를 그냥 입력해주었습니다. echo를 통한 개행이 먹히지 않아 위와 같이 intellij로 txt파일을 변경해주었습니다. 마지막 문자는 DETECT + 공백 + 개행 -> DETECTS + 개행으로 공백을 제거해주었습니다. 이렇게 했을때 최종적으로 빌드성공하였습니다. 저 Range범위, 특히 severity 범위를 왜 저렇게 구성해야 하는지, 이게 윈도우 실행 환경만 이런건지, 제 환경에서만 이런 문제가 발생하는건지..아직도 모르겠지만.. 형님께 제보를 해드리면 좋을 것 같아서 남겨봅니다!
디바이스 선택시 Chrome(web)과 저의 실물 핸드폰 연결해서 했더니 안드로이드 스튜디오 코드는 잘 돌아갑니다. 하지만 BoardViewModel.dart 코드에서 설정한 url그대로 따라 쳤는데 swagger ui에서 계속 화면처럼 response body가 비어있습니다.. 계속나와서 혹시 전체 소스코드 공유 안될까요??
킬구형 5장. 작전2: Run Squad 장악 작전 공부중인데, Process finished with exit code 0 이라는 문구 자체가 나오질 않아. 혹시나 싶어서 새 프로젝트 만들어서 시도해봐도 마찬가지고,, 윈도우 11, java 17에 org.springframework.boot:spring-boot-starter-batch:3.5.7 환경에서 개발중인데 혹시 버전이나 OS 문제일까?? 아니면 뭔가 설정을 빼먹은건지 모르겠네.. 혹시 몰라서 application.yaml 설정도 첨부해 spring: application.name: demo output.ansi.enabled: always datasource: url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 driver-class-name: org.h2.Driver username: sa password:
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 이 부분에서 Student student를 선언하고 new Student();를 안했는데 어떻게 바로 .name같은 거를 사용할 수 있는 건가요? 다른 부분에서는 꼭 객체를 먼저 생성해야 접근을 할 수 있는데 이 함수에서는 왜 가능한건가요? static void initStudent(Student student, String name, int age, int grade) { student.name = name; student.age = age; student.grade = grade; }