앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
6:09 쯤에 UIView 에 대해서 Add New Contraints 하실때 따라해보면 Top alignment 가 맞지않는게 좀 다르게 설정이 되는것 같습니다. Inspector 패널에서 확인해보면 Top Alignment Constraint 가 First Item : View.top Second Item : Safe Area.top 이런식으로 적용되고있는데요. 이부분 설정을 어떻게해야 강의에 나오는것 처럼 수직정렬이 반듯하게 적용이 되는걸까요?
// 컨트롤러 메서드 @DeleteMapping("/plan/{no}") public ResponseEntity<Map<String, Object>> removePlan(@PathVariable(value = "no") int no){ Map<String, Object> resultMap = plannerService.removePlan(no); return ResponseEntity.ok(resultMap); } // 서비스 메서드 @Transactional public Map<String, Object> removePlan(int no) { System.out.println("no :" + no); log.info("removePlan"); Map<String, Object> resultMap = new HashMap<>(); int result = plannerRepository.deleteByPlanNo(no); if(result > PLAN_DELETE_FAIL){ log.info("REMOVE PLAN SUCCESS"); }else{ log.info("REMOVE PLAN FAIL"); } resultMap.put("result", result); return resultMap; } // 레퍼지토리 메서드 int deleteByPlanNo(int planNo); // 삭제된 행의 개수 첫번째 질문 위 코드처럼 작성을 하고 delete 버튼을 클릭하면 2025-12-21 20:36:32 ERROR [[dispatcherServlet]] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.ClassCastException: class com.office .calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer ( com.office .calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap')] with root cause java.lang.ClassCastException: class com.office .calendar.planner.jpa.PlannerEntity cannot be cast to class java.lang.Integer ( com.office .calendar.planner.jpa.PlannerEntity is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @34790124; java.lang.Integer is in module java.base of loader 'bootstrap') at jdk.proxy4/jdk.proxy4.$Proxy153.deleteByPlanNo(Unknown Source) ~[?:?] at com.office .calendar.planner.PlannerService.removePlan(PlannerService.java:124) ~[main/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.aop.support .AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) ~[spring-tx-6.2.11.jar:6.2.11] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.2.11.jar:6.2.11] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.2.11.jar:6.2.11] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) ~[spring-aop-6.2.11.jar:6.2.11] at com.office .calendar.planner.PlannerService$$SpringCGLIB$$0.removePlan(<generated>) ~[main/:?] at com.office .calendar.planner.PlannerController.removePlan(PlannerController.java:123) ~[main/:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.springframework.web.method.support .InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.11.jar:6.2.11] at org.springframework.web.method.support .InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.11.jar:6.2.11] at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936) ~[spring-webmvc-6.2.11.jar:6.2.11] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596) ~[tomcat-embed-core-10.1.46.jar:6.0] at ... 위 예외가 발생하면서 planner_fetch.js의 fetchRemovePlan 함수에서 catch 문에 걸리면서 alert('일정 삭제 중 오류가 발생했습니다.'); 이 실행됩니다. 서비스에서 deleteByPlanNo를 호출할 때 문제가 발생한 것 같은데 찾아보니 레퍼지토리 메서드에 @Modifying을 붙여보라고 해서 해봤는데 해결은 안됐습니다. 어떤 원인으로 위 같은 예외가 발생한거고, 어떻게 해결할 수 있는지 질문드립니다. 두번째 질문 이전 질문에서 <script src="planner_fetch.js"></script> <script src="planner.js"></script> 위 코드는 브라우저에서 다음과 같이 처리됩니다. 1. planner_fetch.js를 읽고 실행 2. 그 다음 planner.js를 읽고 실행 3. 이 두 파일은 각각 다른 파일이지만, 브라우저에서는 하나의 JavaScript 실행 공간에서 실행 결과적으로 파일이 나뉘어 있어도 "같은 공간"에서 실행되기 때문에 서로의 전역 변수, 함수 등을 공유할 수 있습니다. 하나 더 중요한 사실이 있는데요, 로딩 순서가 중요합니다. <script src="planner_fetch.js"></script> <script src="planner.js"></script> 위와 같은 순서라면, planner_fetch.js가 먼저 실행되고 planner.js에서 planner_fetch.js 안의 함수를 사용할 수 있습니다. 하지만, 로딩 순서를 변경하면 <script src="planner.js"></script> <script src="planner_fetch.js"></script> 다음과 같은 에러가 발생할 수 있습니다. fetchPlans(); // 에러 (아직 정의되지 않음) 즉, 먼저 로드 된 파일의 함수만 사용할 수 있습니다. 이렇게 답변을 주셨는데 추가적으로 궁금한 점은 planner.js가 나중에 로드 되어서 planner.js에 있는 함수나 변수를 planner_fetch.js에서 사용하면 정의 되지 않아서 사용을 못해야 할텐데 코드에서는 planner.js에 있는 showDetailPlanView 함수라든지 current_year같은 변수를 사용하고 있는데 에러가 발생하지 않습니다. 이 부분 질문드립니다.
3 분 1초에 레이아웃 그리드 만들때 프레임을 그냥 새로 만들어서 한건가요? 똑같이 따라했는데 분홍색 배경이 안 만들어지는데요 가운데 컬럼 그냥 얇게 하나만 나타나고요 UI 도 너무 다르고 예제 파일도 업데이트 다운받았느데 그냥 다 다르고 제대로 확인하시는 지도 궁금하네요 그냥 뭔 설명없이 화면도 그냥 넘겨버리시고 실습으로 따라하기 매우 힘든 영상입니다.
안녕하세요. 강의 잘 듣고 있습니다. 강의 수강하면서 질문이 하나 있는데요. 지금 제 상황은 1차적으로 출처를 각주에 적지 않음 그냥 본문뒤에 (출처:)를 적는 식으로 통일함 예시) 한글 공부가 너무 어렵네요 (출처: 내 머릿속) 이제 최종적으로 "(출처:" 로 시작해서 ")"로 끝나는 모든 문장을 각주로 넣고 싶음 입니다. 그러면 생각나는 아이디어로는 "(출처:" 로 시작해서 ")"로 끝나는 문장마다 해당 지점에서 각주를 추가하고 복사 후 원래 문장은 지우는 방식으로 반복을 해야 할 것 같은데요. 그런데 혼자 씨름해봐도 쉽지가 않네요. 혹시 어떤 함수를 사용해야할지 도움 주시면 감사하겠습니다. 완벽한 코드가 아니더라도, 어떻게 사용할지 아이디어라도 주시면 제가 해결하겠습니다! 제가 필요한 부분만 수강중인지라, 제목에서 저와 상관없다고 하는 기능은 안 들어서 혹시 설명해주신 강의가 있다면 제목 말씀해주시면 수강하겠습니다.
toggleTodo = useCallback( ( id : number) => { <-- 여기 이 지점에 todos 라는 state 값이 필요한 상황 ( 체크 로직 등등.. ) setTodos( (todos) => todos.map( (todo) => todo.id === id ? { ...todo, completed: !todo.completed } : todo ); }, []); 위 부분에 todos 의 state 값이 필요하게 되면 의존성 배열에 todos 를 넣어줘야 될꺼 같은데요. 이렇게 되면 React.memo 에 의해 전달될 toggleTodo props 도 변경되게 될것으로 예측 되고 결국 자식 컴포넌트들이 리렌더링이 계속 발생되지 않을까 싶은데요. 위 부분에 todos 의 state 값이 필요하게 될 경우에는 어떻게 처리를 해줘야 될까요?
CGV 앱으로 영화 예매하면서 “좌석 고르기 은근 헷갈린다…” “영화 바꾸면 다시 다 골라야 해서 귀찮다…” 이런 생각 한 번이라도 해보셨다면, 설문 참여 한 번 부탁드립니다 🙏 본 설문은 CGV 앱 영화 예매 경험을 주제로 한 비공식 UX 리서치 입니다. 영화 선택 이후 예매 과정에서의 사용 경험(좌석 선택, 반복 선택 등)을 중심으로 실제 어떤 부분이 불편하게 느껴지는지 알아보고자 합니다. 🗓 설문 정보 기간 : 2025.12.20 ~ 2025.12.25 소요 시간 : 약 7–10분 대상 : CGV 앱으로 영화 예매해본 분들 설문은 익명으로 진행 되며, 응답은 리서치 목적 외 사용되지 않고 분석 후 폐기 됩니다. 🎁 참여하면 뭐가 있나요? 설문 완료자 중 랜덤 추첨으로 경품 드려요! ☕ 스타벅스 커피 쿠폰 3매 → 3명 🐔 응답자 100명 넘으면 교촌 치킨 쿠폰 1매 → 1명 추가! 잠깐만 시간 내주셔도 큰 도움이 됩니다 🙇 CGV 앱 써보신 분들 많은 참여 부탁드려요! 👉 설문 링크: https://forms.gle/LzSAhCA6aqhsKSxm7
짝대기 두개 쓰셨는데 이게 키보드에서 뭐를 눌러야 나오는거죠? /,\,=,_,-,+,등등 대부분은 알겠는데 [대문자 I{아이}]인걸까요? if(bmi > 60 II 이부분이요 모든 강의를 마치고 혼자 나만의 게임을 만들 때 발생하는 문제점, 강의를 진행하면서 발생하는 의문점 모두 질문하셔도 좋습니다. 새벽, 아침 모두 상관없이 남겨주시면 시간될 때 전부 답장해드리겠습니다! 인프런 Q&A도 되고 인스타그램 dm, gmail 등 어떤 매체든 상관없습니다. 부담없이 질문해주셔도 되지만, 아무래도 AI와 구글링 이후 질문해주시면 감사할 것 같습니다!
깊이있는 내용 쉽게 전달해주셔서 감사합니다. 업스트림 10:00근처 공부하다가, 그냥 test branch를 그전에 하던대로 -u옵션 없이 push 해버리면, 어쨌든 리모트에 생기면서, 동시에 거꾸로 origin/test 트래킹브랜치를 만들테고, (여기까지 맞나요?) 그러면 저절로 로컬의 test브랜치와 트래킹 브랜치연결이 되는것 아닌가...요? 아니면 -u옵션이 빠져서, 업로드/다운로드 동시에 실행되고 트래킹브랜치까지도 만들어지는데, test와 origin/test사이의 업스트림 연결만 빠지게 되는건가요?