안녕하세요! 환경세팅부분에서 계속막히는데요 ,,저는 yarn 설치 시 yarn lock 이 생성되지 않아 touch lock으로 생성하였습니다. 그 후 client 폴더에서 sass와 axios webpack을 설치하려 하니 다음과 같이 뜹니다. 어느 파일에 무얼 추가하면 될까요? 하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요. 강의 너무 잘 보고 있습니다. 좋은 컨텐츠를 제공해주시는 인프런과 영한님, 서포터분들께 감사드립니다. api응답 객체 네이밍에 대해 질문이 있습니다. 등록,수정의 경우 응답객체 네이밍이 ~~Response 조회의 경우 MemberDTO 를 Result로 래핑해서 보내는데 DTO와 Response로 네이밍하는 기준이 있는지 궁금합니다. 또 하나는, 좀 엉뚱한 질문일 수도 있는데 응답시마다 new를 통해 응답객체를 생성하는데 대규모 시스템에 성능에 크게 문제가 없는지와 응답 객체를 싱글톤으로 만드는 패턴같은것도 있는지 궁금합니다. 감사합니다.
안녕하세요 강사님! 덕분에 수업 잘 듣고있습니다. 스프링 통합 테스트 강의에서, 테스트 코드의 join함수를 실행시켰더니 java.lang.IllegalStateException: java.sql.SQLException: Connection is closed 에러가 발생했습니다. 원인파악을 위해 join함수 처음부터 천천히 디버깅을 시도했는데, JdbcMemberRepository 클래스의 save함수에서 try 구문의 conn을 할당받는 첫번째 pstmt변수에서 IllegalStateException을 발생시켰습니다. 어떤 원인으로 에러가 발생했으며, 해결방법이 궁금합니다. 아래에 제가 작성한 오류와 연관된 코드들과 에러메시지 첨부합니다. *close함수에서 conn.close()를 close(conn)으로 수정했더니 해결됐습니다. [테스트코드] [JdbcMemberRepository 클래스] [MemberService 클래스] [에러메시지]
안녕하세요 강의 잘보고 있습니다! DB 관련해서 제가 몇가지 궁금한게 있는데 1. 예를 들어 하나의 테이블에서 다 대 다일때 즉 user 와 user에 다대다 일때 중간테이블 follow를 만들어주지 않고 한 User 테이블에 컬럼을 늘리는건 별로 안좋은 방식인가요? 예를 들어서 follow 테이블을 만들지 않고 User 테이블안에 팔로우, 팔로잉 수 컬럼을 넣는 방식 2. 다 대 다 관계일시 중간테이블 관련 다 대 다 관계일시 데이터베이스 이론적으로는 중간테이블을 만드는걸로 저도 배우긴 했는데 근데 이게 프로그래밍 관점에서 테이블을 너무 많이 늘리고 join이 많아질시 성능이 안좋다고 배웠던 기억이 있어서요 그래서 이게 실무에서도 다대다일시 중간테이블로 쪼개고 join을 자주 발생시키는지 궁금해요 로그인 같은경우에도 팔로우,잉,쓴글갯수를 유지하기 위해 로그인을 할때마다 post 테이블 follow 테이블 과의 3개의 테이블을 조인시켜서 select 하는 경우인데 과연 이런식의 3중조인을 로그인할때마다 해줘야 하는건가에 대한 생각 꼭 조인을 이렇게 많이해야 저 데이터를 가지고 올 수있나에 대한 DB설계에 대한 생각이 공존합니다. 아니면 제가 너무 오버하는 것일지 문제가 되지 않는 것인지... 그래서 실제로도 실무에서도 이런식으로 중간테이블과 db설계관련 또한 그걸로 인한 많은 join 관련해서 궁금하네요 ++ 제가 이런 생각이 든 이유가 게시판을 만들때 게시물 상세 페이지에 파일갯수랑, 댓글 갯수를 게시물 리스트에 명시해주는 로직을 짜다가 join 몇번해서 select 해서 가져와보자 했는데.. 다른분께서 이유는 말안하셨지만 join 그렇게 하지말라고 하셨거든요 그래서 그래서 게시물 DB에 갯수에 대한 컬럼을 늘려서 게시물 상세페이지 작성시 댓글, 파일 insert 할때 게시물 db에 갯수counting 해서 insert 하고 조인 없이 list 뿌려지는 형태로 바꿨거든요 그게 생각이나서요(insert 시 다른 db에는 count+1 insert 한 동작에 각 테이블의 2번의 insert 작업) 3. db 생성시 post.js user.js -> 실 테이블 posts, users 뒤에 s가 붙는데 이건 왜 붙는건 가요? 제가 실무 경험이 없어서 꼭 알고 싶은 포인트입니다.. ** 질문이 많은데 읽어주셔서 감사합니다.
안녕하세요! 강의를 다시 보다보니 제대로 이해한건지 확실히 하고 넘어가고 싶어서 글을 쓰게 되었습니다. Repository에서 interface로 선언한 것은 각 기능별로 저장할 때 어떤 타입? 으로 저장할지(list 등) 이며 이를 가지고 class에서 implements를 하여 실제 구현체를 만드는데 각 기능별로 저장한 값을 어떻게 반환할지 단순히 데이터의 저장을 위한 기능 Service에서는 앞서 Repository와 Domain에서 정한 것을 가지고 실제로 동작하는 기능(조건이 있다면 조건 로직, 검증을 해야한다면 검증 로직 포함)을 작성하는 것으로 이해했습니다. 실제 구현 할 때 Service 부분을이 아무래도 비즈니스 로직이다보니 해당 부분에서 오류가 발생한다면 전반적인 작동에도 문제가 생기겠죠?
안녕하세요 영한님. 강의 늘 잘 듣고 있습니다. 이번 강의를 듣던 중 Setter Injection 사용 지양에 대한 이유를 제가 제대로 이해하지 못해 질문 올립니다. Repository의 경우 런타임에 한 번 주입시켜놓으면 수정할 일이 없는데 굳이 그것을 Setter 메소드로 열어놓아 유지보수시 추적을 힘들게 할 필요 없다... 이런 느낌으로 이해했는데 맞는지 알고 싶습니다.
안녕하세요. 강의를 듣다 궁금하게 있어서 질문드립니다. 강의 중 for문을 돌려서 강제로 프록시를 초기화하는 부분이 있는데요. 제가 프록시 강의를 듣기로는 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태일 때는 프록시를 초기화하면 문제가 발생하는 것으로 알고 있습니다. 그리고 트랜잭션이 걸려있는 서비스단에 트랜잭션이 끝나면 영속성 컨텍스트가 끝나는 것으로 알고 있는데요. 현재 코드는 서비스가 아닌 Repository에서 바로 값을 가져오고 있고 해당 클래스는 트랜잭션이 걸려있지 않기 때문에 아직 영속성 컨텍스트가 끝나지 않아 컨트롤러에서 프록시 초기화가 가능한 것인가요?
강의에서 일반적으로 repository에서 만든 dto를 service와 controller에서 사용한다고 하셨습니다. 그런데 이전 강의에서 tuple은 repository계층에서만 사용하고 service나 controller에서 사용하는건 비추한다고 하셨습니다. tuple의 경우엔 하부 구현기술에 class이니 앞단에서 알면 좋지 않다.(jpa를 바꾸게 되는 경우 수정할 로직이 많아진다) 라고 이해했는데요. dto도 비슷하지 않을까 생각이 들었습니다. repository에서 만든 dto를 바꾸게 될 경우 앞단에서 수정할 로직이 많으니까요. dto와 tuple(resultset 등)은 다르게 보아야 하는걸까요? repository에서 만든 dto는 repository나 service에서까지만 사용하고 controller에서는 새로운 dto로 매핑하는게 맞을까요? 아니면 repository는 뒷단(안쪽) 영역이니 앞쪽에서 의존성을 가져가도 된다고 생각하는게 맞을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프(String)getServletContext().getAttribute 여기에 담고 바로 Servlet.Get 서버 실행에서 null값 나오는분들 ServletEx 서버 들렸다가 다시 오면 값 나와요런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 선생님 휴일인데 죄송합니다. 저는 강의를 듣기전에 미리 한번 먼저 해보고 하는 방식으로 공부중입니다. 다만 로그인이나 프로필 수정쪽은 FBV를 사용해서 직접 구현을 하셔서 이번 비밀번호 변경도 FBV로 구현을 하겠구나 생각하고 AUTH앱의 PasswordChangeForm과 FBV로 구현해보고 강의를 수강하였습니다. 선생님께서는 CBV로 구현을 하셔서 질문드립니다. CBV와 FBV를 다양하게 쓰는 예를 보여주시려고 사용하신건가요? 아니면 CBV는 AUTH앱의 passwordchangeVIew를 가져오면 기능들이 갖춰져 있기 때문에 편리하고 더 효율적이기 때문에 사용하신건가요? 아니면 그냥 아래 처럼 맞는지는 모르겠지만 함수로 구현해도 상관은 없는건가요? 처음 질문이라 좀 요점이 없는것 같은데 죄송합니다. @login_required def password_change ( request ): if request.method == 'POST' : form = ChangeForm(request.POST) if form.is_valid(): form.save() messages.success(request, "비밀번호 변경 성공" ) else : form = ChangeForm() return render(request, "accounts/password_change_form.html" ,{ 'form' :form,})
질문용 파일 링크: https://drive.google.com/file/d/1H7Jk68AinSPuCjEWiavLgFMpQtEuHdhT/view?usp=sharing gradle build를 실행할 때 계속 오류가 납니다. 우측의 Gradle Tab > (프로젝트명) > Tasks > build > build 실행 jar 파일만 생성시킬 땐 무사히 만들어지는데 build 명령을 내릴 때는 test code 단계에서 계속 오류가 납니다. test code가 분명 있는데도 찾지를 못하네요. ClassNotFoundException 자주 하는 질문에 적어주신 방법은 다 시도해봤습니다. 1. IntelliJ IDEA로 test code 실행주체 바꾸기, 2. 설정이 java 11로 제대로 되어있는지 확인하고 바꾸기(자주 하는 질문 매뉴얼(https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.f9xqb7l8nuph)에 적으신 대로 선택했습니다). 3. project close 한 다음에 build.gradle 파일을 open as project로 열어서 재실행하기 4. 혹시나 버전 호환성 문제일까 싶어서 원래는 2.6.4 버전이었는데 강의에서 나온 2.3.1 버전으로 다운그레이드해서 재실험해봤거든요. 그런데도 똑같은 오류가 계속 뜨네요. 위의 파일 링크 안에도 포함되어있긴 하지만, 더 빨리 찾으시라고 아래에 error log 따로 적어봅니다. org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'KYH.Elementary.ElementaryApplicationTests'. at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53) at java.base@11.0.14/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@11.0.14/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base@11.0.14/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@11.0.14/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) Caused by: org.gradle.internal.UncheckedException: java.lang.ClassNotFoundException: KYH.Elementary.ElementaryApplicationTests at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:68) at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:112) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.access$100(JUnitPlatformTestClassProcessor.java:54) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:89) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.execute(JUnitPlatformTestClassProcessor.java:79) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) ... 18 more Caused by: java.lang.ClassNotFoundException: KYH.Elementary.ElementaryApplicationTests at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:398) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.loadClass(JUnitPlatformTestClassProcessor.java:110)
안녕하세요. 다른이 아니라 수강생 카카오톡 그룹 채팅방 입장 비밀번호는 어디서 알 수가 있는지 궁금합니다.. 혹시 강의 구입후 처음 듣기 시작했을 때 나왔던 모달창에 비밀번호가 작혀 있었을까요?ㅠㅠ 차음 수강 시작 했을 때 모달창이 한개 나왔던거 같은데.... 제대로 확인을 못 해서 질문드리게 되었습니다
제가 하는 방식은 잘못된 건가요? 2번의 답을 구하려해도 안나오더라구요.. let 농구공={ 이름:'~~~' 가격:'~~~~' 설명:'~~~'} 이런식으로 세개의 객체를 정한 뒤 let 상품들=["농구공","배드민턴채","탁구채"]로 배열을 묶는건 잘못된 방식인가요?! 아니라면 2번정답을 알 방법좀 알려주세요!!
기존에 프로젝트를 통해 ajax와 axios를 써봤음에도 cors에러가 잡히지 않아 당황했습니다. 게시판에 올려주신 분들 정보를 참고는 하되, 무작정 다 복붙하시면 안됩니다. 저 역시 또 다른 에러가 생겨 최대한 공식문서를 살펴보고 하니 해결이 됐습니다. 우선 const { createProxyMiddleware } = require ( 'http-proxy-middleware' ) ; module . exports = function ( app ) { app . use ( '/api' , createProxyMiddleware ( { target : 'http://localhost:5000' , changeOrigin : true , } ) ) ; } ; 이 부분에서 영상과 다른 점이 있는데, 이것은 강의 url에 있는 docs에 있는 예제를 따라하는 것이 맞습니다. 어디가 문제인지 콘솔로 확인하는게 어렵다면, 우선 백엔드쪽 서버에 보낸 response가 html로 들어오는지 확인(localhost:5000/api/hello 가 되겠죠)-> 만약 잘 들어온다면 프론트 단(client)에서만 수정을 해주시면 됩니다. 또한package.json에 있는 경로를 폴더에 맞게 잘 설정해주셔야 됩니다. 다른 강의들 보면서 모르는 부분을 찾아해맨 적이 너무 많은데 이 강의는 조금만 시간을 들이면 다 해결이 될만큼 설명을 잘해주셔서 감사합니다.
https://github.com/dlwogns312/boilerplate-movie fetch를 추가하고 그 다음으로 나아가지지 않습니다 . 계속 오류가 뜹니다. × Unhandled Rejection (TypeError): Failed to fetch 이런식으로 오류가 뜨는데 어떡해야하나요