묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
메뉴얼을 못찾겠어요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]메뉴얼을 보고싶은데 어디있을까요?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
./gradlew build -x test 질문
Exception in thread "main" java.io.IOException: No space left on deviceat java.base/java.io.FileOutputStream.writeBytes(Native Method)at java.base/java.io.FileOutputStream.write(FileOutputStream.java:354)at java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:123)at org.gradle.wrapper.Download.downloadInternal(Download.java:119)at org.gradle.wrapper.Download.download(Download.java:80)at org.gradle.wrapper.Install$1.call(Install.java:83)at org.gradle.wrapper.Install$1.call(Install.java:63)at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)at org.gradle.wrapper.Install.createDist(Install.java:63)at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:63)이런 에러가 뜹니다.. 그 이전과 다르게 진행했던 것은 [ec2-user@ip-172-31-36-164 library-app]$ sudo dd if=/dev/zero of=/swaplife bs=128M count=16여기서 swaplife가 오타가 나서 [ec2-user@ip-172-31-36-164 library-app]$ sudo dd if=/dev/zero of=/swapfile bs=128M count=32swapfile로 바꾸어 다시 진행을 했습니다. dd: error writing '/swapfile': No space left on device29+0 records in28+0 records out이 상태에서 다시 지우고 어떻게 처음부터 시작할 수 있을까요..?
-
해결됨스프링 핵심 원리 - 기본편
MemberApp, OrderApp에 의해 각각 두개의 스프링 컨테이너가 생성됐다 생각하면 될까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.전 섹터의 마지막강의 "스프링으로 전환하기"에서 스프링을 이용해 DI를 적용하면서MemberApp, OrderApp에 각각 ApplicationContext ac = new ... 를 사용했는데 이떄,MemberApp, OrderApp클래스 각각 서로 다른 스프링 컨테이너를 띄었다 생각하면될까요?
-
미해결코틀린 문법부터 실무까지 (실전 자바->코틀린 변환)
서비스, 컨트롤러 질문입니다.
1. 컨트롤러를 변환후 test실행했는데요.com.makers.princemaker.exception.PrinceMakerException: 해당되는 왕자님이 안계십니다.at com.makers.princemaker.controller.PrinceMakerController.getPrinces(PrinceMakerController.kt:31) ~[main/:na] 31번째 라인 소스입니다.@get:GetMapping("/princes") val princes: List<PrinceDto> get() = princeMakerService.allPrince 오류메세지를 자세히 보니 수업시간에 말씀하신부분인거 같은데 정확하게 어딘지 못찾겠네요... ERROR 68014 --- [ Test worker] c.m.p.e.PrinceMakerExceptionHandler : url: /create-prince, message: Validation failed for argument [0] in public com.makers.princemaker.dto.CreatePrince$Response com.makers.princemaker.controller.PrinceMakerController.createPrince(com.makers.princemaker.dto.CreatePrince$Request): [Field error in object 'request' on field 'experienceYears': rejected value [null]; codes [NotNull.request.experienceYears,NotNull.experienceYears,NotNull.java.lang.Integer,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [request.experienceYears,experienceYears]; arguments []; default message [experienceYears]]; default message [must not be null]] 컨트롤러 변환이후 서비스에서 WoundedPrinceRepository해당 파라미터가 not-null인데 null로 설정되어있다고 오류메시지가 나와서 서비스 상단 생성자 부분을 아래와 같이 수정했더니 오류가 사라졌는데 맞게 수정한걸까요?class PrinceMakerService ( private val princeRepository: PrinceRepository, private val woundedPrinceRepository: WoundedPrinceRepository? )
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
프로젝트 생성후 빌드시 에러 발생
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]처음 프로젝트를 생성 후 빌드 했는데 에러가 발생하네요JDK버전을 맞춰주라고 해서 맞췄는데도 에러가 있네요에러 사진 첨부합니다.
-
미해결스프링 핵심 원리 - 기본편
DIP구현 중, AOP과의 이슈가 발생하여 질문 드립니다
안녕하세요! 알려주신 내용을 바탕으로 제 개인프로젝트에 적용해서 리팩토링을 해보고있는데요! DIP를 위배하지않기위해@Getter @Configuration public class IamportConfig {@Value("${secret.sec.key}")private String secretKey ;@Value("${api.api.key}")private String apiKey ;@Bean public IamportClient iamportClient(){ return new IamportClient(apiKey, secretKey); } }이런식으로 IamportConfig를 선언해서 주입을 해주었고실제 코드에는private final PurchaseService purchaseService;private final ItemService itemService;private final IamportClient iamportClient;private final RedissonClient redissonClient;private final JwtUtil jwtUtil;private final IamportConfig iamportConfig;이렇게 선언했습니다!이후 @PostMapping("/api/payment/cancel") private boolean cancelPayment(@RequestBody RefundRequestDto refundRequestDto) throws JsonProcessingException { RestTemplate restTemplate = new RestTemplate(); String url = "https://api.iamport.kr/payments/cancel"; // 요청 파라미터 설정 MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); formData.add("impUid", refundRequestDto.imp_uid()); formData.add("checksum", String.valueOf(refundRequestDto.checksum())); formData.add("reason", refundRequestDto.reason()); // 요청 헤더 설정 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); String token = getAccessToken(new PaymentRequestDto.getToken(iamportConfig.getApiKey(), iamportConfig.getSecretKey())); headers.set("Authorization", "Bearer " + token); // 요청 객체 생성 HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers); // 요청 보내기 ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class); // 응답 처리 if (response.getStatusCode() == HttpStatus.OK) { // 각 아이템에 대해 수량 롤백 진행 purchaseService.rollbackItemsQuantity(refundRequestDto.imp_uid()); // 주문 상태 변경 purchaseService.ChangeStatusToCancelled(refundRequestDto.imp_uid()); return true; } else { return false; } } 이런 코드를 사용하는과정에서 String token = getAccessToken(new PaymentRequestDto.getToken(iamportConfig.getApiKey(), iamportConfig.getSecretKey()));이부분의 iamportConfig 가 null로 나오는 문제가 발생했습니다.다방면으로 답을 찾아보다가 AOP를 전부 주석처리하니까 해결되더라구요. 그래서 AOP의 적용범위에서 해당 컨트롤러를 제외시켰는데 해결이 되었습니다.이를통해 좀 알아보니까 AOP가 실행되는 시점은 새로운 PaymentRequestDto 인스턴스가 생성되기 전 이므로AOP 프록시 객체가 cancelPayment를 감쌀때 PaymentRequestDto는 null이게 된다.(AOP 로직이 @Value로 주입된 프로퍼티 값에 접근하기 전에 실행되어 값을 정상적으로 참조할 수 없는 상황이 발생)라는 결론에 다다르게 되었는데, 제가 잘 이해한게 맞을까요?...!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
controllerV1 사용이유
질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]V3까지 공부하다가 너무 헷갈려서 다시 V1으로 와서 공부하고있습니다. 3분 30초 쯤에 ControllerV1 즉 interface를 사용하는 이유를 들어도 너무 헷갈립니다.각각의 컨트롤러는 인터페이스를 의존하고 프론트컨트롤러는 인터페이스를 통해 request, response를 넘겨주면서 각각의 컨트롤러가 받는 형식으로 생각하고 있었습니다. 근데 정작 왜 사용하는지 제대로 이해를 못하고있는 것 같아 질문드립니다.
-
해결됨스프링 핵심 원리 - 기본편
스프링 빈 상속 관계에서 6분쯤 라이브코딩하는데
강사님과 똑같이 쳤는데 빨간줄이 뜨네요 뭐가 문제일까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
dataSource 우선순위(?)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]ItemServiceApplication에 test일때만 dataSource를 직접 정의해주었는데인메모리 DB가 properties에 정의한 datasource보다 우선되는건가요?h2 서버 끄고 properties는 그대로 둔 채 돌려도 정상작동 하는 것으로 봐선 properties의 datasource는 아예 시도를 안 하는 것 같은데...인메모리가 있으면 무시하고 넘어가는 것인지 궁금합니다!
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
40강 개인 DB 비밀번호만 가리기
안녕하세요 강의 잘 듣고 있습니다.git Push까지 잘 됐는데 github에서 application.yml까지 올라간 것을 확인 했습니다. 여기서 제 비밀번호만 가리고 나머지 설정은 공유하고 싶은데 따로 비밀번호만 분리하는 방법은 없을까요 ?
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
31강 대출기능 개발에서 계속 유저 정보 가져오는곳에서 null이 나오는 이유가 뭘까요..
분명 MySql에 보면 user 테이블에 잘 저장되어 있고 북도 잘 저장되어있는데 왜 계속 null 뜰까요 ㅠㅠ java.lang.IllegalArgumentException: null at java.base/java.util.Optional.orElseThrow(Optional.java:408) ~[na:na] at com.group.libraryapp.service.book.BookService.loanBook(BookService.java:43) ~[main/:na] at com.group.libraryapp.service.book.BookService$$FastClassBySpringCGLIB$$9fdbff4c.invoke(<generated>) ~[main/:na] at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.24.jar:5.3.24] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.24.jar:5.3.24] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.24.jar:5.3.24] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.24.jar:5.3.24] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.24.jar:5.3.24] at com.group.libraryapp.service.book.BookService$$EnhancerBySpringCGLIB$$41338896.loanBook(<generated>) ~[main/:na] at com.group.libraryapp.controller.book.BookController.loanBook(BookController.java:27) ~[main/: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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.24.jar:5.3.24] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.24.jar:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:696) ~[tomcat-embed-core-9.0.69.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.24.jar:5.3.24] at javax.servlet.http.HttpServlet.service(HttpServlet.java:779) ~[tomcat-embed-core-9.0.69.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.69.jar:9.0.69] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.24.jar:5.3.24] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.24.jar:5.3.24] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.69.jar:9.0.69] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션3-2강 타입 오류 질문
강의자료에 있는 코드대로 작성했는데도 계속해서 오류가 납니다ㅠ
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
포워딩오류? 인거 같습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Dynamic Web Prject 템플릿으로 프로젝트 생성후 Spring MVC prj을 수동을 만들었습니다(필요한 xml파일과 폴더를 경로에 맞게 다 생성) 그런데 서버에 올리고 실행해보면 404에러가 납니다..오류내용은 Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지를 밝히려 하지 않습니다.이고 구글검색후 이것저것 수정해봤는데 해결이 안되고있습니다.. https://github.com/hjlim456/springcrud제 깃주소인데 코드좀 봐주시면 감사하겠습니다.ㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서버 시작 시 자동으로 브라우저 실행하기
서버 시작 시 자동으로 브라우저 실행하는 설정이 따로 있나요?
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
orphanRemoval에서 발생하는 쿼리 관련하여 질문드립니다.
안녕하세요.OneToMany 관계에서 orphanRemoval = true 옵션으로 데이터 제거 관련하여 질문드립니다. MemberService.removeAddress() 로직에서 address를 제거하면 select address -> select member -> select address -> delete 순으로 쿼리가 발생합니다. select address 쿼리가 2번 발생하는데, 일반적으로 쿼리 2번을 발생시키면서 고아 객체 제거를 진행하는 걸까요? 아니면 다른 방식의 remove 과정이나 또는 select address 쿼리를 1번으로 줄일 수 있는 방법이 있다면 알려주실 수 있을까요? 감사합니다. @RequiredArgsConstructor @Slf4j @Service public class MemberService { private final AddressRepository addressRepository; @Transaction public void removeAddress(Long addressId) { Address address = addressRepository.findById(addressId) .orElseThrow(() -> new Exception()); Member member = address.getMember(); member.getAddresses().remove(address); } } @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST, orphanRemoval = true) private final List<Address> addresses = new ArrayList<>(); // .. 중략 } @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class Address { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "address_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; // .. 중략 }
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
디버그 메세지가 나오지 않습니다.
application properties에 추가 했는데 디버그메세지가 나오지 않네요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetch_size 크기만큼 null을 다 채워서 보내는데 이유를 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. default_batch_fetch_size: 100 옵션을 주었을 때in 절에 2개의 값만 넣어도 되는 경우에도 size의 크기를 굳이 맞춰서 보내는 문제가 있습니다.예를들어 2개의 id 값만 보내도 된다면 아래와 같이 (1,2,null...) 으로 꼭 100개를 모두 맞춰서 보내게 됩니다.select oi1_0.order_id,oi1_0.order_item_id,oi1_0.count,oi1_0.item_id,oi1_0.order_price from order_item oi1_0 where oi1_0.order_id in (1,2,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);구글에 검색해도 왜 이런 증상이 발생하는지 찾아지지가 않아 문의 드립니다.bulid.gradle 설정은 다음과 같습니다.plugins { id 'java' id 'war' id 'org.springframework.boot' version '3.2.4' id 'io.spring.dependency-management' version '1.1.4'}group = 'jpabook'version = '0.0.1-SNAPSHOT'java { sourceCompatibility = '17'}configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5-jakarta' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') { useJUnitPlatform()}
-
해결됨스프링 시큐리티 완전 정복 [6.x 개정판]
Kotlin DSL 활용
import org.springframework.security.config.annotation.web.invoke시큐리티 5.3부터 Kotlin 환경에서 스프링 시큐리티를 사용하실 때 DSL을 지원받을 수 있습니다.공식문서에 나와있습니다.(https://docs.spring.io/spring-security/reference/servlet/configuration/kotlin.html)이 DSL을 사용한 예제 프로젝트도 제공됩니다. (https://github.com/spring-projects/spring-security-samples/tree/main/servlet/spring-boot/kotlin/hello-security) DSL 문 삽입은 IDE의 지원을 받을 수 없어서 위 import 문을 직접 작성해야합니다. @Configuration class SecurityConfig { @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http { authorizeHttpRequests { authorize("/", permitAll) authorize(anyRequest, authenticated) } formLogin {} rememberMe { } sessionManagement { sessionCreationPolicy = SessionCreationPolicy.STATELESS } } return http.build() } } 예를 들면 위와 같이 DSL의 지원을 받아 설정을 구성할 수 있습니다.람다 표현식을 작성하지 않고 설정할 수 있습니다.IDE를 통해 DSL 설정 클래스를 쭉 따라가보면 어떤 파라미터를 전달하면 될지 확인할 수 있는데 이를 참고하면 좀 더 편리하게 설정을 사용할 수 있습니다.다만 일부 설정은 제공되지 않는 것도 있어서 해당하는 부분은 Spring에서 제공되는 API 그대로 사용하셔야합니다.
-
미해결스프링 핵심 원리 - 고급편
쓰레드 로컬 vs 프로토타입 빈
결국 traceID가 서로 다른 쓰레드에서 같은 값을 가지게 되니쓰레드로컬을 이용해서 따로 traceId를 관리 하는거잖아요?그런데 그냥 애초에 Trace클래스 자체의 빈스코프를 프로토타입으로 해버리면각각의 쓰레드가 Trace클래스를 DI받을때마다 쓰레드마다 다른 Trace클래스가 생성되니따로 관리를 할 필요가 없지 않나요?이렇게되면 어떠한 오버헤드가 발생하나요?
-
미해결스프링 핵심 원리 - 고급편
쓰레드 로컬 데이터 저장위치 질문
ThreadLocalLogTrace는 싱글톤이잖아요?그러므로 A와 B에서 참고하는 ThreadLocalLogTrace 참조값은 같은 값을 가리킬꺼같은데,여기서 ThreadLocal<TraceId> 필드는각 A쓰레드 B쓰레드 각각의 공유하지 않는고유의 데이터영역에 저장되는것인가요?(JVM에서 STACK과 PC Register처럼)아니면 일종의 해시함수처럼 작용하여A쓰레드에서의 요청이면 알아서 A의 데이터B쓰레드에서의 요청이면 알아서 B의 데이터를 주는것인가요?만약 전자라면 이게 어떻게 가능한것인지?