학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네 [질문 내용] 여기에 질문 내용을 남겨주세요. 메인을 실행시키려했는데, 실행을 할 수가 없어요.. 질문글을 찾아보고 edit configuration을 만져보려고 했는데 뭐가뭔지 잘 모르겠습니다... 도와주세요 스프링부트 3.x 버전이고 , jdk 17은 확인 하였습니다! 추가로 application쪽도 확인해봤는데, 찾고자하는 main class가 없는 것 같아요,, 화면 상황은 이렇습니다.
security: oauth2: client: registration: kakao: clientId: client-secret: scope: account_email, profile_nickname, profile_image , openid client-name: Kakao authorization-grant-type: authorization_code redirect-uri: http://127.0.0.1:9000/login/oauth2/code/kakao client-authentication-method: POST provider: kakao: authorization-uri: https://kauth.kakao.com/oauth/authorize token-uri: https://kauth.kakao.com/oauth/token user-info-uri: https://kapi.kakao.com/v2/user/me user-name-attribute: id gateway.yml 은 다음과 같이 설정했고 코드는 강사님 코드를 참고하였습니다. oidc 방식으로 인증 요청을 카카오에 보내고 loaduser 가 실행될줄알고 디버그를 찍어봤는데 디버그도 안찍히고 위 화면에서 동의하고 계속하기를 누르면 다음과같이 나옵니다. 로그도 디버그도 안찍혀서 문제가 예측이안되네요 ㅠㅠㅠ scope 설정이나 localhost , 127.0.0.1 이런 자잘한 수정은 계속 해보는데 원인을 모르겠습니다..
안녕하세요, 강사님. 타임리프를 이용하지 않고, React 로 화면을 구성 후 구글, 카카오, 네이버, 깃허브 등 소셜 로그인을 구현하려고 합니다. 버튼 클릭 -> 소셜 로그인 창 팝업 간단한 로직이 안되어 질문을 남깁니다 ㅜ.ㅜ 강의에서는 <a th:href="@{/oauth2/authorization/google, kakao, naver}"> </a> 위 코드로 진행이 잘 되었는데 해당 url 을 프론트에서 맵핑 시키기 위해서는 어떤 url 을 사용해야 하나요? @{/oauth2/authorization/google} 위 url 이 어디에 맵핑이 되는건지 알고싶습니다. (강의 잘 듣고있고, 뒤쪽 resource server 까지 달려가고 있습니다!)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 조금은 다를수있습니다. 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 강의와는 조금 다를수있지만 /mebers/{id} 이렇게 조회를 하면 누군가도 똑같은 url을 입력하여 해당 정보를 볼수 있다고 생각하는데 이런거에 대한 위험성같은거는 따로 처리하는 방법?같은게 있는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 전체회원수가 엄청많을경우에도 모든회원을 list에 담은후에 중복을 검토하는게 맞는지 궁금합니다~
테스트 내 yml 설정을 통해서 내부 메모리로 사용할 수 있다고 하셨는데 인텔티제이 안의 내부 메모리를 사용하는건가요? 또 테스트 수행 시 마다 내부 메모리는 초기화가 되는건가요? 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
그래이들 설정 파일에 코틀린 라이브러리를 추가하는과정에 있어서 질의응답의 답글에 있는 레퍼런스를 참고하는 과정에 있어 특정 문단을 이해하기가 어려워 질문드립니다. 다음 레퍼런스를 참고 하였으며 https://docs.spring.io/spring-boot/docs/3.1.1/reference/pdf/spring-boot-reference.pdf 7.11.1. Requirements 해당 세션에 있는 내용입니다. Since Kotlin classes are final by default, you are likely to want to configure kotlin-spring plugin in order to automatically open Spring-annotated classes so that they can be proxied. 해당 부분입니다. 추가적으로 레퍼런스에서는 org.jetbrains.kotlin:kotlin-stdlib 및 org.jetbranins.kotlin:kotlin-reflect 가 클래스 패스에 존재햐아 한다는데, stdlib만 설정하신 이유도 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의를 쭉 따라가면서 OrderService 구현까지 하고있는데 제가 생각하기에는 OrderService에 Delivery를 생성하는 부분에서 DeliveryStatus를 READY로 세팅 해야 될것 같은데 강의에서는 이부분이 빠져있어서 혹시 제가 놓친 부분이 있을까요? @Transactional public Long order(Long memberId, Long itemId, int count) { Item item = itemRepository.findById(itemId); Member member = memberRepository.findById(memberId); //배송정보 생성 Delivery delivery = new Delivery(); //delivery status 세팅 --------------------------- delivery.setStatus(DeliveryStatus.READY); //----------------------------------------------- delivery.setAddress(member.getAddress()); //주문상품 생성 OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count); //주문 생성 Order order = Order.createOrder(member, delivery, orderItem); orderRepository.save(order); return order.getId(); }
test 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] test 강의 내용으로 게시판 만들기를 병행하고 있습니다. 이번 강의에서 Spring Data Jpa로 변경을 하였는데 게시글 수정과 같은 수정 기능은 인터페이스인 SpringDataJpaMemberRepository에서 작성하나요? 아니면 Service단에서 Repository의 find를 통해서 수정하도록 작성하나요? SpringDataJpa에서 find, delete는 있는데 수정은 어떻게 이뤄지는지 궁금합니다..d
두가지 질문이 있는데요 MySpringBootMain띄울때 HelloConfig 클래스에 @Configuration 이 있어도 잘 동작 하던데 주석 처리하는 이유가 뭔지 알 수 있을까요? 다른 질문인데요 @Configuration안에 @Component가 있어서 @Component 대신 @Configuration을 써도 되는것 같던데 빈여러개 등록할때 말고 하나의 클래스를 빈으로 등록할때 @Component 대신 @Configuration을 사용하지 않는 이유가 뭘까요...?찾아봐도 잘 안나와서 질문 드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 엔티티 클래스 개발2 강의에서 Address 객체의 빈생성자를 만들때 protected를 사용하는것을 봤습니다. 혹시 여기서 어노테이션 @NoArgsConstructor(access = AccessLevel.PROTECTED) 를 사용해도 나중에 문제가 없을지 궁금합니다. 또 생성자를 어노테이션으로 만드는 것이 안좋을 수 있는 상황이 있는지 궁금합니다.
java.io .StreamCorruptedException: invalid type code: 00 > invalid type code: 00 * Try: > Run with --scan to get full insights. * Exception is: org.gradle.api.UncheckedIOException: java.io .StreamCorruptedException: invalid type code: 00 at org.gradle.internal.UncheckedException.throwAsUncheckedException( UncheckedException.java:62 ) at org.gradle.internal.UncheckedException.throwAsUncheckedException( UncheckedException.java:41 ) at org.gradle.tooling.internal.provider.serialization.PayloadSerializer.deserialize( PayloadSerializer.java:78 ) at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run ( ClientProvidedPhasedActionRunner.java:51 ) at org.gradle.launcher.exec.ChainingBuildActionRunner.run ( ChainingBuildActionRunner.java:35 ) at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run ( ProblemReportingBuildActionRunner.java:49 ) at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run ( BuildOutcomeReportingBuildActionRunner.java:65 ) at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run ( FileSystemWatchingBuildActionRunner.java:140 ) at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run ( BuildCompletionNotifyingBuildActionRunner.java:41 ) at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0( RootBuildLifecycleBuildActionExecutor.java:40 ) at org.gradle.composite.internal.DefaultRootBuildState.run ( DefaultRootBuildState.java:122 ) at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute( RootBuildLifecycleBuildActionExecutor.java:40 ) at org.gradle.internal.buildtree.InitDeprecationLoggingActionExecutor.execute( InitDeprecationLoggingActionExecutor.java:58 ) at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute( DefaultBuildTreeContext.java:40 ) at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0( BuildTreeLifecycleBuildActionExecutor.java:65 ) at org.gradle.internal.buildtree.BuildTreeState.run ( BuildTreeState.java:53 ) at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute( BuildTreeLifecycleBuildActionExecutor.java:65 ) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call( RunAsBuildOperationBuildActionExecutor.java:61 ) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call( RunAsBuildOperationBuildActionExecutor.java:57 ) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute( DefaultBuildOperationRunner.java:204 ) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute( DefaultBuildOperationRunner.java:199 ) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute( DefaultBuildOperationRunner.java:66 ) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute( DefaultBuildOperationRunner.java:59 ) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute( DefaultBuildOperationRunner.java:157 ) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute( DefaultBuildOperationRunner.java:59 ) at org.gradle.internal.operations.DefaultBuildOperationRunner.call ( DefaultBuildOperationRunner.java:53 ) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call ( DefaultBuildOperationExecutor.java:73 ) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute( RunAsBuildOperationBuildActionExecutor.java:57 ) at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0( RunAsWorkerThreadBuildActionExecutor.java:36 ) at org.gradle.internal.work .DefaultWorkerLeaseService.withLocks( DefaultWorkerLeaseService.java:249 ) at org.gradle.internal.work .DefaultWorkerLeaseService.runAsWorkerThread( DefaultWorkerLeaseService.java:109 ) at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute( RunAsWorkerThreadBuildActionExecutor.java:36 ) at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute( ContinuousBuildActionExecutor.java:110 ) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute( SubscribableBuildActionExecutor.java:64 ) at org.gradle.internal.session.DefaultBuildSessionContext.execute( DefaultBuildSessionContext.java:46 ) at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply( BuildSessionLifecycleBuildActionExecuter.java:100 ) at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply( BuildSessionLifecycleBuildActionExecuter.java:88 ) at org.gradle.internal.session.BuildSessionState.run ( BuildSessionState.java:69 ) at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute( BuildSessionLifecycleBuildActionExecuter.java:62 ) at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute( BuildSessionLifecycleBuildActionExecuter.java:41 ) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute( StartParamsValidatingActionExecuter.java:64 ) at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute( StartParamsValidatingActionExecuter.java:32 ) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute( SessionFailureReportingActionExecuter.java:50 ) at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute( SessionFailureReportingActionExecuter.java:38 ) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute( SetupLoggingActionExecuter.java:47 ) at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute( SetupLoggingActionExecuter.java:31 ) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild( ExecuteBuild.java:65 ) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute( BuildCommandOnly.java:37 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute( WatchForDisconnection.java:39 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute( ResetDeprecationLogger.java:29 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute( RequestStopIfSingleUsedDaemon.java:35 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create( ForwardClientInput.java:78 ) at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create( ForwardClientInput.java:75 ) at org.gradle.util.internal.Swapper.swap( Swapper.java:38 ) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute( ForwardClientInput.java:75 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute( LogAndCheckHealth.java:64 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild( LogToClient.java:63 ) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute( BuildCommandOnly.java:37 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild( EstablishBuildEnvironment.java:84 ) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute( BuildCommandOnly.java:37 ) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed( DaemonCommandExecution.java:104 ) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run( StartBuildOrRespondWithBusy.java:52 ) at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run( DaemonStateCoordinator.java:297 ) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute( ExecutorPolicy.java:64 ) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run( ManagedExecutorImpl.java:49 ) Caused by: java.io .StreamCorruptedException: invalid type code: 00 at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke( DirectMethodHandleAccessor.java:103 ) at org.gradle.tooling.internal.provider.serialization.PayloadSerializer.deserialize( PayloadSerializer.java:76 ) ... 69 more 실전! 스프링부터와 JPA활용1 듣고있는데 첫 시작부터 빌드가 되지않습니다. 혹시 잘못된점이 있을까요..ㅠㅠ? 강의 자료대로 build.gradle Gradle 전체 설정은 복붙한 상태입니다.
* bootstrap 라이브러리를 추가하고 아래와 같이 application.yml 파일만으로 설정하면 적용이 안됩니다. dependency에 bootstrap을 의존성 추가하지 않습니다 . 그 후 application.yml파일에 아래와 같이 설정합니다. spring: cloud: config: name: ecommerce # yml 파일명 앞부분 config: import: optional:configserver:http://localhost:8888 # 구성정보 설정 강의에서 나오는 bootstrap.yml 설정 정보를 Spring Boot 2.4버전 이후부터는 application.yml 설정 정보에서 사용할 수 있습니다. ( 공식홈페이지 ) 위 방법은 공식 홈페이지 목차에서 Spring Cloud Config Client - Spring Boot Config Data Import 부분에 나와있습니다. 만약 bootstrap 라이브러리를 사용한 구성설정을 하고 싶다면 공식홈페이지 목차에서 Spring Cloud Config Client - Config First Bootstrap 부분을 살펴보시면 되겠습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] build.gradle 구성이 강사님과 약간 다릅니다. 버전은 2.7.13을 받았고, sourceCompatibility = '17' 이렇게 되어있습니다 17을 11로 바꿨고 실행했더니 아래와 같은 오류가 떴습니다. 아래는 제 build.gradle 내용입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] http://localhost:8080으로 접속했는데 계속 '사이트에 연결할 수 없음'이라고 나오네요. 인터넷에 찾아봤을 떄 포트번호가 오라클과 같이 사용하고 있어서 포트번호를 바꾸면 된다고 하길래 Run > Edit Configurations... > Environment variables에 server.port=9090으로 바꿔서 해보기. 제어판 > 관리도구 > 서비스 > OracleXETNSListener을 중지시키기. src > main > resources > static > application.properties 파일에 server.port=9090을 넣기. 총 3가지 방법으로 시도를 해보았는데 다 안됩니다. 포트 번호는 여러 숫자로 다양하게 해보았는데도 안되네요ㅠㅠ 포트번호 바꿨을 때마다 run 다시 해서 포트번호 정상 출력되는거 확인하고 localhost 뒤에 포트 번호도 다 제대로 확인했었습니다.. 어떤 설정을 바꿔야지 정상적으로 되는지 모르겠습니다.
/members/new로 post요청할 때, 아래 방법 처럼 form 데이터를 이전시간에 만들어놓은 Member 객체로 바로 받아서 사용할 수도 있는데 MemberForm을 따로 생성하고 Member객체를 인스턴스화 해서 사용하는 이유가 무엇인가요? DTO와 ENTITY를 나누어 사용하기 위함 일까요? @PostMapping("/members/new") public String create(Member form){ memberService.join(form); return "redirect:/"; }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 현재 JPA에 대해 공부하고 있는 학생입니다. 현재 N+1에 대한 이슈를 테스트하는 중에 Entity의 생명주기에 대한 궁금점이 있어 질문을 남겼습니다. EntityManager 초기화 시 1차 캐시에 있는 Entity는 자동으로 Flush가 되나요? N+1 확인을 하기위해 모든 Entity를 저장한 후EntityManager를 초기화 시켜 1차 캐시를 초기화시켰습니다. 이유는 1차 캐시에 원하는 Entity가 존재한다면 해당 Entity를 DB를 거치지 않는다고 알고 있어서입니다. 코드는 다음과 같습니다. @ExtendWith(SpringExtension.class) @DataJpaTest public class StudyRoomRepositoryTest { @Autowired private StudyRoomRepository studyRoomRepository; @Autowired private UserRepository userRepository; @PersistenceContext EntityManager em; private List<StudyRoom> studyRooms = new ArrayList<>(); private List<User> users = new ArrayList<>(); @BeforeEach public void setUp() { users.add(userRepository.save(User.builder().userUuid(UUID.randomUUID()).email("tester@gmail.com").password("password").nickName("tester").build())); users.add(userRepository.save(User.builder().userUuid(UUID.randomUUID()).email("tester2@gmail.com").password("password").nickName("tester2").build())); studyRooms.add( studyRoomRepository.save(StudyRoom.builder().roomName("TestStudyRoom1").constructor(users.get(0)).build())); studyRooms.add( studyRoomRepository.save(StudyRoom.builder().roomName("TestStudyRoom2").constructor(users.get(1)).build())); } @Test @DisplayName("users N+1 문제 Test") public void UsersNPlusOneTest(){ em.clear(); //EntityManager 초기화 List<StudyRoom> findStudyRooms = studyRoomRepository.findAll(); for(StudyRoom findStudyRoom: findStudyRooms){ System.out.println(findStudyRoom.getConstructor()); } } } 예상대로 N+1 이슈에 대해 확인할 수 있었습니다. 하지만 궁금한점이 생겼습니다. 제가 알기로는 Save 메소드가 호출된다 해도 Transaction이 진행중이면 실제 DB에는 안 넘어가는것으로 알고있습니다. 또한 만약 DB로 넘기고 싶다면 Flush를 통해 넘길 수 있는 것으로 알고있습니다. 근데 저는 SaveAndFlush() 메소드가 아닌 Save() 메소드를 호출했음에도 불구하고 Select Query로그가 찍힙니다. Hibernate: select studyroom0_.study_room_id as study_ro1_1_, studyroom0_.create_at as create_a2_1_, studyroom0_.is_deleted as is_delet3_1_, studyroom0_.update_at as update_a4_1_, studyroom0_.user_id as user_id7_1_, studyroom0_.room_name as room_nam5_1_, studyroom0_.room_uuid as room_uui6_1_ from study_rooms studyroom0_ Hibernate: select user0_.user_id as user_id1_2_0_, user0_.create_at as create_a2_2_0_, user0_.is_deleted as is_delet3_2_0_, user0_.update_at as update_a4_2_0_, user0_.email as email5_2_0_, user0_.nick_name as nick_nam6_2_0_, user0_.password as password7_2_0_, user0_.role as role8_2_0_, user0_.user_uuid as user_uui9_2_0_ from users user0_ where user0_.user_id=? com.twoleader.backend.domain.user.entity.User@522fb69 이유를 잘 모르겠습니다. 제 예상으로는 EntityManager의 clear()메소드 호출 시 1차 캐시 안에 Entity들이 존재한다면 자동으로 Flush()메소드가 호출되는 것으로 추측이 되는데 맞는지 여쭙고 싶습니다. 만약 아니라면 해당 데이터는 어디서 불러온것인지 궁금합니다.