학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. model.addAttribute 하고 안에 값 넣었는데 이게 안먹네요 어떻게해야 해결할 수 있을까요? import 구문 따로 넣는게 있나요?
발생하는 장점을 다음과 같이 설명해주셨는데요. 1. new 한 번으로 모든 곳에서 재사용 가능 2. 의존성 주입으로 몽땅 한꺼번에 변경 가능 다음과 같은 예시를 들어주셨는데, ProductController의 constructor에서 this.cashService = new CashService() 와 같은 사용을 하면 constructor에서 변경점을 가져가고 해당 클래스의 모든 함수에서는 this.cashService를 통해 사용할 수 있고요. class ProductController { cashService constructor() { this.cashService = new CashService() } } CashService 대신 CashService2로 변경하고 싶을때는 다음처럼 변경하면 2번 장점도 동일해지구요. class ProductController { cashService constructor() { //this.cashService = new CashService() this.cashService = new CashService2() } } 의존성 주입을 통해 얻을 수 있는 이점은 위와 같은 재사용이나 변경에 대한 장점보다도 말 그래도 의존성을 없애는 것에 있다고 보는데요. 의존성 주입을 통해 ProductController에서 구현체인 CashService에 대한 의존성을 없애고, 외부에서 CashService에 대한 의존성을 가져갈 수 있게 되니까요. CashService에 대한 코드의 변경으로 인한 ProductController의 코드 변경이 발생하지 않도록 하는 것이 의존성 주입의 핵심이라고 보는데, tight-coupling을 왜 loose-coupling으로 변경해주어야 하는지에 대한 설명은 없었던 거 같아서요. 이 부분에 대해 어떻게 생각하시는지 궁금합니다!
[질문 내용] 여기에 질문 내용을 남겨주세요. 1. Tasks - other에 compileQuerydsl이 없어서 compileJava를 눌러서 했는데 괜찮은지 ?? 2.강사님과 다르게 build /generated 이렇게 생성되어도 문제가 없는지? 저런식으로 Q파일들이 생성되었는데 import가 안되고 사용이 안되는 이유 알려주시면 감사하겠습니다.
TypeORM을 이용한 소프트 삭제에서 softRemove와 softDelete를 이용하는 방법 두가지가 있는데, 강의에서는 softDelete를 이용하는 경우에 대해 설명을 해주셨는데요. softRemove를 하는 경우에도 entity에 똑같이 @DeleteDateColumn 으로 deleteAt을 추가해주면 되나요? @RemoveDateColumn은 내장되어 있지 않은것 겉더라구요.. 그리고 softRemove 에서는 .affected 가 안되던데 true 나 false로 리턴받을 수 있는 방법이 있을까요?
안녕하세요. express 에서 rest 방식에서는 API를 생성할 때, get이나 post 등의 메소드 방식을 정하고 주소를 지정하여 프론트엔드에서 fetch 나 axois 함수에 주소를 기입하여 API 요청을 했었습니다. graphQL 방식의 nestjs에서는 프론트엔드에서 API 요청을 보낼 때 어떤 방식으로 하나요? 따로 주소 같은 것을 지정해주지는 않는 것같은데.. 똑같이 fetch 나 axois 함수를 통해 요청을 하는 건가요?
[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
spring 버전으로 springfox대신 springdoc을 사용했습니다. 따로 코드상 오류는 안나지만 서버를 실행시키면 에러가 뜹니다. SwaggerConfig.java 에러내용입니다. 023-08-04 18:21:26.795 ERROR 8588 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.example.demo.DemoApplication]; nested exception is java.lang.IllegalArgumentException: Unresolvable class definition for class [org.springdoc.core.conditions.MultipleOpenApiSupportCondition] at org.springframework.context.annotation.ConfigurationClassParser.processImports( ConfigurationClassParser.java:609 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassParser.access$800( ConfigurationClassParser.java:110 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.lambda$processGroupImports$1( ConfigurationClassParser.java:812 ) ~[spring-context-5.3.25.jar:5.3.25] at java.base/java.util.ArrayList.forEach( ArrayList.java:1541 ) ~[na:na] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports( ConfigurationClassParser.java:809 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process( ConfigurationClassParser.java:780 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassParser.parse( ConfigurationClassParser.java:192 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions( ConfigurationClassPostProcessor.java:331 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry( ConfigurationClassPostProcessor.java:247 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.support .PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors( PostProcessorRegistrationDelegate.java:311 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.support .PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors( PostProcessorRegistrationDelegate.java:112 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.support .AbstractApplicationContext.invokeBeanFactoryPostProcessors( AbstractApplicationContext.java:746 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.support .AbstractApplicationContext.refresh( AbstractApplicationContext.java:564 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh( ServletWebServerApplicationContext.java:147 ) ~[spring-boot-2.7.8.jar:2.7.8] at org.springframework.boot.SpringApplication.refresh( SpringApplication.java:731 ) ~[spring-boot-2.7.8.jar:2.7.8] at org.springframework.boot.SpringApplication.refreshContext( SpringApplication.java:408 ) ~[spring-boot-2.7.8.jar:2.7.8] at org.springframework.boot.SpringApplication.run ( SpringApplication.java:307 ) ~[spring-boot-2.7.8.jar:2.7.8] at org.springframework.boot.SpringApplication.run ( SpringApplication.java:1303 ) ~[spring-boot-2.7.8.jar:2.7.8] at org.springframework.boot.SpringApplication.run ( SpringApplication.java:1292 ) ~[spring-boot-2.7.8.jar:2.7.8] at com.example.demo.DemoApplication.main( DemoApplication.java:15 ) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:62 ) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43 ) ~[na:na] at java.base/java.lang.reflect.Method.invoke( Method.java:566 ) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run ( RestartLauncher.java:49 ) ~[spring-boot-devtools-2.7.8.jar:2.7.8] Caused by: java.lang.IllegalArgumentException: Unresolvable class definition for class [org.springdoc.core.conditions.MultipleOpenApiSupportCondition] at org.springframework.util.ClassUtils.resolveClassName( ClassUtils.java:331 ) ~[spring-core-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConditionEvaluator.getCondition( ConditionEvaluator.java:124 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConditionEvaluator.shouldSkip( ConditionEvaluator.java:96 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass( ConfigurationClassParser.java:225 ) ~[spring-context-5.3.25.jar:5.3.25] at org.springframework.context.annotation.ConfigurationClassParser.processImports( ConfigurationClassParser.java:599 ) ~[spring-context-5.3.25.jar:5.3.25] ... 24 common frames omitted Caused by: java.lang.UnsupportedClassVersionError: org/springdoc/core/conditions/MultipleOpenApiSupportCondition has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0 at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na] at java.base/java.lang.ClassLoader.defineClass( ClassLoader.java:1016 ) ~[na:na] at java.base/java.security.SecureClassLoader.defineClass( SecureClassLoader.java:174 ) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass( BuiltinClassLoader.java:800 ) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull( BuiltinClassLoader.java:698 ) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull( BuiltinClassLoader.java:621 ) ~[na:na] at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass( BuiltinClassLoader.java:579 ) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass( ClassLoaders.java:178 ) ~[na:na] at java.base/java.lang.ClassLoader.loadClass( ClassLoader.java:521 ) ~[na:na] at java.base/java.lang.Class.forName0(Native Method) ~[na:na] at java.base/java.lang.Class.forName( Class.java:398 ) ~[na:na] at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass( RestartClassLoader.java:145 ) ~[spring-boot-devtools-2.7.8.jar:2.7.8] at java.base/java.lang.ClassLoader.loadClass( ClassLoader.java:521 ) ~[na:na] at java.base/java.lang.Class.forName0(Native Method) ~[na:na] at java.base/java.lang.Class.forName( Class.java:398 ) ~[na:na] at org.springframework.util.ClassUtils.forName( ClassUtils.java:284 ) ~[spring-core-5.3.25.jar:5.3.25] at org.springframework.util.ClassUtils.resolveClassName( ClassUtils.java:324 ) ~[spring-core-5.3.25.jar:5.3.25] ... 28 common frames omitted
안녕하세요 원두멘토님ㅎㅎ 이런 에러가 계속 떠서 docs와 스텍오버플로우에 검색을 해보니 Passport-jwt를 import하는 것이 아닌 passport-local을 import하는 것이라해서 했더니 다행히 실행이 됩니다. 수업내용에서는 passport-jwt로만 해도 작동이 잘되는 것 같은데 왜 이런 문제가 생기는 것일까요? 그리고 passport-local로 하면 실제 배포에서는 사용 못하는 것이 아닌지 질문을 남깁니다. p.s 재작년에 코캠2기 수료하고 백엔드를 많이 기다렸는데 이렇게 인프런에서 다시 인강으로 뵙게 되서 너무 반갑습니다
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 MemberServiceIntegrationTest 에서 회원가입을 run하는 과정중에, 처음에는 NullPointerException 이 뜨다가, 코드수정만 했는데 이제는 아얘 실행조차 안되고 다음과 같이 오류가 뜹니다 __________________ 위의 오류를 해결하려고 아래와 같이 src/java/main을 소스루트로 지정했습니다 캐쉬삭제도 해보고 이것저것 해봤는데 실행조차 안됩니다 어떻게 고쳐야하나요 ... ㅠㅠ 도와주세요 ..
[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
Spring 3 이상부터는 더 이상 Springfox가 아닌 SpringDoc으로 해야 Swagger 설정을 해줄 수 있습니다. 자세한 내용은 제가 참조한 아래 레퍼런스 확인해보시면 좋을 거 같아요 https://springdoc.org/ https://colabear754.tistory.com/99 https://velog.io/@kjgi73k/Springboot3%EC%97%90-Swagger3%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0 아래는 참고하여 작성한 코드입니다. @Configuration public class SwaggerConfig { @Bean public OpenAPI openAPI(){ return new OpenAPI() .components(new Components()) .info(apiInfo()); } private Info apiInfo() { return new Info() .title("Springdoc 테스트") .description("Springdoc을 사용한 Swagger UI 테스트") .version("1.0.0"); } } @RestController @RequestMapping("/swagger") public class SwaggerController { @Operation(summary = "문자열 반복", description = "파라미터로 받은 문자열을 2번 반복합니다.") @Parameter(name = "str", description = "2번 반복할 문자열") @GetMapping("/returnStr") public String returnStr(@RequestParam String str) { return str + "\n" + str; } @GetMapping("/example") public String example() { return "예시 API"; } @Hidden @GetMapping("/ignore") public String ignore() { return "무시되는 API"; } } NOTE: springdoc.swagger-ui.path 에서 swagger url 기본 경로를 설정합니다. 저는 아래와 같이 /swagger로 접속하게끔 했습니다. # SPRINGDOC springdoc.packages-to-scan=com.example.dateanu.rest_api springdoc.default-consumes-media-type= application/json;charset=UTF-8 springdoc.default-produces-media-type= application/json;charset=UTF-8 springdoc.swagger-ui.path=/swagger springdoc.swagger-ui.disable-swagger-default-url=true springdoc.swagger-ui.display-request-duration=true springdoc.swagger-ui.operations-sorter=alpha
구글 앱 비밀번호 설정 떄문에 막힙니다 2단계 인증했고 앱 비밀번호 생성해서 그걸 구글 비밀번호로 바꾸고 선생님 코드를 잘 따라해서 적었는데 Error: Invalid login: 535-5.7.8 Username and Password not accepted. 라고 에러 납니다 혹시 방법 없을까요?
Java 에서 Final 만 사용할 수 있는게 외부 변수가 메모리에서 해제 되었을 경우, 가비지를 참조할 수 있는 것을 방지하기 위해서로 알고 있는데 코틀린은 이게 가능한게 아예 메모리를 통째로 떠와서 그런걸까요? ㅎㅎ 강의 영상에서 포획한다 라고 표현하신게 그런 의미 같아요!