묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Practical Testing: 실용적인 테스트 가이드
TDD 를 적용하면 구현하려는 기능에 필요한 객체들을 설계하고 들어가야 하는건가요?
안녕하세요 강사님. 요즘 질문을 많이해서 대단히 죄송하게 생각하고 있습니다! 우선 질문 계기를 들어보시죠. [질문을 하게 된 이유]처음에 최소한으로 돌아가는 쓰레기 코드를 만들었고, 리팩토링으로 객체를 쪼개며 단위 테스트를 작성하고 있었습니다. 근데 갑자기 이런 고민이 들더군요. "TDD 를 적용하려면 어떻게 해야하지?" 하지만 아무리 생각을 해봐도 TDD 를 적용하려면 "쓰레기를 만들고, 여러 객체들로 쪼개 개선해나가는" 형태의 개발방식에은 사용할 수 없다는 결론에 도달하게 되었습니다. 애초에 TDD 를 적용하려면 "처음부터 구현하려는 기능에 필요한 객체들을 생각하고 만들어나가야 하는건가?" 아니 이러면 너무 피곤하지 않나? 라는 생각이 들었습니다. [본격적인 질문][질문 1]처음부터 돌아가는 쓰레기 코드(하나의 클래스에 몰빵) 를 만들고, 리팩토링을 통해 여러 객체로 책임을 분산시키는 형태의 개발 방식은 애초에 TDD 를 적용할 수 없는 것인가요? (TDD 를 적용하면 애초에 스파게티 코드가 나올 수 없는건가요?) [질문 2]TDD 가 애초에 구현하려는 기능에 필요한 객체들을 처음부터 설계하고 들어가는 방식인건가요? [질문 3]TDD 를 적용하려면 구현하는 기능에 필요한 도메인 지식들을 완벽하게 숙지하고 들어가야 코드를 수정하는 일이 별로 없을거라고 생각됩니다. 그렇지 않으면 "일단 쓰레기 구현 -> 리팩토링 -> 테스트" 개발 방식보다 시간이 훨씬 오래 걸릴거라고 생각하는데.. 강사님 생각은 어떠신지 궁금합니다. [질문 4]TDD 를 적용하면 코드 품질이 좋을 수 밖에 없는 이유가 [질문 2] 때문인가요? (한국말 너무 어렵습니다..)
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
최신화하기
#include <iostream> #include <ctime> using namespace std; struct TM { int tm_year; }; int main() { time_t timer = time(NULL); struct tm* t = localtime(&timer); int yeardb, year = t->tm_year + 1900, age; char Id[20]; cin >> Id; // 주민번호 입력 // 성별 계산 if (Id[7] == '1' || Id[7] == '2') { yeardb = 1900 + ((Id[0]-48) * 10 + (Id[1]-48)); // 특정 문자열의 문자숫자를 숫자로 변환하기 위해서는 '0' 문자0의 아스키 십진수인 48을 뺀다. } else { yeardb = 2000 + ((Id[0]-48) * 10 + (Id[1]-48)); } age = year - yeardb + 1; printf("%d ", age); if (Id[7] == '1' || Id[7] == '3') printf("M\n"); else printf("W\n"); return 0; }24년 기준 53세
-
미해결5개 거래소별 코인차익알림봇, 구체적인 개발 가이드 with Python
이벤트 참가합니다.
별점, 리뷰 작성 완료하였습니다.파이썬 전자책, 업그레이드 소스 부탁드립니다.ljs.stier@gmail.com
-
미해결파이썬 입문 및 웹 크롤링을 활용한 다양한 자동화 어플리케이션 제작하기
현재 예제에서 error 발생
3-2-2.py 17liner = s.get('https://jsonplaceholder.typicode.com/posts/1')=> requests.exception.SSLError 발생 3-3.py 49liner = requests.put('https://jsonplaceholder.typicode.com/posts/1', data=payload)=> requests.exception.SSLError 발생 변경시 r = requests.put('https://jsonplaceholder.typicode.com/posts/1', data=payload, verify=False)=> InsecureRequestWarning 발생 후 print(r.text) 결과: {}
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
싸이월드 과제 쪽이 궁금합니다.
혼자할때 요런식으로 진행했는데 강의를 보니 아예 다르게 하시더라구요 피그마 여백쪽을 margin 으로 일일히 계산했는데 틀린방법일까요?weight 100% 주면서 쉽게쉽게 하시길래 보면서 제 생각에는 미리 div들 따로 해놔서 maring 굳이 줄 이유가 없는것일까요?
-
미해결Flutter로 SNS 앱 만들기
섹션8 게시글 정보 가져오기
데이터를 가져오지 못하고 있습니다.파일은 멜로 보냈어요
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
수치형 데이터 스케일링
기출5회 작업형 2번 수치형 데이터 스케일링은 필요없나요? 언제 스케일링을 해야하는지 잘 모르겠어요..
-
미해결비전공자도 이해할 수 있는 AWS 입문/실전
각 세션에 보충강의로 Spring Boot에 적용하는 것도 올려주세요.
저는 Spring boot 개발자라 express는 잘 몰라서 Spring boot도 올려주시면 좋을 것 같아용.
-
해결됨RAG를 활용한 LLM Application 개발 (feat. LangChain)
환경 셋팅 관련 질문있습니다.
안녕하세요! 우선 저는 현재 윈도우 사용중이고요, 그런 의미에서 꾸역꾸역 3강을 거의 끝나가는 시점입니다~처음엔 쥬피터로 했는데, 커널이 계속 죽는 이슈로.. 코랩 엔터프라이즈로 돌리는 중입니다. 쥬피터를 활용해서 가상환경으로 하고 싶었는데 실패해서 결국 base에서 구동했어요ㅠㅠ 커널 죽는것도 이거 때문인가 싶기도하고.. 가상환경이 필수인건가요? 잘 돌아가면 일단 한숨 돌려도 되는거죠..? + vscode랑 쥬피터 연동하면 선생님처럼 .env파일을 쉽게 만들 수 있는건가요? 아님 pyenv한정 가능한 건가요? 저도 vscode로 쥬피터 연동까진 됐는데 .env파일 생성에서 막혀서 그냥 웹에서 돌리고 있었습니다 그마저 커널 이슈로 gcp로 돌렸지만.. ++ Open-AI 대신 gemini를 사용하는건 어떻게 생각하시나요? 본 강의에는 부적합한가요? 구글 크래딧이 있어서 이걸 활용하고 싶은데 꽤 장벽에 부딪히는거(가령 tiktoken이 안된다든지 ) 같은데 이게 제가 잘 몰라서 그런건지 보통 그런건지 모르겠네요. +++ 원래 정말 환경 얘기만 여쭤보려고했는데 적다보니 그동안 몰랐던거를 다 여쭤보게 됐네요.. 강의 잘 듣고 있습니다! 감사합니다~
-
미해결스프링 핵심 원리 - 기본편
@AllArgsConstructor에 대해 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@AllArgsConstructorclass Order{ private final orderId; private OrderStatus orderStatus = Order.ACCEPTED}@AllArgsConstructor 사용 시위의 orderStatus와 같이 초기화된 필드 또한 생성자의 파라미터로 생성되나요?
-
미해결파이썬/장고로 결제 시작하기 (Feat. 아임포트) - 기본편
pip 설치시 에러가 발생합니다.
Cannot install -r requirements.txt (line 5) and requests==2.28.2 because these package versions have conflicting dependencies.에러가 발생합니다. github 저장소의 requirements.txt를 확인해 주시면 감사드리겠습니다. 2.26.0 버전 설치도 문제가 되네요. poetry로 변경하는데도 의존성 문제는 해결이 안되고 에러가 여전히 발생합니다. 파이썬 버전이 3.12인데 혹시 파이썬 버전이 문제가 될까요?파이썬 버전이 현재 3.13이 나왔는데.. 아임포트의 해당 패키지는 2021이 마지막 업데이트였고 이후 업데이트가 없는데... 계속 업데이트되는 django와 python 버전이 문제가 될 수 있는건지도 걱정이 되네요..개별로 하나씩 패키지를 설치하면 requests가 설치되는것 같네요.. 그런데 requirements.txt를 pip으로 설치하면 호환성 에러가 그대로 발생합니다. 물론 poetry로는 개별 설치가 안됩니다. 정말 이상하네요. 혹시 문제가 무엇인지 확인을 하시게 되면 말씀 남겨 주시면 감사드리겠습니다.
-
미해결개발자를 위한 쉬운 도커
leafy 로그인이 되지 않습니다!
강사님 안녕하세요 leafy 애플리케이션 강의 중에 로그인이 되지 않는 문제로 질문 드립니다!프론트엔드, 백엔드, db 컨테이너 모두 실행시켰는데, 백엔드 컨테이너에 로그가 안남고 프론트엔드 컨테이너 로그를 보니 , "POST /api/v1/users/login HTTP/1.1" 404 555 "http://localhost/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/이러한 에러가 발생하는 걸로 보아 프론트엔드 - 백엔드 간 api 요청이 제대로 안됩니다.
-
미해결
플러터 Streambuilder질문
import 'dart:async'; import 'dart:convert'; import 'package:carwash/common/theme/theme.dart'; import 'package:carwash/community/view/community_screen_bak.dart'; import 'package:carwash/firebase/provider/pushRoute_provider.dart'; import 'package:carwash/user/view/splash_screen.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:get/get.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:kakao_flutter_sdk_user/kakao_flutter_sdk_user.dart'; import 'common/provider/go_router.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; //! Notification을 위한 StreamController 전역 변수 선언 String pushRoute = ''; final streamController = StreamController<String>(); Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { print("백그라운드 메시지 처리.. } void initializeNotification() async { FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); await flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(const AndroidNotificationChannel( 'high_importance_channel', 'high_importance_notification', importance: Importance.max)); DarwinInitializationSettings iosInitializationSettings = const DarwinInitializationSettings( requestAlertPermission: true, requestBadgePermission: true, requestSoundPermission: true ); // IOSInitializationSettings iosInitializationSettings = // IOSInitializationSettings( // requestAlertPermission: true, // requestBadgePermission: true, // requestSoundPermission: true // ); await flutterLocalNotificationsPlugin.initialize( InitializationSettings( android: AndroidInitializationSettings("@mipmap/ic_launcher"), iOS: iosInitializationSettings ), //앱이 켜져있을때 푸쉬 알림 클릭시 해당 경로로 이동 설정 onDidReceiveNotificationResponse: (NotificationResponse details) async { print('onDidReceiveNotificationResponse - payload: ${details.payload}'); final payload = details.payload ?? ''; final parsedJson = jsonDecode(jsonEncode(payload)); if(payload!=''){ pushRoute = payload; streamController.add(payload); } } ); await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( alert: true, badge: true, sound: true, ); } void main() async{ SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); await WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await initializeDateFormatting(); KakaoSdk.init(nativeAppKey: '7d131476e9dd71890bf99ffa94dec12d'); // 이 줄을 runApp 위에 추가한다. //푸쉬알림설정 initializeNotification(); runApp( const ProviderScope(child: _App()) ); } class _App extends ConsumerWidget { const _App({Key? key}) : super(key: key); @override Widget build(BuildContext context,WidgetRef ref) { final router = ref.watch(routerProvider); return MaterialApp.router( // 시스템 설정에 따른 Theme // themeMode: ThemeMode.system, theme: TAppTheme.lightTheme, // darkTheme: TAppTheme.darkTheme, debugShowCheckedModeBanner: false, routerDelegate: router.routerDelegate, routeInformationParser: router.routeInformationParser, routeInformationProvider: router.routeInformationProvider, ); } } 위는 제 메인 함수입니다. onDidReceiveNotification을 통해 넘겨온 정보를 streamcontroller에 저장시켜주고 import 'dart:io'; import 'package:carwash/car/view/carwash_record_screen.dart'; import 'package:carwash/common/layout/default_layout_v2.dart'; import 'package:carwash/common/provider/go_router.dart'; import 'package:carwash/common/view/main/main_screen.dart'; import 'package:carwash/community/view/community_screen.dart'; import 'package:carwash/firebase/provider/pushRoute_provider.dart'; import 'package:carwash/user/provider/user_me_provider.dart'; import 'package:carwash/user/view/profile/profile_screen.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:iconsax/iconsax.dart'; import 'package:permission_handler/permission_handler.dart'; import '../../community/view/community_detail_screen.dart'; import '../../main.dart'; import '../const/colors.dart'; class RootTab extends ConsumerStatefulWidget { static String get routeName => 'home'; const RootTab({Key? key}) : super(key: key); @override ConsumerState<RootTab> createState() => _RootTabState(); } class _RootTabState extends ConsumerState<RootTab> with SingleTickerProviderStateMixin { late TabController _tabController; int _selectIndex = 0; int _nowscreen = 0; var messageString = ""; @override Widget build(BuildContext context) { Stream route = streamController.stream; if(route!=null){ print(route); print('푸쉬 경로'); } return StreamBuilder( stream: route, builder: (BuildContext context,AsyncSnapshot snapshot){ print(snapshot.data); if(snapshot.data!=null){ Navigator.pop(context); } return DefaultLayoutV2( bottomNavagtionBar: Theme( data: ThemeData( splashColor: Colors.transparent, highlightColor: Colors.transparent, ), child: BottomNavigationBar( type: BottomNavigationBarType.fixed, selectedItemColor: PRIMARY_COLOR, unselectedItemColor: Colors.black, elevation: 0, backgroundColor: Colors.white, onTap: (int index) { _tabController.animateTo(index); }, currentIndex: _selectIndex, items: const [ BottomNavigationBarItem(icon: Icon(Iconsax.home), label: '홈'), BottomNavigationBarItem(icon: Icon(Iconsax.message_edit), label: '세차기록'), BottomNavigationBarItem(icon: Icon(Iconsax.messages_3), label: '커뮤니티'), BottomNavigationBarItem(icon: Icon(Iconsax.user), label: '내정보'), ], ), ), child: DefaultTabController( length: 4, child: TabBarView( physics: const NeverScrollableScrollPhysics(), controller: _tabController, children: [ MainScreen(tabController: changeTab), CarWashRecordScreen(), CommunityScreen(nowscreen: _nowscreen), UserProfileScreen(), ], ), ), );} ); } } //각종 권한 요청 Future<void> _requestPermission() async { if (Platform.isIOS) { // iOS에서 알림 권한 요청 코드 final IOSFlutterLocalNotificationsPlugin? iosImplementation = FlutterLocalNotificationsPlugin().resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>(); if (iosImplementation != null) { bool? result = await iosImplementation.requestPermissions( alert: true, badge: true, sound: true, ); if (result != null && result) { print('Notification permission granted.'); } else { print('Notification permission denied.'); } } } else if (Platform.isAndroid) { await Permission.notification.request(); // Android에서 알림 권한 요청 코드 PermissionStatus status = await Permission.notification.status; if (status.isGranted) { // 권한이 허용되었을 때 추가 작업 수행 } else if (status.isDenied || status.isPermanentlyDenied) { // 권한이 거부되었거나 영구적으로 거부된 경우 } else { await Permission.notification.request(); } } }메인화면에서 위와 같이 streambuilder를 통해 메인화면을 호출하고 있습니다.print(snapshot.data); if(snapshot.data!=null){ Navigator.pop(context); } 위의 부분이 푸쉬알림을 클릭했을때 streamController에 값이 넘어가 들어오는 부분인데 저 코드를 실행시키면 항상 setState() or markNeedsBuild() called during build. 과 같은 에러가 뜹니다 언제 화면을 push해줘야할까요
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형 1번 모의문제 2 질문드립니다
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요먼저 유사한 질문이 있었는지 검색해보세요소수점 나이를 제거할 때cond = df['age'] == round(df['age'],0) 이 코드로 반올림한 값과 age가 같은 것을 조건으로 걸었는데요 소수점 자리0.5미만인 애들은 제거가 안되지 않았을가요?예시:32 와 32.3 반올림한 값을 비교해도 같다고 나옴
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
함수 오적용 시 데이터 변경되었을 때, 원복 문의
변수 지정을 잘못 하여, 가격 프레임의 데이터가 완전 바뀌었는데다시 이전 데이터로 원복하려면 어떻게 해야하나요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
퀴즈 1번 문의
min_price 변수 지정없이 바로df['이벤트가'].fillna(df['이벤트가'].min())로 사용하면 안되던데, 왜그런 건가요?
-
미해결AWS로 쉽고 빠르지만 아주 견고한 서버 환경을 구축하는 방법
goopang-target-group 에서 unhealthy
안녕하세요 강사님.private-ec2-instance 의 Inbound Rules 에 goopang-alb 의 http 요청을 허용해주었는데, 여전히 goopang-target-group 에서 unhealthy 로 표시됩니다. Health status details 에는 Health checks failed 로만 나옵니다..이전 강의에서 NAT Gateway, Elastic IP 를 비용 문제로 삭제를 했었는데, 이후에 강의 들의 실습을 정상 진행하려면 2개를 삭제하면 안되었나요? 이번 강의도 2개를 삭제해서 문제가 발생한 경우일까요? NAT Instance 는 삭제하지 않았습니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
댓글 내용 수정 중 문제 / inputs 리팩토링 중 질문
안녕하세요~ 포트폴리오 과제하다가 질문 생겨 남겨요 첫번째는 댓글 내용 수정할 때 댓글 내용을 지우다가 다 지워지면 수정 전 원래 댓글 내용으로 도로 바뀌는 문젠데요댓글부분 리팩토링 끝마치고나서 발견해서 처음엔 뭘 잘못했나? 했는데 계속 보니 그냥 value에서 defaultValue를 대체하여 작성해주던 아래 부분 때문인 것 같더라고요value={ props.inputs.contents !== "" ? props.inputs.contents : props.el?.contents ?? "" }수정을 시작할 땐 props.inputs.contents === ""이니까 댓글 내용인 props.el?.contents를 불러와서 띄워주고, 지우는 중엔 state가 빈 문자열이 아니니까 props.inputs.contents대로 표시되다가 댓글 내용을 전부 지우면 props.inputs.contents가 다시 빈 문자열이 되어서 바로 기존 댓글 내용을 띄워버려요아예 댓글 내용을 지우고 싶어도 지울수가 없게 되어버리는데 어떻게 바꾸면 될까요? 좀 생각해봤는데 감이 안와서요 혹시 나중에 고치는 내용이 나오나요 두번째는 이번 포트폴리오 과제의 댓글부분 리팩토링 진행하다가 궁금했던 건데요// BoardCommentWrite.container.tsx // ... const onClickWrite = async (): Promise<void> => { // ... // setWriter(""); // setPassword(""); // setContents(""); setInputs( (prev) => Object.fromEntries( Object.keys(prev).map((key) => [key, ""]), ) as typeof prev, ); // ... }댓글 작성 끝날때 writer, password, contents를 비워줄 수 있도록 빈 문자열로 초기화시켜주던 걸 이런식으로 바꾸었는데 리팩토링 마치고 나서 잘 돌아가긴 했는데요위 부분을 너무 어거지로 바꾼 것 같아서 좀 그래요...사실setInputs({ writer: "", password: "", contents: "" })그냥 이렇게 하는게 여기선 가장 좋은 방법인 것 같긴 한데, 더 많은 state들을 묶는 경우도 있다고 생각하면 것도 좀... 그래서요이번 댓글 부분 코드에서는 setInputs({ writer: "", password: "", contents: "" }) 이렇게 하는게 가장 적당할까요? 그리고 더 많은 걸 초기화해야한다고 치면 어떻게 하는게 좋을까요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
함수별 ()와 [] 구분
함수별로 어떤것은 ()를 사용하고, 어떤것은 []를 사용하는데구분하는 법이 따로 있나요? 매번 헷갈리네요
-
해결됨세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)
시간 복잡도 O(n)과 O(c)의 차이
안녕하세요, 잘 듣고 있습니다! 0.준비 운동에서의 자료구조 정리 - python 강의 부분의 노션을 보니, 해시테이블의 경우 시간 복잡도가 O(c)로 적혀있던데, O(n)과의 차이가 무엇인가요? O(c)를 구글링 해보았는데 나오지 않아 질문드립니다.