묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
포폴 데이터모델링, jpa설계하다가 질문 !!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요?? 김영한님 JPA강의 덕에 포폴 순항하고 있습니다. 항상 좋은 강의 감사한 마음을 가지고 있습니다. 파이팅하세요 !!궁금한점을.... 간단하게 설명하려고 노력하겠습니다 !!예를들어서 블로그 포스팅 domain을 아래와 같이 만들었습니다...id: ~~~~content: ~~~~tags: ~~~ (일대다 관계)comments: ~~~(일대다 관계)그런데 !!! 여기서 궁금한점 !!제 생각으로는...아 그냥 편하게 포스팅한번에 끌고와서(tags, comments) 응답해주고 싶은뎅...그런데 영한님께서는 이 강의에서 일대다 관계를 두번이상하면 안된다고 하셔서...ㄷㄷ;;;;그래서, 오랜 고민끝에 포스팅 (id,content,tags)를 응답해주고 comments는 다대일 방법으로 응답을 해줬거든요??.... (이게 옳은방법일까...ㄷㄷ;;)그러니까 요청을 두번 보내는거에요..포스팅 한번... 포스팅에 연관관계있는 comments 한번..저의 이러한 판단과 설계과 괜찮은 걸까요??질문드리고 싶습니다 !! (잘 이해하셨을라나...ㄷㄷ;ㅠㅠ)
-
미해결스프링 시큐리티 OAuth2
userinfo 요청 시 403에러
http://localhost:8080/realms/oauth2/protocol/openid-connect/userinfo포스트맨 요청 시 403 에러가 납니다 버전은 20.0.1입니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
쿠키
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의를 진행하면서 테스트중 계속 회원가입을 하고 쿠키가 넘어가는 현상이 있었습니다. 기존 크롬에 쿠키를 다 지우고 인텔리제이를 끄고 난 후 부터는 정상 작동을 하였는데 혹시 어떤 이유 때문에 그랬는지 알 수 있을까요?
-
미해결스프링 시큐리티 OAuth2
profile email 권한페이지가 나오지 않습니다.
authorization_code 를 얻어오는 요청 보냄login 페이지가 떠서 로그인함email ,profile 등 이걸 허락하겠는가? (저는 이게 안뜹니다.)8081이 안떠있으니 에러페이지code를 복붙해서 access token 요청 -> accestoken 잘받아옴해당 access token 으로 userinfo 요청시 403 forbidden놓친 설정이 있나 확인을 여러번 하였는데 첫번째 강의에서는 Clients 설정에서 Authentication flow 에 implicit flow를 체크하셨는데 2번째 강의에는 해제 되어있길레 해제 해봤지만 결과는 동일합니다.무엇이 문제인지 알 수 있을까요..? jwt.io에서 토큰 정보를 확인했을떄 다음과 같습니다. 제가 안되길레 여러 RoleMapping을 추가해본것입니다.{ "exp": 1668576888, "iat": 1668576588, "auth_time": 1668576573, "jti": "6775c84b-9f26-4d8c-ab58-a09c136eb782", "iss": "http://localhost:8080/realms/oauth2", "aud": [ "realm-management", "account" ], "sub": "f35e128a-f3a9-48df-a784-5675ade34468", "typ": "Bearer", "azp": "oauth2-client-app", "session_state": "4b46d62b-0dbe-41ba-9901-a2465eed5f41", "acr": "1", "realm_access": { "roles": [ "offline_access", "uma_authorization", "default-roles-oauth2" ] }, "resource_access": { "realm-management": { "roles": [ "manage-users", "view-users", "query-groups", "query-users" ] }, "account": { "roles": [ "manage-account", "manage-account-links", "view-profile" ] } }, "scope": "profile email", "sid": "4b46d62b-0dbe-41ba-9901-a2465eed5f41", "email_verified": false, "name": "kakarot lim", "preferred_username": "user", "given_name": "kakarot", "family_name": "lim", "email": "user@keycloak.com" }구글링 해서 알아본 결과 authorization_code를 요청할때 헤더에 scope=openid 로 하니 잘되었습니다. 이건 버전 차이라고 보면 될까요? 저는 도커로 20 버전을 사용하였습니다.
-
해결됨스프링 핵심 원리 - 고급편
ThreadLocalMap.Entry 에 관한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 이번 챕터에서 소개된 ThreadLocal 에 대해 공부하면서 소스코드를 따라가다가 보니 ThreadLocalMap 과 ThreadLocalMap.Entry 까지 찾아보게 되었는데요 ^^;ThreadLocalMap.Entry 가 WeakReference 를 상속받아 사용하는 이유가 별도로 있는지가 궁금합니다.제가 생각해 보았을때..만일 Entry가 WeakReference가 아닌 경우 Thread가 살아있는 한은 해당 ThreadLocal 객체에 Strong Reference가 존재하기 때문에GC에 의한 메모리 회수가 이루어지지 않는 문제가 있어 그런것이 아닐까 싶습니다만, 일반적으로 ThreadLocal을 사용할 때에는private static final ThreadLocal<MyClass> myClassHolder = new ThreadLocal<>();과 같은 형태로 항상 ThreadLocal 인스턴스에 Strong Reference 가 존재하는 형태로 사용하므로Entry가 WeakReference 를 상속받은 의미가 크게 없지 않나 하는 생각이 들어 질문드립니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
RequestResponseBodyMethodProcessor의 역할
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요~요청 매핑 핸들러 어뎁터 구조 16:35 부분 들으면서제가 이해한 게 맞는지 궁금해서 질문 드려요! 요청 메서드에 @RequestBody 또는 @ResponseBody가 있는 경우 RequestResponseBodyMethodProcessor클래스가 호출되며 이 클래스가 ArgumentResolver의 역할을 하기 때문에 강의자료에RequestResponseBodyMethodProcessor (ArgumentResolver)이렇게 써주셨다고 이해했는데요.RequestResponseBodyMethodProcessor클래스가 Response 처리도 하기 때문에 ReturnValueHandler의 역할도 같이 한다고 이해해도 되나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
V4 에서 DTO로 조회시 즉시 로딩이 되는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]V4 에서는 fetch join을 사용하지 않으셨는데 조회 쿼리는 한번만 나가는 것을 확인했습니다. dto로 조회를 하면 Lazy로딩으로 세팅해도 즉시 로딩으로 나간다고 이해하면 될까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Runtime Error log 관련 질문
log를 보면 Runtime error log가 2번 찍히는데,-> 첫번째 요청에서, errorEx() 컨트롤러에 의해 throw new RuntimeException("예외 발생!");-> 첫번째 요청에서, error 발생 이후 WAS로 역전파 되는 과정에서 filter에 의해} catch (Exception e) { log.info("EXCEPTION!!"); throw e;총 2번 찍힌다고 생각했습니다.그런데 Log의 순서를 보면 컨트롤러 내부의 printErrorInfo가 호출되는 과정에서 runtime error Log가 찍힙니다.이것이 단순히 log가 찍히는 속도의 차이에 의한 것인지,아니면 실제로 다른 곳에서 error가 발생해서 log가 찍힌것인지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션타입이라는게...정확히 뭔가요?
컬렉션타입이 었었다 라고 하시는데혹시 컬렉션타입이라는게 @Embeded 와 관련되어 Address 이런 클래스를 일컫는말인가요?
-
미해결스프링 핵심 원리 - 기본편
@Component 가 없는데 @Autowired를 어떻게 쓸 수 있는 거죠?
@Component //<--가 들어가 있어야 Autowired를 쓸 수 있는 거 아닌가요? static class TestBean{ @Autowired(required = false) public void setNoBean1(Member noBean1){ System.out.println("noBean1 = " + noBean1); } @Autowired public void setNoBean2(@Nullable Member noBean2){ System.out.println("noBean2 = " + noBean2); } @Autowired public void setNoBean3(Optional<Member> noBean3){ System.out.println("noBean3 = " + noBean3); } }@Component를 붙여서 빈을 자동등록 하게 되면 수동등록으로 의존관계 주입을 해주는 설정 코드를 쓰지 않기 때문에 Autowired를 붙여서 의존관계 주입을 해주는 걸로 알고 있습니다.그런데 수업 예제에서는 @Component가 없는데 어떻게 Autowired가 붙을 수 있는 건가요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
SpringMemberSaveControllerV1의 process() 파라미터
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! SpringMemberSaveControllerV1의 process()메서드 파라미터에 대한 질문인데요Front Controller를 사용해서 구현할 때서블릿 종속성을 배제하기 위해 Front Controller에서HttpServletRequest의 인스턴스에 담긴 값을 일부러Map에 담아 실제 Cotroller로 옮겨줬다고 이해하고 있는데 @RequestMapping을 사용하면서 다시HttpServletRequest를 사용하는 이유가 궁금합니다. FrontController역할을 하는 Dispatcher가 존재하여 구조는 변하지 않았으나 @RequestMapping을 사용하면 매핑되는 RequestMappingHandlerMapping의 특징으로 URI 요청이 HandlerMapping까지 넘어오기 때문에 일부러 Map에 담아줄 필요없이그대로 HttpServletRequest 인스턴스를 사용하는거라고 생각했는데 맞나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원 수정 API만들떄 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]수업중에 수정관련 API는 변경 감지를 통한 변경이라고 설명을 해주셨고 Entity는 getter외 나머지는 잘 쓰지 않는다는 말씀을 해주셨습니다. 수업중에는 setter를 통한 변경을 하였는데 실무에서는 어떤 방식으로 하는지 궁금해서 질문 올립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
ItemServiceTest 아이템 수정 테스트코드
@Test public void 아이템_수정() throws Exception { // 아이템을 등록하고 수정하고 조회한대로 되었는지 equal 테스트 // given Item book = new Book(); book.setName("책책"); itemService.saveItem(book); // when Item updateBook = itemService.updateItem(book.getId(), "책1", 1000, 10); Item findOne = itemService.findOne(book.getId()); // then Assertions.assertThat(findOne.getName()).isEqualTo(updateBook.getName()); } 아이템 수정 Test 코드를 작성해보았는데 이렇게 작성하는게 맞을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바 코드로 직접 스프링 빈 등록하기
스프링 빈 만드는 법@Controller@Configuration + @Bean
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
argument resolver 관련 질문
LoginMemberArgumentResolver의 supportsParameter 메소드에서 다음 코드를 통해 @Login 어노테이션이 붙은 파라미터의 타입을 체크한다고 강의에서 설명해주셨는데요.boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());위 코드는 파라미터가 Member의 자식 타입인지 조사하하는 건데 그럼 @Login 어노테이션이 Member 자식 타입 파라미터에 붙는 경우 ClassCastException이 발생할 것 같습니다. 따라서 아래와 같이 쓰는 게 맞는 것 같은데 아닌가요?boolean hasMemberType = parameter.getParameterType().isAssignableFrom(Member.class);
-
해결됨재고시스템으로 알아보는 동시성이슈 해결방법
낙관적 락 무한루프 도는 이유 공유합니다 !
MySQL을 사용한다면 Isolation Level이 REPEATABLE READ가 기본으로 설정되어 있는데요. 이 때 트랜잭션 안에서 처음 SELECT한 값은 트랜잭션이 끝나기 전까지 몇 번을 다시 SELECT해도 동일한 값으로 읽게 됩니다. 이것 때문에 문제가 발생하는데요...트랜잭션 안에서 낙관적 락이 진행되도록 구현한 상황에서 쓰레드 100개가 동시에 재고를 감소 시키고, 업데이트에 성공하면 version을 1씩 증가시킨다고 해보겠습니다. DB에는 Stock이 100개 version이 1로 세팅되어 있다고 가정합니다.@RequiredArgsConstructor @Service public class ProductService { private final ProductRepository productRepository; @Transactional public void subtractStockOptimistic(int productId, int quantity){ int updatedCount = 0; while (updatedCount == 0){ Product product = productRepository.findById(productId); product.subtractStock(quantity); updatedCount = productRepository.updateStockOptimistic(product); if (updatedCount <= 0) { //업데이트에 실패한 경우 50ms 대기 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } } } <update id="updateStockOptimistic"> update test_product set stock = #{stock}, version = version + 1 where id = #{id} and version = #{version} </update>쓰레드 100개는 처음에 재고를 읽어서 모두 다음 값을 받아옵니다.stock : 100, version : 1제일 빠른 트랜잭션이 업데이트를 성공하고 DB는 다음과 같이 변합니다.stock: 99, version: 2이제 나머지 99개의 트랜잭션은 version이 다르므로 모두 업데이트에 실패하게 됩니다.업데이트에 실패하게 된 트랜잭션들은 재시도를 하게 됩니다.이 때 DB에서 다시 읽어드린 재고는 stock: 99, version: 2일 것 같지만 실제로는stock: 100, version: 1 를 읽게 됩니다.왜냐하면 여전히 하나의 트랜잭션 안에 들어 있고, Isolation Level이 REPEATABLE READ로 처음 읽은 값을 계속 읽게 되기 때문입니다.따라서 첫 트랜잭션을 제외한 모든 트랜잭션은 무한히 실패하게 됩니다.......따라서 한 트랜잭션 안에서 업데이트와 재시도 로직이 진행되지 않도록 @Transactional을 메소드에서 떼주시면 정상 동작하게 됩니다.혹시 정말 Isolation Level 때문인지 확인하고 싶으신 분들은 DB에 Isolation Level을 READ COMMITTED로 바꾸고 테스트를 진행해보시면 @Transactional이 붙어 있어도 정상 동작하는 것을 확인하실 수 있습니다~!
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
엔티티의 필드가 많을 때 업데이트 방법?
API 개발 기본 - 회원 수정 API해당 강의 시리즈를 들으며 전 강의부터 생겼던 궁금한 사항에 대해 질문을 드립니다. 예제의 경우는 최대한 간단하게 간소화시킨 엔티티를 예시로 들었지만, 필드가 많은 엔티티의 경우에는 어떤 방식으로 업데이트를 하는지 감이 잡히질 않네요. // java @RequestMapping(value = "/v1/edit/{memberId}", method = RequestMethod.PUT) public EditMemberResponse editMemberV1(@PathVariable Long memberId, @RequestBody @Valid EditMemberRequest request) { memberService.update(memberId, request.getName()); ... return new EditMemberResponse(member); }강의 내용 중 위와 같이 업데이트 파라미터에 DTO 필드를 받아 업데이트 하도록 서비스를 작성하셨는데, 단순히 이름만 있는 엔티티 클래스가 아닌 필드가 굉장히 많은 엔티티의 경우에는 어떤식으로 업데이트 처리하는 것이 효율적일지 궁금해서 질문을 드립니다. @Entity public class Temp { @Id @GeneratedValue private Long id; private String field01; private String field02; // ...무수히 많은 필드들 private String field66; private String field67; } 예를들어, 위와 같은 Temp 클래스의 경우를 업데이트 하기 위해 앞서 설명한 방식으로 업데이트 기능을 서비스계층에 구현한다면 아래와 같이 실질적으로 사용이 불가능할정도로 가독성과 생산성이 떨어졌습니다.// java tempService.update( editTempRequest.getField01(), editTempRequest.getField02(), editTempRequest.getField03(), editTempRequest.getField04(), ..., editTempRequest.getField67() ); 아래와 같이 서비스 계층에 EditTempRequest DTO 계층 클래스를 직접 넘기는 방법도 생각을 해보았습니다만, 서비스 계층에서 DTO 클래스를 이용하기 위해 컨트롤러 계층에서 이너 클래스로 선언된 DTO를 별도의 public 클래스로 선언해주어야 되므로 별도의 자바 파일과 패키지를 구성하게 되어 불필요한 복잡도가 증가하는 문제가 발생했습니다. 또한, 단순히 요청, 응답을 위해 데이터를 담는 목적으로 사용되어야 하는 DTO 클래스의 역할과 책임이 확장되는 문제도 생겼습니다.// java import com.wahhahaha.controller.dto.editTempRequest; ... tempService.update( editTempRequest ); 클라이언트 측에서 수정 API를 호출하기 전에 조회 API를 우선 호출하여 각 필드 정보를 가진 상태로 전체 필드를 이용한다면 merge 업데이트로 쉽게 해결이 가능하겠다라는 생각을 해보긴 했지만 merge는 가급적 이용하지 않는 편이 좋다는 전 강의 내용이 있어 혼란스럽네요.
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
hibernate 버전
안녕하세요 영한님, 서포터즈님들이전 Spring Data JPA에서 hibernate 버전으로 인해서 % like 연산이 제대로 동작하지 않아서 버전을 바꿔줬었습니다.그런데 이번 강의에서 hibernate 버전을 변경하지 않아도 테스트가 제대로 동작을 했습니다.제가 알고 있는 바로는 querydsl은 jpql을 사용하기 쉽게, 컴파일 타임 때 에러를 잡을 수 있게 도와주므로 결국 querydsl -> jpql -> jpa -> hibernate 요렇게 진행방식(?)이 된다고 생각했습니다.그러면 저번에 spring data jpa에서 제대로 테스트 되지 않았던 findItem이 querydsl 을 사용할 때도 안되야하지 않나라는 생각이 들어서 질문드립니다감사합니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MVC패턴 적용 동영상 중 똑같이 했는데 에러페이지가 떠서
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.MVC패턴 - 적용15분 07초 의 내용인데요.. 똑같이 작성 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 성공 <ul> <li>id= <%=((Member)request.getAttribute("member")).getId()%> </li> <li>username= <%=((Member)request.getAttribute("member")).getUsername()%> </li> <li>age= <%=((Member)request.getAttribute("member")).getAge()%> </li> </ul> <a href="/index.html">메인</a> </body> </html> 에러페이지가 나와요 ?? 몇번을 확인해봐도 15분 07초 내용과 똑같이 작성했는데 그러네요..그런데 ${ } 로 작성해보면 또 아래와같이 재대로 나와요<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 성공 <ul> <li>id= ${member.id} </li> <li>username= ${member.username} </li> <li>age= ${member.age} </li> </ul> <a href="/index.html">메인</a> </body> </html>질문 : 위에 request.getAttribute로 가져올때 분명 강사님은 제대로 실행했는데 전 왜 똑같이 따라했는데 안되고 ${ } 방법으로 했을때만 제대로 실행될가요??
-
미해결스프링 시큐리티 OAuth2
clientRegistration이 null로 뜹니다.
디버그 모드 상태에서 보면, clientRegistrationRepository에 객체가 존재하고, 관련 설정값들이 확인이 되고있는데, 이것이 변수에 저장되지 못하고null이 되고 있습니다.따라서, clientId 같은 속성들도 확인이 불가능 합니다.컨트롤러에서는 해당 의존성을 사용하지 않으면 일단 기능은 작동되니 사용하고있지 않으나,컨트롤러에서 clientRegistration를 사용할수 없는 상황입니다.