안녕하세요 병진님:) 좋은 강의 감사합니다! n8n 강의를 차례차례 따라하고 있는데요. 'Naver 뉴스 스크랩 봇' 강의를 따라하는 도중에 의도치 않는 결과가 나와서 질문 드립니다. 강의에서 Filter 노드를 사용하셨는데, Filter 노드는 array를 받아서 그 중에서 조건에 맞지 않는 값들은 filter하는 것으로 이해하였습니다. 하지만 저희는 for loop을 통해서 array가 아닌 한 개의 값들만 filter 노드를 통과할 것이고, 그리고 실제로 이 값이 false이면 진행하지 않고 멈춰버릴 것으로 예상됩니다. 실제로 실습 도중에 아래의 그림과 같이 Filter 노드 결과가 false이니까 그 이후를 진행하지 않고 workflow successfully ended로 끝나버렸습니다. 그래서 Filter 노드를 쓰면 안된다고 이해했는데 맞을까요? 그래서 Filter 노드 대신에 If 노드를 사용하였고, false이면 for loop과 이어주었더니 그제서야 의도대로 동작하였습니다. 이렇게 수정한 버전이 맞을까요? (+아니면 Filter 노드로 원래 의도대로 동작하는거라서 굳이 If 노드를 사용할 필요가 없는건가요?) 바쁘실텐데 답변 주시면 감사하겠습니다!
ItemData 의 경우, 코드 상에서 경로로 읽어오는 것이라고는 하나 ItemData 의 경우 에셋매니저에 등록되어 에셋매니저의 Primary 키값으로 가져옵니다. 반면 Box 와 같은 스태택 메쉬, 입력맵핑, 애님 몽타주 등은 코드 상 텍스트로 불러오는데요. 그냥 보았을때는 텍스트로 코드상에 직접 경로를 추가하여 불러오는 객체들의 경로(폴더)를 지정해야 할 것 같은데 반대로 에셋매니저를 통해 불러오는 아이템데이터만 쿠킹경로에 별도로 추가하였습니다. 이유를 알 수 있을까요? 기본적으로 빌드시, 맵에 대한 정보를 기본적으로 가져온다고 멘트하였는데 맵에는 또 위의 입력맵핑, 애님 몽타주 등은 없는 것 같은데.. 게임모드->게임플레이어컨트롤러->캐릭터 등등 하여 코드상 참조된 코드들의 FClassFinder, FObjectFinder 혹은 TSubclassOf, T(F)SoftObjectPtr 을 엔진이 알아서 알아내고 빌드시 추가되는 것인지 궁금합니다.
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세 요 여기서 왜 가운데에 10이 생긴걸까요? 제가 100일을 쓰기도 전에 10일 쓰고 모르고 실행하긴했는데 그래서 그런걸까요?//...
안녕하세요 강의잘듣고 있습니다!! 1. 이미지 생성 및 이미지 업로드 서버까지 완료. Blog-Image-Maker 워크플로우까지 생성해서 When Excuted by Another Workflow(Accept all data)까지 생 성 2. 다시 Blog-Content-Writer 워크플로우에서 loop 에 excute sub-workflow 를 붙였는데, input데이터는 있으나 output에 image_url 이 공란으로 나옵니다. 핀 전부 제거하고 다시 수행해도 마찬가지네요... 해결방법이 없을까요?
안녕하세요, 토비님. 강의 유익하게 듣고 있습니다. 🔵 수업: 28. 회원 애플리케이션 서비스 테스트 (2) / 13:00~ : 이메일 중복 검사는 도메인모델에서 처리할 수 없음 🔵 질문 : 이메일 중복 여부의 검사는 도메인 규칙으로 생각됩니다. 이메일 중복 여부 검사를 도메인 계층 대신 애플리케이션 계층에 두신 점에 대해 토비님의 시각이 궁금합니다. 회원 도메인의 email 속성을 자연키로 삼아 유일성을 부여했고, 이는 도메인 규칙이라 생각됩니다. 이메일 중복 여부 검사는 외부 액터와의 상호작용이 필요하니 말씀하신 것처럼 도메인 모델 내부에서 직접 수행할 수 없지만, PasswordEncoder 처럼 도메인 서비스를 통해 검사를 수행하여 '이메일은 중복될 수 없다'는 도메인 규칙을 도메인 계층에 잡아두는 것도 아키텍처 구조 상 문제는 없을 것 같습니다. 🔵 코드 : 수업 버전 - 애플리케이션 서비스에서 이메일 중복 검사 (코드 블럭을 java 코드로 설정했고, 글 작성/수정 페이지에서는 코드 색상이 제대로 표시되는데 수정을 완료하면 흑백으로 돌아옵니다.) @Service @RequiredArgsConstructor public class MemberService implements MemberRegister { private final MemberRepository memberRepository; private final EmailSender emailSender; private final PasswordEncoder passwordEncoder; @Override public Member register(Member.MemberRegisterRequest registerRequest) { // 이메일 중복 검사 checkDuplicateEmail(registerRequest); Member member = Member.register(registerRequest, passwordEncoder); memberRepository.save(member); sendWelcomeEmail(member); return member; } ... } 회원 도메인 객체에서 이메일 중복 검사 도메인 서비스 EmailDuplicationChecker 를 추가하고 Member.register(...) 에서 EmailDuplicationChecker 를 이용해 이메일 중복 검사 수행 domain.EmailDuplicationChecker package tobyspring.splearn.domain; /** * 이메일 중복 검사를 수행하는 도메인 서비스 */ public interface EmailDuplicationChecker { boolean isDuplicated(String email); } domain/Member @Entity ... public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ... public static Member register( MemberRegisterRequest registerRequest, PasswordEncoder passwordEncoder, EmailDuplicationChecker emailDuplicationChecker ) { Member member = new Member(); // 🔻이메일 중복 검사 if (emailDuplicationChecker.isDuplicated(registerRequest.email())) { throw new DuplicateEmailException("Duplicated email: " + registerRequest.email()); } ... return member; } ... } 레포지터리와 협력하기위해 EmailDuplicationChecker 구현하는 어댑터 추가 adapter.persistence.EmailDuplicationCheckerImpl @Component @RequiredArgsConstructor public class EmailDuplicationCheckerImpl implements EmailDuplicationChecker { private final MemberRepository memberRepository; @Override public boolean isDuplicated(String email) { return memberRepository.findByEmail(new Email(email)).isPresent(); } } 기존 애플리케이션 서비스에 포함된 이메일 중복 검사 제거 application.MemberService @Service ... public class MemberService implements MemberRegister { private final MemberRepository memberRepository; private final EmailSender emailSender; private final PasswordEncoder passwordEncoder; private final EmailDuplicationChecker emailDuplicationChecker; @Override public Member register(Member.MemberRegisterRequest registerRequest) { // 🔻이메일 중복 검사 호출 제거 Member member = Member.register(registerRequest, passwordEncoder, emailDuplicationChecker); memberRepository.save(member); sendWelcomeEmail(member); return member; } ... } 🔵 제가 생각해본 장단점 수업 버전 - 애플리케이션 서비스에서 이메일 중복 검사 장점 회원 등록 과정 절차에 이메일 중복 검사가 표현되어 회원 등록 과정 절차를 명시적으로 표현 '중복 검사는 안하나?' 같은 의문을 방지 단점 - 회원 도메인 객체에서 이메일 중복 검사 장점 이메일 중복 불가 규칙을 도메인 계층 내부에 표현하여 도메인 모델을 코드에 자세히 표현 여러 지점에서 중복 검사가 필요한 경우, 반복되는 중복 검사 메서드(레포지터리 조회 후 예외 생성)를 어댑터에 위임할 수 있음 단점 액터와의 협력이 필요한 도메인 규칙마다 도메인서비스&어댑터가 추가되어 유지보수 포인트가 추가되고, 이를 이용하는 객체에도 의존성이 추가되어 DI해야할 파라미터가 늘어남. 만약 제가 개발을 진행 한다면 도메인 규칙마다 도메인서비스&어댑터를 추가하는 비용이 크다고 생각하는 점, 도메인 계층까지 내려가지 않고도 로직의 큰 흐름을 이해할 수 있는 점에서 수업 내용대로 애플리케이션 서비스에 로직을 구현하는 방식을 사용할 것 같습니다. 그럼에도 도메인 규칙을 도메인 계층에 두는 것에 대해서 토비님이 의견이 궁금합니다. 감사합니다.
강의 잘 보고 있습니다! 좋은 강의 만들어 주셔서 감사해요 강의 보다가 그냥 좀 어색한 부분이 있는거 같아서 공유드립니다~ 65. Supabase로 공지사항 다이얼로그 띄우기 (2) 수업중 아래 파일의 코드에서 하나 확인 부탁드립니다. lib/widget/announcement_dialog.dart 3번의 prefs.setStringList 가 2번의 if 문 안으로 들어가는게 맞을거 같아요. static Future<void> _setViewed(int announcementId) async { final prefs = await SharedPreferences.getInstance(); // 1. 기존의 공지사항 아이디를 가져온다. final viewedIds = prefs.getStringList(_viewedAnnouncementsKey) ?? []; // 2. 가져온 아이디에 포함여부 확인. if (!viewedIds.contains(announcementId.toString())) { viewedIds.add(announcementId.toString()); } // 3. 포함되어 있지 않다면 새로 추가한다. await prefs.setStringList(_viewedAnnouncementsKey, viewedIds); }
안녕하세요. char myString[]="Hello, World!"; 인 경우 printf("문자열\"%s\"의 길이는 %d입니다.\n", myString, strLen(myString)); 의 출력 결과 관련하여 문의드립니다. (strLen(myString) 값은 13임) 출력 결과값을 문자열 "Hello, World!"의 길이는 13입니다. 로 적어주셨는데, 명령어 내의 \" \" 이건 왜 생략되나요? 문자열 \"Hello, World!\"의 길이는 13입니다. 이렇게 출력돼야 하는거 아닌가요?
페이지 이동 뿐만 아니라 데이터 주고받는거랑 스크롤 이벤트 감지하는거, 스택, 스낵바 등등 현업에서 필요한 유용한 내용 많이 알려주셔서 정말 도움 되는 강의였습니다! 따라하면서 듣느라 1시간짜리 강의를 거의 4시간 넘게 들었네요 ㅎㅎㅎ 그만큼 알차고 유익했습니다!! 진짜 바이브 코딩 말고 이렇게 공식문서 보면서 제대로 이해하고 코딩하고 싶었는데 정말 도움됐습니다!! GPT 도움받았던 코드 다 갈아엎으러 가야겠습니다 ㅎㅎ 감사합니다!!
void swap(int * x, int * y) { int temp; temp = *x; * x = *y; *y = temp; } 안녕하세요 강사님 위 함수가 temp를 지역변수로 선언하면 재진입가능한 함수가 된다고하셨는데 x와 y 포인터 접근으로 공유자원이 발생할 수 있는 상황이 발생할 수 있어 재진입 불가능한 함수이지 않나요? 잦은 질문드려 죄송합니다.
bg-muted, muted-foreground를 린트가 인식하지 못하는 것 같아요. Tailwind CSS IntelliSense 설치했구요, 추가로 PostCSS Language Support 확장 프로그램까지 설치한 상태입니다. 현재 제 eslint.config.js파일입니다. import js from '@eslint/js'; import globals from 'globals'; import reactHooks from 'eslint-plugin-react-hooks'; import reactRefresh from 'eslint-plugin-react-refresh'; import tseslint from 'typescript-eslint'; import { defineConfig, globalIgnores } from 'eslint/config'; import tailwind from 'eslint-plugin-tailwindcss'; export default defineConfig([ globalIgnores(['dist']), js.configs.recommended, // ESLint 기본 권장 ...tailwind.configs['flat/recommended'], // Tailwind 플러그인 권장(배열) ...tseslint.configs.recommended, // TypeScript 권장(배열) { files: ['**/*.{ts,tsx}'], extends: [ reactHooks.configs['recommended-latest'], // React Hooks 권장 reactRefresh.configs.vite, // Vite 환경에서 React Refresh ], rules: { 'tailwindcss/classnames-order': 'off', // 정렬은 Prettier가 담당하므로 충돌 방지 "@typescript-eslint/no-unused-vars": 'warn', // 사용되지 않은 변수가 있다면 경고 "@typescript-eslint/no-explicit-any": 'warn' // 명시적으로 any를 사용하면 경고 }, languageOptions: { globals: globals.browser, }, }, ]);