묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
orphanRemoval=true, 고아 객체 질문
안녕하세요~findParent.getChildList().remove(0);강의에서 설명주신 위 코드에 대해 추가 질문이 있습니다.컬렉션에서 첫번째 child 엔터티를 제거한 경우에 고아 객체가 되어 delete 쿼리가 실행되는 것으로 이해를 했는데요.@OneToMany(mappedBy = "XXX", orphanRemoval = true)orphanRemoval만으로는 delete 쿼리가 실행되지 않고, cascade = CascadeType.PERSIST가 함께 실행된 경우에만 delete 쿼리가 실행되더라구요.@OneToMany(mappedBy = "XXX", orphanRemoval = true, cascade = CascadeType.PERSIST)혹시 orphanRemoval 설정만으로는 영속성 전이가 일어나지 않고 cascade = CascadeType.PERSIST을 추가해야지만, findParent.getChildList().remove(0); 호출시에 고아객체가 된 child 엔티티의 생명주기까지 영향을 미칠 수 있게 되어 delete 쿼리가 실행이 되는 것인지 여쭤보고 싶습니다.(즉, 'orphanRemoval'과 '영속성 전이' 설정을 독립적으로 봐야하는 것인지 궁금합니다.)감사합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
Pagination 질문드립니다
안녕하세요. pagination관련해서 궁금한 게있습니다.저는 백엔드를 직접 구축하고강의를 수강하고있는데요,Order를 생성하는 provider Ordrer 리스트를 조회하는 Pagination (강의에서 진행한 방식의 Pagination Model)제가 아직 상태관리에 이해가 부족해서 그런지, Order가 생성되면List<OrderModel>에 맞추어 데이터를 담아두고 생성될 때마다 페지네이션을 상속받는 데이터 리스트들이 업데이트 돼야하지 않나하는 생각이 드는데 그렇개 작동되지 않더라구요Order를 생성하고 나서order 리스트를 볼 수 있는 페이지에 오면데이터가 업데이트 되지않습니다.어떻게해야 Creat이후 Read가 업데이트가 되나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] 번외편: AWS로 시작하는 서버 운영
[해결]RDS MySql의 디비를 마이그레이션 하는 과정에서 질문이 있습니다.
먼저 진행한 순서는 아래와 같습니다. AWS RDS(MySQL) 생성 후 퍼블릭 엑세스 가능으로 설정하였습니다.(접속은 MySQL Workbench로 확인하였습니다.)ConnectionString 은 아마존 개발자 안내서와 강의 내 다른 분 질문에 달아주신 답변을 참고하여 작성하였습니다.SharedDB 프로젝트를 시작프로젝트로 설정할 수 있도록 Main 함수를 임시로 복원한후 SharedDBContext.cs 파일의 ConnectionString을 2에서 작성한 내용으로 설정하였습니다.시작프로젝트와 패키지 관리자 콘솔의 기본 프로젝트를 SharedDB로 설정하여 add-migration을 하여 성공하였습니다.이후 update-database 를 실행하면 아래와 같은 에러를 발생하고 진행이 되지 않습니다.위와 관련해서 질문을 정리하자면RDS의 퍼블릭 엑세스를 허용해도 제 개인 PC의 코드에서 직접 마이그레이션 하려면 ConnectionSting 외 코드에 추가적인 작업이 필요한가요?제 개인 PC에서 RDS를 마이그레이션 하려면 RDS에서 추가적으로 설정해야할 권한 등이 있을까요?(현재 보안 그룹은 강의에서 나온 모두 다 열어둔? 상태입니다.) 혹시 저와 같은 이상한? 삽질을 하시는 분이 있을까 해서 해결한 방법을 공유드립니다.NuGet 패키지 관리자에서 마이그레이션하고자 하는 프로젝트에 MySql.EntityFrameworkCore를 설치하였습니다.ConnectionString을 다음과 같이 수정하였습니다. @"Server=[DB 엔드포인트];port=[포트];database=[DB 이름];uid=[사용자 이름];pwd=[비밀 번호]";아래의 OnConfiguring 함수를 다음과 같이 수정하였습니다.(대소문자 주의)기존의 마이그레이션 폴더들을 정리해줬습니다. 기존에 마이그레이션 정보들이 남아있으면 충돌나면서 update-database 시 실패를 하는 것 같습니다. 항상 최초의 마이그레이션으로 실행을 하네요. 주소가 달라서 그런가?MySQL Workbench에서 확인해줍니다.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
AAPCS 관련 질문 드립니다.
안녕하세요. 강사님.강의 잘 보고있습니다.실습 진행 중 궁금한게 있어서 질문 남깁니다.아래 그림은 result = max(b, a); 를 실행하기 전 레지스터입니다.아래 그림은 max 어셈블리 함수 내용입니다.bx lr가 실행되기 전까지 레지스터 상태를 보면 별 문제 없어보이는데요.문제는 저 라인이 실행한 후입니다.레지스터 셋을 보시면 갑자기 r3값이 변하는 것을 확인할 수 있습니다. AAPCS를 보면 result값은 r0 또는 r1인데 말이죠.제 함수에 문제가 있어보이지는 않는데 무엇이 문제인지 혹시 알 수 있을까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
안녕하세요. 다른 풀이도 풀었는데 괜찮을까요?
정답은 제대로 나오긴 했는데 시간 초과라던가 하는 문제가 없을까요?4중 for문은 생각지도 못했네요..ㅠㅠ sudoku = [list(map(int, input().split())) for _ in range(9)] def solution(sudoku): length = len(sudoku) a, b, c, = list(), list(), list() # 행열 검사 for i in range(length): row, col = list(), list() for j in range(length): row.append(sudoku[i][j]) col.append(sudoku[j][i]) if len(set(row)) != 9 or len(set(col)) != 9: return "NO" # 3x3 격자판 검사 a.extend(row[0:3]) b.extend(row[3:6]) c.extend(row[6:]) if i == 2 or i == 5 or i == 8: if len(set(a)) != 9 or len(set(b)) != 9 or len(set(c)) != 9: return "NO" a, b, c, = list(), list(), list() return "YES" print(solution(sudoku))
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
조회시 count 쿼리에 대하여
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 제가 영한님 강의를 보고 혼자 간단한 프로젝트를 진행해보고 있는데, Order 조회시 OrderItem과 같은 List의 갯수를 알고 싶어 count 쿼리를 사용하려고 합니다.이때, 1. JPA에서 DTO 직접 조회가 아닌 fetch join 하여 엔티티로 조회한 이후에 count 값 (갯수)를 얻을 수 있을까요??그리고 2. 컬렉션 페치조인은 1개만 가능하다 하였는데, 예를 들어 Order에 OrderItem 과 List가 하나더 추가 되었을 때, 각 리스트의 count 갯수를 알고싶으면 DTO직접 조회에서 count 쿼리를 사용하는게 맞을까요?항상 강의 잘 듣고있습니다. 감사합니다
-
해결됨자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
[생애 최초 JPA 사용하기]로 넘어가기 전 Mybatis 공부..? 관련 질문입니당(3번질문 추가)
안녕하세요 공부하는 개발자 최태현님!강의가 너무 재밌어서 23강까지 후딱 와버린 지금, 두번째 질문 드리게 되었네요 ㅎㅎ오늘도 감사한 마음을 가지고 바로 본론으로 넘어가보도록 하겠습니다~(2월 26일 오전 11시 50분 3번질문 추가)22강까지 마치고 나서 데이터 접근 기술에 대해 더 알아보았는데요!크게 아래와 같은 5가지 기술을 사용하고 있다고 하더라구요SQLMapperJDBC TemplateMyBatisORM 기술JPA, HibernateSpring Data JPAQuerydsl이 중, JDBC Template과 JPA쪽은 본 강의에서 다루고 있고 Querydsl은 [실전!코틀린과 스프링부트로 도서관리 애플리케이션 개발하기(Java프로젝트 리팩토링)]에서 배울 수 있는 것 같은데,, MyBatis 같은 경우는 따로 다루고 계신 것 같지 않아서 독학으로 해보고자 하고 있는 상태입니다..ㅠ그래서 문의 드리고자 하는 부분은,MyBatis를 따로 강의에서 다루지 않으신 이유!도서관리 애플리케이션에 MyBatis를 적용해보려면?2-1. 혹시 강의 내용에 업데이트 해주실 수 있으신지...!?(영상이나 문서등의 강의자료)MyBaits 검색하다보니 DAO & VO 같은 것들을 보게되었는데, 본 강의에서 배운 [외부 API 호출- DTO | Controller - Service - Repository - 데이터베이스]것과 유사해보이는데, 어떤 차이가 있는지 궁금해요!크게 이렇게 3가지 입니다... 사실 2번(+2-1)은 조금 양심에 찔리는 문의 내용같기도 하네요 ㅠ2번은 사실 스스로 찾아서 적용해보는 노력으로 얻는 결과가 제일 본인에게 도움이 되는 것을 알고 있으나,, 생각보다 이게 쉽지 않더라구요 ㅠㅠ.. 계속 시도하다가 답답해진 마음을 조금 담아 이렇게 문의 글 드려봅니다..!!오늘도 질의응답 퀄리티마저도 훌륭한 태현님의 강의를 들으며 공부 이어가고 있겠습니다~미리 답변 감사드리며, 행복한 하루 보내시길 바랄게요~!감사합니다 행복하세요~
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
강의 순서
안녕하세요현재 스프링 MVC 1편을 수강중입니다.강의만 듣다보니 제가 직접 뭔가 만들어보면서 내용들을 익히고, 개발 과정에 대해 좀 더 파악하고 싶어졌습니다. MVC 2편과 DB 2편을 제외한 MVC 1편, DB 1편까지만 듣고 간단한 프로젝트를 진행한 다음에 나머지 2편들을 수강하여도 문제가 없을까요?
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
1068번: 트리
제가 다음과 같이 코드를 작성했는데,100%까지 가다가 틀립니다.. 어떤게 문제일까요? 반례를 제시해주실 수 있나요?감사합니다. https://www.acmicpc.net/problem/1068 import sys input = sys.stdin.readline n = int(input()) g = list(map(int, input().split())) m = int(input()) cnt = 0 def DFS(x): g[x] = -1 for i in range(n): if g[i] == x: DFS(i) DFS(m) for i in range(n): if g[i] != -1 and i not in g: cnt += 1 print(cnt)
-
미해결[리뉴얼] 타입스크립트 올인원 : Part2. 실전 분석편
axios 파트 첫번째 강의 질문입니다
axios 파트 첫번째 강의에서 AxiosInstance인터페이스가 Axios클래스를 상속하기 때문에 new axios() 이렇게도 쓸수 잇다고 말씀하셧는데 실제로 사용 해보려고 하니깐 config파라미터가 옵셔널 파라미터 인데도 에러가 떠서 비슷한 다른 코드(인터페이스가 클레스를 상속하는 코드)로 테스트 해봤는데도 해당 방식으로 사용 되지 않더라고요....TS에서 클래스는 객체를 생성하는 설계도로써의 역할도 수행하지만 그 자체로 타입의 역할도 수행하기에 인터페이스가 클래스를 상속할 경우에 클래스의 타입으로써의 역할만 상속, 즉 클래스의 생성자는 상속하지 않는다고 판단 했는데 혹시 제가 미처 생각 못하고 있는 부분이 잇을까요?
-
해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
'수업 노트를 확인해 주세요 :)'의 수업노트 위치가 어디인가요?
'첫 시작' 챕터 영상 레이아웃의 하단에 '수업 노트를 확인해 주세요 :)'가 있는데 해당하는 수업노트가 어디 있는건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
errorPage500Api 함수 내에서 ex 가 null 로 return 되네요.
errorPage500Api 함수 내에서 ex 가 null 로 return 되어 postman 결과가 json 으로 오지 않고 body 가 비었습니다. 오류는 아래와 같네요. java.lang.NullPointerException: Cannot invoke "java.lang.Exception.getMessage()" because "ex" is null at hello.exception.servlet.ErrorPageController.errorPage500Api(ErrorPageController.java:39) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[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:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[spring-web-6.0.5.jar:6.0.5] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[spring-web-6.0.5.jar:6.0.5] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.5.jar:6.0.5] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.5.jar:6.0.5] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:705) ~[tomcat-embed-core-10.1.5.jar:6.0] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.5.jar:6.0.5] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.5.jar:6.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.5.jar:6.0.5] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.5.jar:6.0.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.5.jar:6.0.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.5.jar:6.0.5] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:443) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:367) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:295) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:372) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:296) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:153) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:859) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1734) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.5.jar:10.1.5] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]2023-02-26T09:40:16.190+09:00 ERROR 54414 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[exceptionType=java.lang.RuntimeException, location=/error-page/500] 어떻게 수정가능할까요?
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
Kafka Docker-compose기동시 connect는 어떻게 설정하나요?
안녕하세요!Kafka Docker-compose기동시 connect는 어떻게 설정하나요?강의내용에는 이 부분이 생략된 것 같아서 질문합니다!
-
미해결타입스크립트 입문 - 기초부터 실전까지
ts language server 업데이트 방법이있나요??
"함수 타입- 파라미터를 제한하는 특성" 강의에서 , 강사님이 js 파일과 ts파일 왔다갔다하니까 해결하셨던데 단축키라던가 쓰신건지 궁금합니다.
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
질문이 있습니다
치킨 당첨자 부분에 winner[0]을 대입하셨는데,리스트 값이라면 [] 해당 괄호도 같이 출력해야 하는 것 아닌가요???밑에는 []가 출력되고 위에는 출력되지 않는 이유가 궁금합니다ㅜ,,하나든 여러개든 리스트라면 []가 출력되어야 한다고 생각해서요 ㅠ_ㅠ 답변 부탁드릴게요!!
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
2-S (1325번 - 효율적인 해킹) 문제 질문 드립니다.
안녕하십니까, 큰돌님! 2-S (1325번 - 효율적인 해킹) 문제 질문 드립니다.문제 예시는 통과하는 데 코드 제출시 계속 출력초과가 떠서 질문 드립니다.하기 아래 링크는 제 풀이 입니다.http://boj.kr/6fbef53ab3694838859828bf2a71d964 항상 좋은 가르침을 주셔서 감사합니다.
-
해결됨코딩은 실전이다! - Git알못을 위한 깃린이코스(Git, Github 실습위주)
깃질문
안녕하세요 혹시 branch 활용 실전편에서 메인 브랜치는 a파일내에 d라는 코드였고 gitrini 브랜치는 a라는 파일에 c라는 코드와 새로운 파일에 q라는 코드였는데요이런경우에 merge하면 a라는 파일 내에 겹치는 부분이 d하고 c인데 이런 경우는 그냥 메인브랜치의 a 파일의 d가 gitrini브랜치의 a라는 파일에 있는 c라는 코드대신 수정되는건가요?
-
미해결스프링 배치
스키마설정
안녕하세요 강의 초반이지만 대박강의네요 질문이 하나 있습니다배치 설정중에 initialize-schema: never네버라는 설정은 누가 실수로 스키마를 사용할까봐안전 장치용으로 만들어진건가요??(개인적인 생각입니다)
-
해결됨스프링 시큐리티
csrf 토큰 시큐리티 6버전 변경사항
안녕하세요 강의 잘 보고있습니다. csrf 토큰 값을 헤더에 넣어서 실습하는 부분 따라해봤는데 잘 안되서 코드를 뜯어봤습니다.이번에 시큐리티 버전이 6으로 올라가면서 csrf 토큰을 인코딩해서 전달하고 이걸 디코딩하는 부분이 영상과 다른것같았습니다. 그래서 기본으로 제공하는 로그인 페이지에서 디버깅을 해보았는데 클라이언트에 전달한 csrf 토큰값이랑 실제 서버가 가지는 csrf 토큰값이 서로 달랐습니다. 이렇게되면 영상에서 보여주신 실습은 제대로 동작하지 않는게 맞나요?해당 사진은 CsrfFilter에서 actualToken을 받아오기 위한XorCsrfTokenRequestAttributeHandler 클래스 내부에 존재하는 resolveCsrfTokenValue 함수의 소스코드입니다.예제 따라하면 항상 마지막에 사이즈 비교하는 부분에서 걸렸습니다.
-
해결됨스프링 핵심 원리 - 기본편
@Configuration과 싱글톤강의를 따라하는데 값이 다르게 나옵니다.
@Configuration 어노테이션 안의 AppConfig 클래스에서 memberService와 orderService에 들어가는 memberRepository 설정이 각각 new로 MemoryMemberRepository를 생성한다 하더라도 그 MemberRepository들은 같은 싱글톤으로 있다는 강의 내용은 전부 이해했습니다.그런데 강의 내용 그대로 따라 코딩을 하였는데 결과값은 각각 다른 MemberRepository를 갖게 되더라구요... 그래서 제가 잘못한 것이 있는지 알 수 있을까 해서 질문드립니다.AppConfig@Configuration public class AppConfig { @Bean public static MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public static DiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } }MemberServiceImplpublic class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }OrderServiceImplpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }ConfigurationSingletonTestpublic class ConfigurationSingletonTest { @Test void configurationTest() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); System.out.println("memberService -> memberRepository = " + memberService.getMemberRepository()); System.out.println("orderService -> memberRepository = " + orderService.getMemberRepository()); System.out.println("memberRepository = " + memberRepository); assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); } }결과제가 강의 내용을 이해한대로라면 저렇게 3개가 같은 MemoryMemberRepository를 가져야 할것같은데 제가 뭔가 잘못 작성한것이 있을까요...?