묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
속도감..
조금.. 빠른감이 있네여.. ㅠㅠㅎ
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
API전환하기 테스트에서
자바 1.8만 설치되어 있어 해당 버전으로 실습중에 있는데요ProductApiTest > 상품등록() > API 요청final AddProductRequest request = 상품등록요청_생성(); // API 요청 final ExtractableResponse<Response> response = RestAssured.given().log().all() .contentType(MediaType.APPLICATION_JSON_VALUE) .body(request) .when() .post("/products") .then() .log().all().extract();위 코드에서 request는 java class object인데 json으로 type변환 없이 전송이 잘 되네요.저 같은 경우 serialize exception이 발생하면서 테스트가 진행되지 않습니다. ㅠ버전에 따른 차이일까요?com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.productorderservice.product.AddProductRequest and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300) at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:46) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:29) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:3160) at com.fasterxml.jackson.databind.ObjectMapper$writeValue.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148) at io.restassured.internal.mapping.Jackson2Mapper.serialize(Jackson2Mapper.groovy:53) at io.restassured.internal.mapping.Jackson2Mapper.serialize(Jackson2Mapper.groovy) at io.restassured.mapper.ObjectMapper$serialize.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139) at io.restassured.internal.mapping.ObjectMapping.serializeWithJackson2(ObjectMapping.groovy:209) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:149) at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:100) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:240) at io.restassured.internal.mapping.ObjectMapping.serialize(ObjectMapping.groovy:150) at io.restassured.internal.mapping.ObjectMapping$serialize.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at io.restassured.internal.RequestSpecificationImpl.body(RequestSpecificationImpl.groovy:753) at com.example.productorderservice.product.ProductApiTest.상품등록(ProductApiTest.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:84) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
.ast
안녕하세요 강사님테스트하실 때 .ast를 활용하여 assertThat()을 활성화하시던데 방법을 알 수 있을까요?postfix 를 활용하시는 것 같은데 어떻게 하는지 정확히 궁금합니다!
-
해결됨실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
API 테스트로 전환하기 영상에서..
4:40에.. extends ApiTest 하면서 SpringBootTest 어노테이션을 지웁니다! 에러를 계속 마주치다가 간신히 찾았군요..
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
재밌게 잘 보고있습니다.
1배속이지만 다른강의 2배속 느낌이네요.. 이게 실무인가 싶기도 하고 ㅎ_ㅎ 특정 메서드를 만들면, throw new 이후 나오는 건 따로 설정을 하신거려나요?
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
테스트 코드 작성할 때 이미 작성했던 코드 어떻게 나오게 해서 선택하시나요?
테스트 코드Assert.isTrue 작성할 때 이미 작성했던 코드가 나와서 선택만 해주시던데 어떻게 나오게 해서 선택하시나요? 플러그인이나 어떤 옵션이 있으신가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
공부 중에 궁금한게 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]백이 뷰 템플릿을 활용해서 뷰 렌더링을 해주는 경우가 요즘도 프로젝트를 진행할 때 많나요 ? 대부분 HTTP(REST) API로 데이터 전송으로 프론트랑 주고 받는 것인지, 아니면 웹 퍼블리셔 요청대로 동적 html 부분도 서버가 만드는 경우가 흔한건지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api 작성중에 enum type 문의 드립니다.
이전 jpa활용 1편에서 작성했던 부분들을 api로 변경을 진행중입니다. 다른 부분들은 잘 진행되고있지만java 기초가 부족해서 enum으로 만든 OrderStatus부분을 어떻게 처리해야될지 감이 잡히질 않아 문의드립니다.처음 주문 내역페이지를 호출 할 때 주문상태(OrderStatus) 부분을 api로 받아 select 구성을 해야합니다. 이 때 enum을 배열로 변환(?)해서 넘기는게 맞는 방법일까요? 조회시 주문상태(OrderStatus)와 회원이름을 form으로 넘길때 Controller에서는 @RequestBody OrderSearch로 받으며 주문상태는 OrderStatus로 선언되어있습니다. 자동 맵핑이 안되는거같은데 enum type을 request로 어떻게 받아야하는지 궁금합니다. 질문이 잘 전달되었을지 모르겠지만 답변부탁드리겠습니다.감사합니다.
-
미해결Django REST Framework 핵심사항
앱을 구성할 때 api 앱과 blog 앱을 나누어서 구성하는 이유가 궁금합니다ㅜ
rest를 사용한 api2 앱이든 rest를 사용하지않은 api 앱이든 blog앱과 따로 만들어서 사용하는 이유가 무엇인가요?
-
미해결스프링 시큐리티 OAuth2
restfual api 개발할때
안녕하세요 선생님. 지금가지 선생님의 강의를 바탕으로 oauth 를 사용하는 프로젝트를 구축하는데 있어 궁금점이 생겨 질문드립니다.소셜로그인 인증 챕터 부분에서는 전형적인 session 인증 방식인데 restful api 서버 개발시에는 어떻게 설정해야할까요? 대안으로 찾아본바 successHandler 를 커스텀하게 설정하여 jwt 로 암호화해서 서버 api로 리다이렉트 시 쿼리파라미터에 jwt를 넣어 프론트에게 jwt 를 전달하는데 이 방식이 맞나요?또한 강의에서 restfual api 에 대해 다루신다면 어느 챕터에서 확인할 수 있을까요?
-
미해결
React에서 오픈API 사용 시 CORS 에러
안녕하세요.과제로 공공데이터 오픈API를 사용해서 웹을 하나 만들게 되었습니다.api에서 자료를 받아오는 과정에서 cors에러가 발생해 해결하려다가 결국 혼자서 해결이 안되어 질문 드립니다. package.json에 { ... "proxy": "http://openapi.molit.go.kr" ... }를 작성하고 실행했을 때이런 에러코드가 발생하며 npm start가 진행되지 않습니다.터미널에서 npm install http-proxy-middleware 설치 후/src/setupProxy.js file 생성, 다음과 같이 코드 작성npm start 시 접속이 불가능도대체 어떻게 해야 cors에러를 해결가능할까요...아무리 찾아봐도 이 두가지 방법밖에 안나오는데 두가지 다 적용이 안되니 답답해 죽겠습니다..
-
미해결비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
Axios로 API요청할때 url주소
아래 코드에서 url: `http://localhost:3000/restaurants?category=${param}`, 인데, 이 url은 어디서 확인 가능한걸까요? 제가 /restaurants이 부분을 다른 param으로 정한 것 같애서요! async function getData(category){ let param = category; if (!param) { param = ""; } const dataSet = await({ method: "get", url: `http://localhost:3000/restaurants?category=${param}`, headers:{}, data: {}, }); console.log(dataSet) }
-
미해결Vue.js 시작하기 - Age of Vue.js
V-calendar api 질문드립니다!
안녕하세요 좋은 강의 감사합니다! 제가 2주전부터 v-calendar를 통해서 달력 만들기 작업을 하고있는데요 생성은 그냥 v-calendar 인스톨하고 테그 불러오면되는데 다음 2가지가 동작하지를 않습니다. 1.클릭한날짜의 배경을 파란색으로 하이라이트 해주고싶은데 인터넷에 있는 어떤 소스를 갖다써도 1도 변함이없습니다 ->동료분은 api 해제코드 입력하고 고치는 경우도 있다는데 v-calendar의 해제코드가 있나요 아니면 다른 방법이있을까요? 2. 주말 및 공휴일 등의 날자를 선택하지 못하도록 하고싶습니다 disabled 같은거를 넣고싶은데 혹시 그런기능은 어떻게 구현해야할까요 이것도 api해제코드가 필요할까요? 스승님의 도움을 구합니다 ㅠ
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
현업에서 User의 키값을 고객에게 넘길때...
안녕하세요, 영한님, 서포터즈 님들! 요새 API 스펙에 대해 고민을 많이 하고 있는데요! 예를들어 email을 ID로 로그인하는 User 도메인(엔티티)이 있다고 가정할게요! 실제 db상의 key는 다른 값을 가지고 있습니다! (auto_increment) 유저 목록을 반환할때 유저의 식별자로 db의 키값을, 아니면 email 을 반환하는게 좋을까요?? db의 키값 (auto_increment)를 클라이언트가 알아도 괜찮은건가 싶어서 문의드려요! (이경우 db의 key 내부구현이 드러나는게 아닌가 합니다... )
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
API 공용데이터를 활용해서 제작하는 방법 문의드립니다!
안녕하세요 강사님! 강의 잘 듣고 있습니다,,!컨텐츠 리스트 만들기 - RecyclerView1 파트 강의에서는저희가 임의로 drawable에 이미지를 넣고, 그 이미지를 눌렀을 때, 해당 정보가 나오도록 했는데요,,이를 공용데이터로 받아서 이미지를 눌렀을 때, 해당 정보가 나오도록 하는 방법은 어떻게 하면 좋을까요?우선, postman 구글 확장 프로그램을 통해 API를 xml데이터로 변환하기는 했는데, 이를 어떻게 가져오고 어떻게 뿌리는지 구글링을 해봐도 마땅한 답안이 없네요 ㅠ힌트좀 주시면 감사하겠습니다..!
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
환경변수를 통한 API HOST 지정 후 생기는 에러 관련 질문드립니다.
강사님 안녕하세요.. 좋은 강의를 제공해주심에 감사드립니다. 다름이 아니라, 섹션 11의 환경변수를 통한 API HOST 지정 강의를 따라하며 기존 localhost:8000 의 주소들을 .env 파일을 만들어 REACT_APP_API_HOST="http://localhost:8000" 를 설정해주고 api.js , Constants.js 로 빼내어서 지정하고 개발 서버를 다시 실행했는데요.. 그 뒤로 이렇게 웹 화면이 뜨지 않는 상황이 발생했습니다. (네트워크 탭에서 api 들이 200 상태로 뜨는데 크기가 0B로 나타나는 것을 보게 되었습니다.) 어떤 점이 오류일 지 ... 고쳐야 하는 부분의 감이 잘 안잡히는 것 같습니다. 답변주시면 대단히 감사하겠습니다...!
-
해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
fetch 질문
안녕하세요 3:45에 fetch then대신 try catch로 바꿔 봤는데 이렇게 사용하면 될까요? const getData = async () => { try { const response = await (await fetch(`https://jsonplaceholder.typicode.com/comments`)).json(); console.log(response); } catch (err) { console.log(err); } };
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
API서버에서 일반 컨트롤러의 역할을 잘 모르곘습니다!
백엔드에서 api를 개발하고 프론트엔드에게 제공하면 @RestController가 아닌 일반 @Controller는 단순히 클라이언트에게 html파일만 건네주는 용도쓰면 되는건가요??
-
미해결Flutter 응용 - 공공 API를 활용한 앱 만들기 (MVVM 패턴)
api오류
실제 프로젝트로 만들려고 생각하고있는데 이 api는 이제 못쓰는건가요??? 수원시좌표 넣어도 서울시가 뜨던데 이제 사용못하는게 맞다면 다른 마스크 재고확인 api는 어디서 구할수있나요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
실습 중 POST 의 경우에 에러 메세지가 출력됩니다
강사님 안녕하세요~~~ 다름이 아니라, 뒷 부분 실습을 따라서 진행하던 중에 첨부드린 사진과 같이 http --auth user2:1234 http://localhost:8000/post/1/ 는 잘 실행되는데 http --auth user2:1234 http://localhost:8000/post/1/ http --auth user2:1234 POST http://localhost:8000/ message="user 2가 생성하는 첫번째 포스팅" 이렇게 POST를 하면 에러가 발생을 하는 것을 볼 수 있었습니다. ...중략 (아주 긴 에러 메세지가 등장합니다.) 문제의 원인이 무엇인지 잘 모르겠어서 이렇게 질문을 남겨드립니다. ㅠㅠ !! 혹 강사님께서 보이시는 문제점을 알려주시면 감사할 것 같습니다. 그럼 정말 감사합니다.