묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
코틀린에서 builder 패턴은 사용하지 않나요?
강사 님께서는 객체를 인스턴스화 하실 때, 생성자를 사용하거나, 정적 팩토리 메서드를 사용하는 방식 2가지를 이용하셨는데 혹시 코틀린에서 builder 패턴을 사용하는건 어떻게 생각하시나요??defalut 파라미터를 이용하고 naming을 통해 builder패턴 처럼 사용할 수 는 있겠지만 java에서 builder패턴을 통해 객체를 만들었던 것에 비하면 불편하다는 생각이듭니다.조언 해주시면 감사하겠습니다.
-
해결됨실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Spring Validation 의 @field:NotBlank 등으로 Request DTO 필드 검증 시, 필드타입 선언방식( non-null or nullable )
안녕하세요 강사님. 참 좋은 강의 감사드립니다.예제 고도화 과정에 Request DTO nullable 필드 처리에 어떤 방식이 적절할 지 알수 없어 남기게 되었습니다.Kotlin 객체 필드타입을 크게 두 방식으로 선언 할 수 있습니다.nullablenon-null코프링 기반에서 Request DTO 의 경우,객체필드를non-null 타입으로 선언하면 WebMvc 와 spring-validation 을 함께 사용하면, 발생 가능한 가설을 세워보았습니다.문제:서버 요청에 '비 유효값'`[공백문자["", ' '], null 필드값, 공백 JSON( {} )]`이 넘어올 때, Kotlin 언어의 non-null 타입 속성은, sprint-validation 절차를 거치지 못함. 원인:1. 속성 타입을 non-null 타입 선언 후 컴파일 시 Intrinsics.checkNotNullParameter(field, "field"); 함수가 non-null 검증코드로 DTO 생성자 함수 본체에 추가.2. 앞선 checkNotNullParameter 함수는 DTO 생성을 원천 차단.3. 때문에 Kotlin non-null 검증이 spring-validation 검증 이전에 수행됨을 뜻함. 즉, 검증 대상이 생성이 되어야 spring-validation 절차를 거칠텐데, 검증 대상이 없는 상황이 된다.(이 부분은 저의 뇌피셜이 포함되었으므로 검증되지 못한 분석결과 입니다) 이 문제에 대해 다음의 해결 방법을 생각할 수 있습니다.field 타입을 nullable 하게 선언, 기본값 null 설정data class UserCreateRequest( @param:JsonProperty("email") @field:NotBlank @field:Email val email: String? = null, ⬅️`?`및 기본값 설정 ) { fun toCommand() = UserCreate( /* String ❌ String? 미스매치 */ email = email!!, ✅단언 해결 ) }이 방법은 단언 !! 을 사용하여 전적으로 spring-validation 의 검증에 전적으로 의지하는 코드입니다.의문점은 개인적으로 우아하지 못한 단언 !! 을 꼭 사용해야 할까? 인데요, 다른 방법으로는,Backing 필드 생성자 선언 ➡️ 커스텀 getter 로 Backing 필드값 반환이 떠오르는데요, 이것 또한 보일러-플레이트 코드량이 늘어나서 우아하지 않아 보입니다^^;강사님의 경우에는 어떠한 해결방법을 사용하지는지 궁금해서 질문 남겨보았습니다.읽어 주셔서 감사합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
주문한 상품 개수만큼 Stock을 감소시키는 로직
안녕하십니까! 저의 경우는 해당 로직을 stockRepository.findByProductNumberIn()이 아니라,일일이 재고와 관련된 ProductNumber에 대하여 stockRepository.findByProductNumber()로조회하여 decreaseQuantity()를 수행하였습니다. 그렇게 하여도, 동일 Stock의 경우 EntityManager에서 조회해오기 때문에 중복된 쿼리가 나가지 않아 어느정도의 성능 감소를 막을 수 있다고 판단하였고, (물론 In절로 한꺼번에 가져오는것 보단 성능이 덜 나올 것 같습니다)그대신에 , 로직이 직관적이라는 장점이 있을 것 같아서 위와 같이 해당 로직을 작성하였습니다. 이에 대해서는 어떻게 생각하시는지 의견 남겨주시면 감사하겠습니다!
-
미해결Practical Testing: 실용적인 테스트 가이드
요청값으로 넘어온 productNumber의 Product가 재고와 관련있는 상품인지 확인하는 로직 질문
안녕하세요! 강의에서는 해당 로직을 ProductType이 BOTTLE이나 BAKERY인 경우에 한하여 true가 되도록 containsStockType() 메소드를 작성하여 판별 해주셨습니다!혹시 이 경우를 stockRepository.existsByProductNumber() 를 호출하여,재고가 있는 상품들만 필터링 해내는 로직으로 작성하게 되면,주문 상품수가 많을 경우 쿼리가 여러번 나가기 때문에 비효율적이어서,요구사항에 따른 검증 로직을 작성하셨는지 여쭙고 싶습니다!
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
레디스에서 락이 필요한 상황에 대하여
안녕하세요, 강의를 보고 공부를하다 궁금한 점이 생겨 질문드립니다.제가 예측한 강의 내용으로는, "경쟁 상태 예시(재고 수량)에 대하여 레디스 를 활용한다." 라고 예측 했습니다.이에 대하여, "레디스는 싱글 스레드 기반이니깐, 락킹 없이 해당 작업이 가능할 것" 이라고 추측하였는데요, 그러나 제가 생각지 못한 레디스 lock 과 관련된 내용을 접하게 되어 신기하면서도 또 궁금한 부분이 생겨 질문드립니다. 레디스 락 전략이 사용되는 이유와 예시를 조금더 들어볼 수 있을까요? 혹은 이와 관련하여 추가적으로 공부해볼 수 있는 자료를추천해주시면 감사하겠습니다.
-
미해결실전! 스프링 데이터 JPA
Example Matcher withIgnorePaths 질문입니다
제가 이해한바로 age 필드는 primitive type이기 때문에 default value가 0으로 설정되어 다소 모호한 결과값이 나올 수 있기 때문에 withIgnorePath를 통해 특정 필드를 제외하는 것으로 이해했습니다. primitive type의 default value가 0이기 때문에 모호한 결과값이 나올 수 있어서 제외하는거라면 아예 공식 문서상에서도 이 기술을 사용하는 경우 엔티티를 Integer 객체로 생성하도록 권장하고 기본값으로 not nullable한 필드는 기본값으로 exclude하는 방법도 좋았을 것 같은데 이렇게 설계가 된 이유가 있을지 궁금합니다! reflection을 이용하면 가능할 것 같은데 다른 경우의 수가 있어서 그런걸까요?
-
미해결스프링 핵심 원리 - 기본편
AutoAppConfig 실행오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]AutoAppConfig의 basicScan 테스트 코드를 실행했더니 다음 오류가 뜹니다.구글링해도 딱히 제 상황과 맞는 답을 찾을 수가 없어 질문합니다. 다음은 로그를 복사붙여넣기 했습니다./Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56873:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/kdj/.m2/repository/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar:/Users/kdj/.m2/repository/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar:/Users/kdj/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/kdj/.m2/repository/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar:/Users/kdj/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/junit/lib/junit5-rt.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/junit/lib/junit-rt.jar:/Volumes/T7 Shield/P/core/out/test/classes:/Volumes/T7 Shield/P/core/out/production/classes:/Volumes/T7 Shield/P/core/out/production/resources:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-test/2.7.15/b9bf93cbd1c5d5d09dd798fca143e55cb0662777/spring-boot-starter-test-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/2.7.15/6ea75176edb5ba47addd6143b3e0fec25811be1d/spring-boot-starter-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test-autoconfigure/2.7.15/f59ccd8f7db4c88bee112e59875a40767456664e/spring-boot-test-autoconfigure-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/2.7.15/5a8442fcfc1750958460c55b255223434600aaf6/spring-boot-test-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-test/5.3.29/dc55cc20f39ba89b46d59aa948c818c642da1848/spring-test-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.3.29/528eafe4cef7bccf3df290dd99ac5833a9756183/spring-core-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/com.jayway.jsonpath/json-path/2.7.0/f9d7d9659f2694e61142046ff8a216c047f263e8/json-path-2.7.0.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/jakarta.xml.bind/jakarta.xml.bind-api/2.3.3/48e3b9cfc10752fba3521d6511f4165bea951801/jakarta.xml.bind-api-2.3.3.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/3.22.0/c300c0c6a24559f35fa0bd3a5472dc1edcd0111e/assertj-core-3.22.0.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/2.2/1820c0968dba3a11a1b30669bb1f01978a91dedc/hamcrest-2.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter/5.8.2/5a817b1e63f1217e5c586090c45e681281f097ad/junit-jupiter-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-junit-jupiter/4.5.1/f81fb60bd69b3a6e5537ae23b883326f01632a61/mockito-junit-jupiter-4.5.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/4.5.1/ed456e623e5afc6f4cee3ae58144e5c45f3b3bf/mockito-core-4.5.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.skyscreamer/jsonassert/1.5.1/6d842d0faf4cf6725c509a5e5347d319ee0431c3/jsonassert-1.5.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.xmlunit/xmlunit-core/2.9.1/e5833662d9a1279a37da3ef6f62a1da29fcd68c4/xmlunit-core-2.9.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/2.7.15/ca07c5ec0347342e207de3d26c0b686d43be60d5/spring-boot-autoconfigure-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.7.15/4e09424cc410ca255bbea2657a8da0b54b381b2a/spring-boot-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/2.7.15/1f4bece73c6e002fd0c113de552a746ab603b9be/spring-boot-starter-logging-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/1.3.5/59eb84ee0d616332ff44aba065f3888cf002cd2d/jakarta.annotation-api-1.3.5.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.30/8fde7fe2586328ac3c68db92045e1c8759125000/snakeyaml-1.30.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.3.29/4f84fbeec60adb1a50734b6077836e53844f0134/spring-jcl-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.minidev/json-smart/2.4.11/cc5888f14a5768f254b97bafe8b9fd29b31e872e/json-smart-2.4.11.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/jakarta.activation/jakarta.activation-api/1.2.2/99f53adba383cb1bf7c3862844488574b559621f/jakarta.activation-api-1.2.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.8.2/ddeafe92fc263f895bfb73ffeca7fd56e23c2cce/junit-jupiter-params-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.12.23/d470526e8c4566c04e9ae5d3ccb62d1a7aa58986/byte-buddy-1.12.23.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.12.23/1cba11fdb72c383edacb909f79ae6870efd275e4/byte-buddy-agent-1.12.23.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/com.vaadin.external.google/android-json/0.0.20131108.vaadin1/fa26d351fe62a6a17f5cda1287c1c6110dec413f/android-json-0.0.20131108.vaadin1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.3.29/c374a72716d19220ca142efaab910adf5717c5d0/spring-context-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.12/d4dee19148dccb177a0736eb2027bd195341da78/logback-classic-1.2.12.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-to-slf4j/2.17.2/17dd0fae2747d9a28c67bc9534108823d2376b46/log4j-to-slf4j-2.17.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/1.7.36/ed46d81cef9c412a88caef405b58f93a678ff2ca/jul-to-slf4j-1.7.36.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.minidev/accessors-smart/2.4.11/245ceca7bdf3190fbb977045c852d5f3c8efece1/accessors-smart-2.4.11.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.apiguardian/apiguardian-api/1.1.2/a231e0d844d2721b0fa1b238006d15c6ded6842a/apiguardian-api-1.1.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/5.3.29/397c588ce63ba4c185a8c1bd2f1e9139075b3bf1/spring-aop-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.3.29/be40f557f3fa52c703f00e127ff639f8cf499617/spring-beans-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/5.3.29/44ac795a057c4a6360063801c54a2d148e5a2808/spring-expression-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.2.12/1d8e51a698b138065d73baefb4f94531faa323cb/logback-core-1.2.12.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.2/f42d6afa111b4dec5d2aea0fe2197240749a4ea6/log4j-api-2.17.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.3/8e6300ef51c1d801a7ed62d07cd221aca3a90640/asm-9.3.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.8.2/c598b4328d2f397194d11df3b1648d68d7d990e3/junit-jupiter-engine-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/3.2/7fadf57620c8b8abdf7519533e5527367cb51f09/objenesis-3.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-engine/1.8.2/b737de09f19864bd136805c84df7999a142fec29/junit-platform-engine-1.8.2.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 hello.core.scan.AutoAppConfigTest,basicScan06:23:36.656 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@618425b506:23:36.669 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'06:23:36.736 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Volumes/T7 Shield/P/core/out/test/classes/hello/core/beanfind/ApplicationContextSameBeanFindTest$SameBeanConfig.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Volumes/T7 Shield/P/core/out/test/classes/hello/core/beanfind/ApplicationContextSameBeanFindTest$SameBeanConfig.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:457) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at hello.core.scan.AutoAppConfigTest.basicScan(AutoAppConfigTest.java:17) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) 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.base/java.util.ArrayList.forEach(ArrayList.java:1541) 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.base/java.util.ArrayList.forEach(ArrayList.java:1541) 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:107) 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:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at org.springframework.asm.ClassReader.readStringish(ClassReader.java:3733) at org.springframework.asm.ClassReader.readClass(ClassReader.java:3748) at org.springframework.asm.ClassReader.accept(ClassReader.java:456) at org.springframework.asm.ClassReader.accept(ClassReader.java:426) at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:429) ... 84 moreProcess finished with exit code 255
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 초기 연결시 오류..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Database "C:/Users/star5/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-224] 90149/90149 (도움말)org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "C:/Users/star5/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-224] 윈도우 환경에서 h2설치후 연결하면 Database "C:/Users/star5/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-224] 90149/90149 (도움말)org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "C:/Users/star5/test" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-224]이런에러가 뜨는데 어떤게 문제일까요?? 설정값은 강사님과 똑같이 하였습니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
@MockBean, @Mock
@MockBean, @Mock 두 개 사용이 계속 헷갈려서 질문 드립니다. 스프링 서버를 띄워서 테스트 할 때 @MockBean을 사용하는 걸로 알려주셨는데 @MockBean도 결국 Mock 객체를 사용하는 거니 @MockBean 대신 @Mock을 써서 테스트를 해도 될 것 같은데 왜 @SpringBootTest나 @WebMvcTest 어노테이션과 @MockBean을 같이 사용해서 테스트 하는 지 궁금합니다.Controller 테스트를 할 때 @WebMvcTest를 사용하기 위해서 @MockBean을 사용하는 걸까요? @WebMvcTest와 @MockBean이 짝궁(?)이어서 이렇게 사용하는걸까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의에 나온 코드에 대해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]수업 잘 듣는 중입니다. 다름이 아니라, 강의에 나온 jdbc 코드를 얼마나 알아야 하는지 궁금합니다. 저는 Mysql로 연동홰서 사용중인데, 순수 JDBC 강의에서 나온 데이터 CRUD 코드를 얼마나 알아야할까요? 대표적으로 알아야하는 코드가 있다면 알려주시면 감사하겠습니다.
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
@Valid Notifications notifications
안녕하세요 ! 강의 너무 재밌습니다 감사합니다.. (2:29)Notifications 앞에 @Valid 을주셨는데 막상 Notifications 객체에는 벨리데이션 조건도없고 @InitBinder도 따로 없는데@Valid 붙이는게 의미가 있는건가요 !?! 제가 궁금한건 @Valid 이 어노테이션이 유효한지가 궁금합니다.
-
미해결Practical Testing: 실용적인 테스트 가이드
WebMvcTest에서의 when
Controller 테스트를 하실 때어떤 경우에서는 when으로 값을 세팅해주고어떤 경우에는 사용을 안하시는데기준이 있으실까요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ManyToOne 관계 설정 시 궁금한 점이 있습니다.
[질문 내용]안녕하세요! 강의를 들으며 제 사이드 프로젝트의 데이터베이스를 설계하는 과정에서 궁금증이 생겨 질문드립니다. 저는 Content라는 엔티티 클래스를 만들고 이를 상속받는 Post, Comment 클래스를 만들었습니다. Content라는 부모 엔티티 클래스를 만든 이유는 내용을 담는 body라는 필드를 Post와 Content가 동일하게 가지기 때문입니다. 후에 프로젝트가 커지면 image, link등과 같은 여러 필드들이 Content에 추가될 예정입니다. 이때 Post는 title 필드를 추가적으로 가지고 있고 Comment를 여러 개 가질 수 있는데, 일반적인 상황에서 동일한 엔티티 클래스를 상속받은 클래스끼리도 이러한 ManyToOne 관계를 가지게 설계하는지 궁금합니다.
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
안녕하세요 강의 잘보고있습니다,.
질문이 하나있습니다.8:48인데요 @PostMapping(SETTINGS_PASSWORD_URL)public String passUpdate(@CurrentUser Account account, @Valid PasswordForm passwordForm, Errors errors,Model model, RedirectAttributes attributes){System.out.println("errors : " + errors);if(errors.hasErrors()){ model.addAttribute(account);return SETTINGS_PASSWORD_URL;} 이부분인데 에러가 났을때 왜 model.addAttribute(account); (66라인)모델이 다시 담아주는건가요 ?? ==================================== 다시 생각해보니 account 객체가 nav-bar 에서 필요해서(account 객체에 따른 이미지 보여주기) 다시 담아주는거 같네요
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
SessionManager 를 Bean 이 아니라 static 클래스로 해도 상관없나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 항상 강의 잘 듣고있습니다!강의를 보다보니 SessionManager 클래스를 Bean 으로 등록하지 않고 static class 로 사용해도 될 것 같다는 생각이 들었는데, 어떤 차이점이 있는지는 생각을 해봐도 잘 모르겠네요..SessionManager 를 Bean 으로 등록하신 이유가 뭘까요??
-
미해결스프링 부트 개념과 활용
섹션2 자동설정 부분 질문있습니다.
왼쪽이 spring-boot-starter, 오른쪽 spring-boot-getting-started입니다.둘다 패키지 이름은 me.gang으로 똑같고 수업과 똑같이 따라하면 started 프로젝트에서 holoman클래스를 찾을수 없다고 나옵니다. 어떻게 해야 해당 에러를 해결할 수 있나요?
-
미해결스프링 시큐리티 OAuth2
30:55초 경에 요청이 한번 더 오는거 같던데
요청을 한번 보냈는데, 다시 한번 요청이 와서, filterchainproxy에 요청 위임하는 과정이다시 나오는데 어떤 이유에서 그런건지 궁금합니다
-
미해결Practical Testing: 실용적인 테스트 가이드
강의 코드 질문 드립니다.
안녕하세요. 강의 코드는 혹시 제공 되나요?
-
미해결3. 웹개발 코스 [Enterprise Architecture(EA) X 전자정부프레임워크]
11강 매개변수 brdid 질문
안녕하세요. 강의 잘 보고 있습니다.다름이 아니라 11강 BoardServiceImpl class의 showBoard 메소드 부분에서 String brdid = request.getParameter("brdid")라고 적었는데, brdid라는 값을 어디에서 가져오는 건가요?BoardMapper.xml에서는 brdid가 아닌 in_brdid이고, jsp부분에서도 따로 brdid가 입력되는 부분이 없어어느 곳에서 가져오는지 잘 모르겠습니다.답변 부탁드리겠습니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서블릿에 대한 질문이 있습니다
서블릿은 웹 서버를 직접 구현할 때 필요한 tcp/ip 연결이나 http 메세지 파싱, html 생성 등 비즈니스 로직 외의 것들을 대신 해줘서 개발자는 비즈니스 로직에만 집중하여 개발할 수 있는 장점이 있다고 하셨고, 자바 웹 기술의 역사를 설명하실 때 서블릿의 단점이 html 생성이 어려운 것이라고 하셨습니다.여기서 html 생성이 어렵다는 것은 비즈니스 로직에서 응답으로 보낸 HttpServletResponse를 자동으로 html화 하는 과정이 잘 이루어지지 않는다는 의미인가요? 어떤식으로 어렵다는 건지가 잘 이해가 안가서 질문드립니다.