묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
병렬 중첩
형 병렬 중첩 시키는 예제 코드있잖아.Worker Step Multithreading Implementation@Bean public Step managerStep(Step workerStep) { return new StepBuilder("managerStep", jobRepository) .partitioner("workerStep", dailyTimeRangePartitioner) .step(workerStep) .taskExecutor(partitionTaskExecutor()) .gridSize(4) .build(); } @Bean public Step workerStep(SynchronizedItemReader<TestLog> redisLogReader, ItemProcessor<TestLog, TestLog> logProcessor, MongoItemWriter<TestLog> mongoLogWriter) { return new StepBuilder("workerStep", jobRepository) .<TestLog, TestLog>chunk(500, transactionManager) .reader(redisLogReader) .processor(logProcessor) .writer(mongoLogWriter) .taskExecutor(workerTaskExecutor()) .build(); } @Bean @StepScope public SynchronizedItemReader<TestLog> redisLogReader(@Value("#{stepExecutionContext['startDateTime']}") LocalDateTime startDateTime) { log.info("{} read {}", Thread.currentThread().getName(), startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH"))); RedisItemReader<String, TestLog> itemReader = new RedisItemReaderBuilder<String, TestLog>() .redisTemplate(redisTemplate()) .scanOptions(ScanOptions.scanOptions() .match("logs:" + startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH")) + ":*") .count(10000) .build()) .build(); return new SynchronizedItemReader<>(itemReader); }@Bean public TaskExecutor workerTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(5); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(10); executor.setThreadNamePrefix("Worker-Thread-"); executor.setAllowCoreThreadTimeOut(true); executor.setKeepAliveSeconds(30); return executor; }이렇게 했는데2025-12-17T13:34:07.885+09:00 ERROR 1568 --- [ main] o.s.batch.core.step.AbstractStep : Encountered an error executing step workerStep in job testLogJob java.lang.NullPointerException: Cannot invoke "org.springframework.data.redis.core.Cursor.hasNext()" because "this.cursor" is null at org.springframework.batch.item.redis.RedisItemReader.read(RedisItemReader.java:62) ~[spring-batch-infrastructure-5.2.4.jar:5.2.4] 이런 오류가 나.그리고 ItemReader쪽에log.info("{} read {}", Thread.currentThread().getName(), startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHH")));로그를 찍었는데Worker-Thread-5 read 2025121712Worker-Thread-1 read 2025121706Worker-Thread-2 read 2025121700Worker-Thread-3 read 2025121718이런식으로 찍히고 있어.하나의 파티션을 여러 스레드가 읽어야 하는데 workerTaskExecutor가 서로 다른 파티션을 읽고 있어.내가 뭐 놓친게 있는걸까?
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
article_like_count api test
동시성 이슈가 안터질 수도 있나요?
-
미해결한 번에 끝내는 AI 에이전트 개발 올인원 (w. LangGraph, Google ADK, CrewAI)
SIGHUP 에러
안녕하세요섹션 4 수업 듣고 있는데 uv run ~ 명령어로 실행하면 아래와 같은 에러가 뜹니다. 해결 방법 알 수 있을까요?ㅠㅠ (agent-a-to-z) PS C:\Project\3_FUND_MANAGER_AGENT> uv run .\main.pyTraceback (most recent call last): File "C:\Project\3_FUND_MANAGER_AGENT\main.py", line 2, in <module> from crewai.flow.flow import Flow, listen, start, router, or_ File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\__init__.py", line 6, in <module> from crewai.agent.core import Agent File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agent\__init__.py", line 1, in <module> from crewai.agent.core import Agent File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agent\core.py", line 36, in <module> from crewai.agents.crew_agent_executor import CrewAgentExecutor File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agents\crew_agent_executor.py", line 15, in <module> from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\agents\agent_builder\base_agent_executor_mixin.py", line 6, in <module> from crewai.events.event_listener import event_listener File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\event_listener.py", line 10, in <module> from crewai.events.listeners.tracing.trace_listener import TraceCollectionListener File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\listeners\tracing\trace_listener.py", line 74, in <module> from crewai.events.types.system_events import SignalEvent, on_signal File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\types\system_events.py", line 17, in <module> class SignalType(IntEnum): ...<6 lines>... SIGCONT = signal.SIGCONT File "C:\Project\3_FUND_MANAGER_AGENT\.venv\Lib\site-packages\crewai\events\types\system_events.py", line 22, in SignalType SIGHUP = signal.SIGHUP ^^^^^^^^^^^^^AttributeError: module 'signal' has no attribute 'SIGHUP'
-
해결됨한 입 크기로 잘라먹는 타입스크립트(TypeScript)
인터페이스 문법이 있는데 타입 별칭 문법은 왜 있나요?
강의를 들어보면 인터페이스 문법이 타입 별칭 문법의 상위호환인 것처럼 설명해주시는데, 그럼 타입 별칭은 어디에 왜 쓰나요?간단하게 정의하기 위해서 사용하는건가요?
-
미해결스프링 부트 웹 개발 입문 - 따라하며 배우기
마이바티스 환경설정 조회하기 강의 부분에서 메뉴부분에러
2025-12-17 11:51:45.686 ERROR 15916 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.boot.sailing.v1.dao.MenuDao.doList] with root causeorg.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.boot.sailing.v1.dao.MenuDao.doList at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:229) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:96) ~[mybatis-3.5.13.jar:3.5.13] at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) ~[na:1.8.0_352] at org.apache.ibatis.util.MapUtil.computeIfAbsent(MapUtil.java:36) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94) ~[mybatis-3.5.13.jar:3.5.13] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) ~[mybatis-3.5.13.jar:3.5.13] at com.sun.proxy.$Proxy64.doList(Unknown Source) ~[na:na] at com.boot.sailing.v1.service.MenuSvc.doList(MenuSvc.java:25) ~[main/:na] at com.boot.sailing.v1.controller.MenuCon.doMenu(MenuCon.java:24) ~[main/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_352] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_352] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_352] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_352] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.24.jar:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:670) ~[tomcat-embed-core-9.0.70.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.24.jar:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.70.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.70.jar:9.0.70] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.70.jar:9.0.70] at java.lang.Thread.run(Thread.java:750) [na:1.8.0_352]
-
미해결클로드 코드 완벽 마스터: AI 개발 워크플로우 기초부터 실전까지 (with 커서 AI)
Pro 요금제 토큰(사용량) 차감 룰 ??
제가 /usage를 쳐보니Settings: Status Config Usage (tab to cycle)Current session▌ 1% usedResets 3:59pm (Asia/Seoul)Current week (all models)█ 2% usedResets Dec 23, 4:59pm (Asia/Seoul)Extra usageExtra usage not enabled • /extra-usage to enable이렇게 나오더라구요.Current Session은 5시간 단위Current week는 1주 단위 인 듯 한데요.세션 기준과 위크 기준을 꽉꽉채워 계속 쓸 수 있는 건지, 총액이 정해져 있는 건지 모르겠어요.pro와 max 차이는 각 세션과 위크마다 사용량이 다른건지..사용량에 대한 정확한 이해가 없으니 질문도 뭉툭합니다. 그리고 실습에도 소극적이게 되네요.
-
해결됨[노베이스/입문] C++ 스파르타 클래스
한글을 너무 많이 쓰시는것 같아요ㅠ
한글이 너무 과도하게 많이 사용되는것 같아요 강사님...ㅠ 처음에는 한글로 묘사해서 이해에 도움이 되는 부분도 있지만, 어떤 부분은 너무 헷갈리는 부분도 발생하는것 같아요..
-
해결됨수익형 AI Agent n8n 전문가 강의, 블로그·쇼츠 자동화
워드프레스 관련
워드프레스 접속하면 아래와 같은 문구가 상단에 뜹니다Deprecated: 함수 WP_Dependencies->add_data()이(가) 6.9.0 버전 이후로 폐기예정인 인수로 호출됐습니다. IE 조건부 주석은 지원되는 모든 브라우저에서 무시됩니다. in /var/www/html/wp-includes/functions.php on line 6131이건 어떻게 해야 하나요?
-
미해결토비의 스프링 6 - 이해와 원리
수업을 잘 듣고 있습니다.
혹시 지금 강의하시는 내용 중애notion의 내용을 받아 볼 수는 없을까 해서요.
-
미해결파이썬 주식 매매 봇으로 주식시장 자동사냥하기
5.2.2 강의의 사운드만 조금 작은것 같네요
5.3.2도 5.4.2도 5.5.2도 작네요 실습하고 이론 동영상 분리하면서 사운드가 작아진건지이건 나중에 강의 만드실때 반영해서 해주셨으면 좋겠습니다
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
LangChain과 LangGraph v1
안녕하세요강의 잘 듣고 있습니다!최근에 LangChain, LangGraph의 v1이 정식으로 릴리즈 되었는데, 이번 업데이트에 대해 어떻게 대하면 좋을지 궁금해서 질문드립니다.이번 v1은 이전 버전들에 비해 그래프 구현 측면에서 얼마나 큰 변화가 있다고 생각하시나요?강의에서 배운 기존 설계 방식 그대로 프로젝트를 진행해도 괜찮을지, 아니면 v1에서 새로 나온 기능들 위주로 마이그레이션을 진행하는 게 맞을지 강사님의 의견이 궁금합니다.답변 주시면 앞으로 공부하는 데 도움이 될 것 같습니다.감사합니다!
-
미해결절대강좌! 유니티6 - 네트워크 게임 개발 마스터클래스 (Part3) : Netcode로 개발하는 2D RPG
캐릭터 중복 생성 문제
안녕하세요. 질문이 있습니다! 에디터에서만 플레이 했고, 다음과같은 순서로 플레이하면 캐릭터가 중복해서 생성되는 문제가 있는데 어떻게 해야되는지 궁금하네요.Lobby 씬에서 Create Session으로 세션 생성Start Session으로 Level01 씬 이동Exit 로 Lobby 씬으로 이동다시 Lobby 씬에서 Create Session으로 세션 생성아직 Level 01로 넘어가지 않았는데 플레이어 캐릭터가 Lobby 씬에서 생성됩니다.여기서 Start Session으로 Level01 씬으로 이동하면 새로운 캐릭터가 생성되서 2개의 캐릭터가 생성됨을 확인했습니다.따로 Lobby 씬으로 돌아갈 때 정리해줘야하는게 있을까요?
-
해결됨홍정모의 따라하며 배우는 C언어
11.7 함수를 구현해 봤습니다.
void swap(int* xp, int* yp) { const int tmp = *xp; *xp = *yp; *yp = tmp; }void printArray(int arr[], int size) { for (int i = 0; i < size; i++) printf("%d ", arr[i]); }void selectionSort(int arr[], int n) { int* arr_ptr = arr; for (int i = 0, min_index = 0; i < n - 1; i++) { for (int j = i; j < n; j++) { if (*(arr_ptr + min_index) > *(arr_ptr + j)) min_index = j; } swap(arr_ptr + i, arr_ptr + min_index); } }
-
미해결3일 만에 끝내는 백엔드 면접 핵심 압축 공략집 [네카라쿠배당토]
강의 1-4 QnA 관련 질문이 있습니다
1분30초 ~ 2분 쯤에 말씀해 주시기를 "부하를 100만건을 받는 가상 환경에서", "카프카가 100% 이득인 상황은 언제지?" 등의 긍정적인 예시를 들어주셨습니다. 하지만 면접관의 입장에서 "왜 부하를 100만건 받는 가상 환경을 만드셨나요?" "실제 트래픽이 얼마정도 였길래 100만 건의 부하 테스트를 하신건가요?", "현실적인 목표에 부합하는 부하 테스트를 하신 게 맞을까요?"등의 질문을 할 수 있지 않나요? 그럼 결국에 "학습 목적으로 사용한 kafka = 학습 목적으로 구성한 100만건의 부하 환경"이 된다고 생각합니다.즉 100만건의 부하를 받는 가상 환경을 만든 당위성이 없다고 생각합니다. 그럼 결국 당위성이 만들어지기 위해서는 꽤 많은 유저 트래픽을 받고 있는 사이드 프로젝트를 만들어야 하지 않나 생각이 들어서 질문드립니다.
-
미해결[임베디드 입문용] 임베디드 개발은 실제로 이렇게 해요.
Nucleo 보드로 대체
안녕하세요, 혹시 Nucleo 보드가 있다면, ST link와 STM32F103C8T6를 대체해서 강의를 수강할 수 있을까요?
-
미해결실무자를 위한 구글애널리틱스(GA4+GTM) 활용법(25년 Update)
59.세션_개요 강의 세션수 집계 방법 질문
안녕하세요.<59.세션_개요> 강의에서 아래 예시 1)의 경우 세션 1로 집계된다고 설명해주셨는데혹시 예시 2)와 같이 재방문 경로가 Direct가 아닌 경우는 세션 2로 집계되는지 궁금합니다.감사합니다. 예시 1) 11:50 pm Naver/cpc로 유입 > 11:55pm 주소창 입력 후 사이트 재방문예시 2) 11:50 pm Naver/cpc로 유입 > 11:55pm google/organic 으로 재방문
-
미해결모던 안드로이드 - Jetpack Compose 입문
ViewModel 사용 관련 질문
안녕하세요, 비만도 계산기 강의를 수강하면서 코드를 작성하고 말씀하신 내용들을 학습했는데요."bmi state를 통해 bmi값이 변경되면 설정한 콜백이 동작하며 결과화면이 recomposition되고, 네비게이션 컨트롤러로 해당 화면으로 이동한다" 라고 이해했는데요,navController.navigate("result")가 수행되면composable(route = Screen.Result.route) { ResultScreen( bmi = viewModel.bmi.value, onBackClick = { navController.popBackStack() } ) }부분이 실행되기 때문에 bmi가 State가 아니고 지역변수여도 원하는 화면이 나올것이라고 생각해서 코드를 변경했는데 실제로 기존과 동일하게 잘 동작하는것을 확인하였습니다. 본 강의에서는 지역변수를 활용해서도 동작이 되지만, UI와 로직을 분리하는 장점이 있으며 ViewModel이 많이 사용되니 사용하신것으로 이해하면 될까요?아래는 지역변수로 변경한 코드입니다package com.example.obesitymachine import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import kotlin.math.pow sealed class Screen(val route: String) { data object Home : Screen("home") data object Result: Screen("result") } class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { val navController = rememberNavController() var bmi = 0.0 NavHost(navController = navController, startDestination = Screen.Home.route) { composable(route = Screen.Home.route) { HomeScreen( onResultClick = {height, weight -> bmi = bmiCalculate(height, weight) navController.navigate(Screen.Result.route) } ) } composable(route = Screen.Result.route) { ResultScreen( bmi = bmi, onBackClick = { navController.popBackStack() } ) } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( modifier: Modifier = Modifier, onResultClick: (height: Double, weight: Double) -> Unit ) { val (height, setHeight) = rememberSaveable { mutableStateOf("") } val (weight, setWeight) = rememberSaveable { mutableStateOf("") } Scaffold( topBar = { TopAppBar( title = { Text("비만도 측정기") } ) } ) { Box( modifier.padding(it) ) { Column( modifier .fillMaxSize() .padding(8.dp) ) { OutlinedTextField( value = height, onValueChange = setHeight, label = { Text("키") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), modifier = Modifier.fillMaxWidth() ) OutlinedTextField( value = weight, onValueChange = setWeight, label = { Text("몸무게") }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number ), modifier = Modifier.fillMaxWidth() ) Button( modifier = Modifier.align(Alignment.End), onClick = { onResultClick(height.toDouble(), weight.toDouble()) } ) { Text("결과") } } } } } @OptIn(ExperimentalMaterial3Api::class) @Composable fun ResultScreen( bmi: Double, onBackClick: () -> Unit ) { val text = when { bmi > 25 -> "과체중" bmi > 18.5 -> "정상" else -> "저체중" } val icon = when { bmi > 25 -> R.drawable.baseline_sentiment_very_dissatisfied_24 bmi > 18.5 -> R.drawable.baseline_sentiment_satisfied_24 else -> R.drawable.baseline_sentiment_dissatisfied_24 } Scaffold( topBar = { TopAppBar( title = { Text("비만도 측정기") }, navigationIcon = { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null, modifier = Modifier.clickable(onClick = onBackClick) ) } ) } ) { Box( modifier = Modifier.padding(it) ) { Column( modifier = Modifier .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(text, fontSize = 30.sp) Spacer(modifier = Modifier.height(50.dp)) Image( painter = painterResource(id = icon), contentDescription = null, modifier = Modifier.size(100.dp), colorFilter = ColorFilter.tint( color = Color.Black ) ) } } } } fun bmiCalculate( height: Double, weight: Double ): Double { return weight / (height / 100).pow(2.0) }감사합니다!
-
미해결홍정모의 따라하며 배우는 C++
cstr직접구현
피드백 부탁드립니다.
-
해결됨비전공자도 이해할 수 있는 Docker 입문/실전
현업에서 MySQL은 RDS와 도커 볼륨 중 어떤 걸 사용하나요?
아니면 MySQL을 사용할 때 도커와 RDS를 조합해서 사용할 수도 있나요? 현업에서 어떤 식으로 사용하는지 궁금합니다.
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
실습을 따라하는데 데이터베이스가 보이지 않아요
강의 내용에 실습 영역을 따라 스크립트를 작성하였는데 데이터베이스가 보여지지 않습니다.맥, 윈도우 모두 동일한 상태라 별도로 db를 다운받아 워크벤치 넣어야되는 것인지 문의 드립니다. - 강의 영상에 대한 질문이 있으시면, 상세히 문의를 작성해주시면, 주말/휴일 제외, 2~3일 내에 답변드립니다 (이외의 문의는 평생 강의이므로 양해를 부탁드립니다.)- 강의 답변이 도움이 안되셨다면, dream@fun-coding.org 로 메일 주시면 24시간 내에 재검토하겠습니다.- 괜찮으시면 질문전에 챗GPT 와 구글 검색을 꼭 활용해보세요~- 잠깐! 인프런 서비스 운영(다운로드 방법포함) 관련 문의는 1:1 문의하기를 이용해주세요.