안녕하세요. 최근 spring-data-jpa 를 공부하다 이상한 순환 참조 오류를 발견했습니다. 그런데 도통 납득이 되지 않아 여쭤보고자 질문 드립니다. spring-data-jpa 를 사용하기 전, 저는 주로 MyBatis 를 아래처럼 주로 사용했습니다. // 주로 mybatis interface 인 mapper 를 먼저 선언하고 @Mapper public interface MyBatisMapper {/* ... */} /* ------------ */ // DAO 객체에 주입해 사용하는 형태로 사용했습니다. @Repository public class MyBatisRepo { private final MyBatisMapper mapper; public MyBatisRepo(MyBatisMapper mapper) { this.mapper = mapper; } /* 생략 */ } 그래서 JPA 에서도 이처럼 사용해 볼까 하는 마음에 연습하던 중, 순환참조 오류가 발생하였습니다. 아래는 spring-data-jpa 에서 오류가 발생한 코드입니다. TestEntity : 연습용 엔티티 @Entity public class TestEntity { @Id private Long id; } DAO 인터페이스 : repository 규약 public interface TestRepo { // 연습용이라 텅 비어있습니다. } JPA 인터페이스 public interface JPATestRepo extends JpaRepository<TestEntity, Long> { // 연습용이라 텅 비어있습니다. } Repository 구현체 @Repository public class JPATestRepoImpl implements TestRepo { private final JPATestRepo jpaRepo; public JPATestRepoImpl(JPATestRepo jpaRepo) { this.jpaRepo = jpaRepo; } // 연습용이라 이후 아무 내용도 없습니다. } 실행시 발생하는 에러 2024-10-19T19:46:00.760+09:00 WARN 66384 --- [testing] [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'JPATestRepoImpl' defined in file [/~~~/Desktop/Coding/testing/build/classes/java/main/core/testing/JPATestRepoImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'JPATestRepoImpl': Requested bean is currently in creation: Is there an unresolvable circular reference? 2024-10-19T19:46:00.761+09:00 INFO 66384 --- [testing] [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-10-19T19:46:00.762+09:00 INFO 66384 --- [testing] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-10-19T19:46:00.807+09:00 INFO 66384 --- [testing] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2024-10-19T19:46:00.811+09:00 INFO 66384 --- [testing] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-10-19T19:46:00.825+09:00 ERROR 66384 --- [testing] [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: ┌──->──┐ | JPATestRepoImpl defined in file [/~~~/Desktop/Coding/testing/build/classes/java/main/core/testing/JPATestRepoImpl.class] └──<-──┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true. Process finished with exit code 1 콘솔 에러에 따르면 JPATestRepoImpl 가 자기 자신을 의존해 순환참조가 발생한다고 합니다. 하지만 JPATestRepoImpl 는 (코드에서 볼 수 있듯이) JPATestRepo 를 주입받을 뿐, 자기자신을 의존하고 있지 않습니다. 게다가 더 혼란스러운 점은 만약 JPATestRepoImpl 의 이름을 다른 것으로 바꾸면 (예를 들어 TestRepoJPAImpl) 거짓말처럼 순환 참조 오류가 없어집니다. 제가 추측하기로는 스프링이나 JPA 가 bean 이름을 헷갈려 발생하는 오류 같은데, 이를 헷갈려 하는 이유를 도통 모르겠습니다. 당연히 컴퓨터 재시작, 프로젝트 clean, rebuild, 프로젝트 재생성해 시도해봤지만 모두 같은 현상이 나타납니다. 도대체 어떤 이유 때문에 이런 현상이 일어나는 걸까요...? Github repo : https://github.com/jbw9964/testing
현재 oauth2Login api를 사용해서 사용자 로그인 인증에 성공하면 인증객체가 세션에 저장되고, 이후 인가서버에 code 요청시 OAuth2AuthorizationEndpointFilter 에서도 securityContext에 저장돼있는 인증객체로 인해 인증성공으로 판단후 code를 발급합니다. 근데 세션 기반이 아닌, jwt 토큰을 받아서 검증후 인증을 처리하는 로직이라면 jwt 토큰을 검증하는 필터인 resource Server api의 필터가 OAuth2AuthorizationEndpointFilter 보다 뒤에 있기 때문에 인증객체가 없어서 코드발급을 안해줄텐데 이럴땐 어떻게 해야하나요? jwt토큰을 검증하고 인증객체를 만드는 필터를 OAuth2AuthorizationEndpointFilter 앞에 만든다고 쳐도 그러면 resource Server api의 필터와 똑같이 동작하는 필터가 생기는건데 좋은 방법인것 같진 않습니다. 어떻게 해야 하나요?
클라이언트가 인가서버에게 인가코드를 요청하기 전에 사용자인증을 받기 위해 사용자 id, 비밀번호를 입력하는 단계가 먼저 거치고, 인증이 되면 인가서버에게 /oauth2/authorize url로 response_type=code ~~ 이런식의 정보를 포함해서 요청하게 되는데 그러면 사용자가 인증받을때 입력한 사용자 id, 비밀번호를 통해 인증처리를 하는건 인가서버에서 하는게 아닌건가요? 인가서버에서 하는거라면 입력한 사용자 id, 비밀번호는 어떤 필터에서 처리하는건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 스캐너 사용한 여러 문제풀이시 전부 같은 에러코드로 컴파일이 되지 않는데요.강사님이 쓰신 코드와 완전히 같은데도 말이죠. 어떻게 해결 하나요 ?
이유가 뭘까요 ....? import java.util.Scanner; class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int count = 1; int startIndex = 1; int endIndex = 1; int sum = 1; int n = sc.nextInt(); while(endIndex != n) { if(sum == n){ count++ ; endIndex++ ; sum = sum + endIndex; } else if(sum > n) { sum = sum - startIndex; startIndex++ ; } else { endIndex++ ; sum = sum + endIndex; } System.out.print(count); } } }
안녕하세요. 혹시 답을 SELECT * FROM 제품 WHERE 단가 < (SELECT AVG(단가) FROM 제품); 으로 해도 상관 없을까요? 질문은 동영상 강의에 들어가서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그래야 어떤 강좌에서 질문하셨는지 알 수 있습니다. 영상에서 몇 분 몇 초 대를 알려주셔야 제가 한 번에 질문 내용 확인이 가능합니다. 이미 다른 누군가가 질문을 한 이력 이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁드립니다. 학교의 과제나 타 강사의 코드 등 외부 수업 자료에 대해서는 답변하지 않습니다. 제가 다루는 커리큘럼 외의 이론이나, 너무 디테일한 컴퓨터 이론에 대해서는 답변 드리지 않습니다. 시험에 안 나오는 경우가 많고, 나와 봤자 1문제 나오는데 외워야 할 부분이 많은 것 등 (예시: 서브넷 마스크 계산) 질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요.
[질문 내용] 안녕하세요 항상 좋은 강의 감사드립니다. 영한님께서는 this를 무조건 붙이는 방법론에 대해서 추천하시지 않는다고 하셨는데, 그럼 this의 사용을 피하기 위해 의도적으로 변수명을 다르게 지으시는지 여쭤보고 싶습니다. 코드는 깔끔해지겠지만 오히려 헷갈리는 상황이 발생할수도 있겠다는 생각이 들어 여쭤봅니다! 감사합니다!
질문은 동영상 강의에 들어가서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그래야 어떤 강좌에서 질문하셨는지 알 수 있습니다. 영상에서 몇 분 몇 초 대를 알려주셔야 제가 한 번에 질문 내용 확인이 가능합니다. 이미 다른 누군가가 질문을 한 이력 이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁드립니다. 학교의 과제나 타 강사의 코드 등 외부 수업 자료에 대해서는 답변하지 않습니다. 제가 다루는 커리큘럼 외의 이론이나, 너무 디테일한 컴퓨터 이론에 대해서는 답변 드리지 않습니다. 시험에 안 나오는 경우가 많고, 나와 봤자 1문제 나오는데 외워야 할 부분이 많은 것 등 (예시: 서브넷 마스크 계산) 질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요.
강의 커리큘럼 내 잘 안나오는 문법에서 설명해주신 쉬프트 연산자는 a = 5 // 0101 result = 5 << 1 // 1010 이렇게 2진수의 자릿수는 안바뀌었는데 기출문제 풀이는 v3 = 11101 v3 << 2 = 1110100 으로 왼쪽 자릿수가 지워지지않고 뒤에 00만 더 붙는 형식이어서 헷갈립니다. 2만큼 왼쪽 자릿수를 지우고 미는거라고 이해했었는데 자릿수가 유지되는 기준이 궁금합니다
5분에 나오는 문제에서 main 함수의 2번째 라인을 실행할 때, B의 생성자가 호출되면 A의 생성자도 자동으로 호출되어서 출력값이 XAABY가 되는 줄 알았는데 아니네요... 자식이 태어날 때 부모가 태어나는 경우에 해당이 안 되는 건가요? 22분에 나오는 문제에서는 자식 클래스 기본 생성자 맨 윗줄에 this(20)을 명시적으로 호출했는데도 부모 기본 생성자를 먼저 호출하네요 무슨 차이인가요?
자식이 태어나기 전 부모가 무조건 태어나야한다고 했었는데, 여기서는 이미 child(){ 안에 super();이라고하는 부모 생성자를 호출하고있어서 사실상 의미가 중복되어 한번만 태어나는 것인가요? 아니면 (자식이 태어나기 전 부모가 무조건 태어나야한다고 )<- 이 말은 업캐스팅에서만 해당되나요?
안녕하세요 강사님, 해당 강의 6분에서 나오는 static + 업캐스팅 예외 문제에 대해서 질문드립니다. static이 붙은 경우 앞에 있는 Type을 따라간다고 하셨는데, 해당 문제에서 Parent a = new Child(); 부분의 코드가 Child a = new Child(); 이렇게 바뀌었다고 가정하면 a.f(); 를 실행했을 때 자식 메서드의 f가 실행되어서 값이 fc가 출력되나요?