묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결견고한 결제 시스템 구축
payment 상태 업데이트 변경 메서드를 3개나 두는 이유가 궁금합니다.
강의 30분 40초에 보시면 success, failure, unknown 이렇게 상태를 변경하면서 메서드를 3개나 두시는데 이유가 궁금합니다. 만약 jpa나 querydsl을 사용한다면 코드가 달라질까요?
-
미해결실전! 스프링 데이터 JPA
save에 관한 질문입니다.
[질문 내용]강사님이 save를 할때는, 데이터가 디비에서 한번 갔다온(디비에서 조회된) 친구들은 수정시 save호출시 merge가 일어난다고 하셨는데, 영속성 컨텍스트에 그 조회한 데이터가 있으면, merge가 안 일어나지 않나욤?? 디비에서 데이터를 가져왔을 때, 해당 데이터의 변경이 일어나면, 그냥 트랜잭션이 끝날때, flush()가 일어나니까, 놔두면 알아서 더티체킹이 일어나서 업데이트가 되는 것으로 알고있습니다.그래서, 한번 테스트로 데이터를 변경시키고, 해당 데이터를 save하니 디비에서 한번 더 select가 안 날라가더라고요. 이랬을땐, 아무것도 안 일어나는 건가여? 그리고 트랜잭션이 끝날때 더티체킹이 일어나서 업데이트가 되는 건가여? 영한님이 말하신 건, 영속성 컨텍스트에 해당 데이터를 clear했을 때를 말하는 건가여? 아래 사진 첨부입니다.@Test public void test(){ Member member = memberRepository.findById(2L).orElseThrow(); member.setUsername("ㅎㅎ"); memberRepository.save(member); } @Test public void test(){ Member member = memberRepository.findById(2L).orElseThrow(); member.setUsername("gg"); em.flush(); em.clear(); memberRepository.save(member); }
-
미해결스프링 핵심 원리 - 기본편
CoreApplicationTests 오류 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 에러 내용현재 CoreApplicationTests를 돌리면 오류가 나서 질문 올려봅니다.잘은 모르지만 고치려고 제 코드와 오류를 살펴보니 MemberServiceImpl과, OrderServiceImpl 둘의 클래스 각각 @Autowired 어노테이션이 적용된 생성자에 주입해지는 MemberRepository 타입 객체가? 빈에 등록된게 두개라 둘 중 뭘 넣지 못한다는 형식의 오류 같습니다. (확실하지 않아서 모르겠어서 질문 드립니다). 시도한 부분자주묻는 질문란에 스프링 부트 3.X 매개변수 이름 인식 문제에 대해서 인식하고 @Autowired 관련 문제 해결방안 3인 인텔리제이의 설정 부분에서 Build and run using를 Gradle로 설정하고 돌려도 똑같더라구요.그래서 아직까지 문제가 정확히 무엇인지 파악하지 못하겠습니다.하단에 에러 메세지와 코드 덧붙였습니다. 한번 봐주신다면 정말 감사하겠습니다. ㅠ 코드압축본https://drive.google.com/file/d/1WdsaN07LSBwaHzlae8WMEj-0wwYnOM5c/view?usp=sharing 에러메세지 (게시글 용량때문에 중요해 보이는 에러만 가지고 와봤습니다) 테스트 실행했을 때 Test Results - CoreApplicationTest - contextLoads의 에러 내용입니다Failed to load ApplicationContext for [MergedContextConfiguration@36681447 testClass = hello.core.CoreApplicationTests, locations = [], classes = [hello.core.CoreApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@192d74fb, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@66ce957f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@efde75f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7894f09b, org.springframework.boot.test.context.SpringBootTestAnnotation@fd6d726d], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@36681447 testClass = hello.core.CoreApplicationTests, locations = [], classes = [hello.core.CoreApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@192d74fb, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@66ce957f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@efde75f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@7894f09b, org.springframework.boot.test.context.SpringBootTestAnnotation@fd6d726d], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,MemberRepository Error creating bean with name 'memberServiceImpl' defined in file [/Users/sun/workspace/intelliJ/spring/study/core/build/classes/java/main/hello/core/member/MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,MemberRepositoryorg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [/Users/sun/workspace/intelliJ/spring/study/core/build/classes/java/main/hello/core/member/MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,MemberRepository Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,MemberRepository
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Whitelabel Error Page로 넘어가는 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]화면상에 오류메시지가 뜨지 않고 Whitelabel Error Page로 넘어가는데 잘못된 부분을 찾을 수가 없어서 질문드립니다.이전 강의에서는 제대로 되었다가 안되었다가 했었는데 이제는 아예 Whitelabel로 넘어가버리네요 다음은 코드입니다.https://drive.google.com/file/d/1hLNHWRMH4_SYUxFWYiLkUdg7O6EEWKuy/view?usp=sharing
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
@RequestBody에 관해서 질문이요.
선생님, 스프1탄 MVC02의 35강을 보고나서 질문드려요.boardUpdate() Ajax에서 클라이언트가 적은 값을 변수 title, content에 초기화 하고, 그 값이 자바스크립트니까 JSON.stringfy로 JSON으로 변경해주고, 컨트롤러에서 @RequestBody로 그 JSON 값을 자바로 변환해서 비즈니스 로직을 해주고 있다.맞나요?근데 insertBoard() 에서도 클라이언트가 적은 값을 fData에 자바스크립트 문자열로 직렬화 해줬는데,어떻게 변환과정없이 비즈니스 로직이 실행되나요?
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 패치 조인은 페이징이 불가능하지만 이 방법은 페이징이 가능하다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)컬렉션 패치 조인은 페이징이 불가능하지만 이 방법은 페이징이 가능하다.이 말이 이해가 안되는게batch size 설정 -> orderItemDto에서 컬렉션을 조회할때 in절을 통해서 하나의 쿼리로 가져오기위함인것이지, 이 orderItemDto에서 페이징처럼 offset을 정해서 가져오고 이런게 불가능한거 아닌가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
spring 공부
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 김영한 선생님이번에 자바를 시작하고, 스프링을 공부하고자 하는 학생입니다.결론부터 말씀드리자면 spring 입문강의가 도저히 이해가 되지 않아서 공부방향에 대해 여쭙고 싶습니다.자바는 충분히 학습하여 어느정도 개념이 숙지되어있는 상태입니다. 그래서 spring을 공부하려고 입문편부터 보니, spring의 개념이 무엇인지, 구조가 어떻게 되는지, 모두 이해가 되지 않습니다. 제가 cs가 부족한 탓일까요? 혹은 기본편에서 모든 궁금증이 해결되는 것일까요? 일단 아직 이해는 가지 않은 채, 코드만 따라 적고있습니다. 어떻게 공부하면 좋을지 말씀 주시면 감사하겠습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
자바, 스프링 버전 달라도 괜찮아요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]스프링 부트 버전이 3.3.2 로 하고 인텔리제이 얼티메이트 쓰고 있고 jdk 17버전으로 하는데 상관없나요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
MemberServiceV3_3Test 질문드립니다.
스프링AOP를 적용하려면 스프링컨테이너가 필요하다고 하셨는데, 그 이유가 프록시객체가 스프링빈으로 스프링컨테이너안에 있어야하고, 이를바탕으로 @Autowired MemberServiceV3_3 memberService; 여기에 스프링컨테이너에 있는 프록시객체의 스프링빈을 의존성주입 해주기위해 라고 이해하면 될까요?
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
H2의 트랜잭션 수행 시간 타임아웃
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]데이터베이스엔 트랜잭션 수행 시간 타임아웃이 보통 설정되어 있고, 설정한 시간을 넘어가게 되면 자동으로 rollback이 된다고 강의에서 말씀하셨는데 H2 DB의 경우 디폴트 시간이 얼만큼인가요? H2 콘솔에서 set autocommit false;insert into member(member_id, money) values ('data3',10000);insert into member(member_id, money) values ('data4',10000); 이렇게 실행하고 커밋은 안 한 다음,주기적으로 SELECT * FROM MEMBER를 해 봤는데 data3, data4에 대한 데이터가 계속 보입니다.
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
38강 .yml
spring: config: activate: on-profile: local datasource: url: "jdbc:h2:mem:library;MODE=MYSQL;NON_KEYWORDS=USER" username: "sa" password: "" driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.H2Dialect h2: console: enabled: true path: /h2-console --- spring: datasource: url : "jdbc:mysql://localhost/library" username : "root" password : "비번" driver-class-name : com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: none properties: hibernate: show_sql: true format_sql: true dialect: org.hibernate.dialect.MySQL8Dialect 2024-08-18 22:03:44.064 INFO 4232 --- [ main] c.g.libraryapp.LibraryAppApplication : Starting LibraryAppApplication using Java 11.0.23 on SeungWon with PID 4232 (C:\Users\Administrator\Desktop\library-app\library-app\build\classes\java\main started by Administrator in C:\Users\Administrator\Desktop\library-app)2024-08-18 22:03:44.064 INFO 4232 --- [ main] c.g.libraryapp.LibraryAppApplication : The following 1 profile is active: "local"제대로 다 작성을 한거같ㅌ은데 로그에 local이라고 나오는데 도서관리 웹으로 가면 이전에 넣어둔 데이터도 그대로 있고, H2WebConsol은 화이트레벨이 뜹니다ㅜ 현재 인텔리제이 무료버전이라 프로파일 바꾸는건 구글랑해서 햤는데 뭐가 문제인가요?
-
해결됨Practical Testing: 실용적인 테스트 가이드
EventListener 단위테스트와, 이벤트가 잘 작동하는지 통합테스트는 어떻게 하는걸까요?
강사님, 안녕하세요! Event 테스트 관련해서 질문이 있습니다!현재 진행하고 있는 프로젝트에서 이벤트를 활용해서 책임을 분리하고자 했는데요.질문을 드리기 전에, 잠깐 이벤트 적용처에 대해 간략히 설명해보자면 아래와 같습니다.현재 제 애플리케이션은 회원이 가입하게되면, 해당 유저와 1:1 연관관계를 갖는 메인계좌도 같이 생성을 해주어야합니다.따라서 회원가입 이벤트가 발생하면 메인계좌를 생성할수 있도록 아래와 같이 이벤트 리스너를 작성해주었습니다.@Slf4j @Component @RequiredArgsConstructor public class MemberSignupEventListener { private final CheckingAccountService checkingAccountService; @TransactionalEventListener(phase = BEFORE_COMMIT) public void createCheckingAccount(MemberSignupEvent event) { log.info("MemberSignupEventListener : 회원 가입 이벤트 발생 수신: 회원아이디 = {}", event.getMemberId()); checkingAccountService.create(event.getMemberId()); } }첫번째 질문으로는, 이벤트가 publish 되었을 때, 이벤트 리스너가 해당 이벤트를 잘 수신하는 지를 어떻게 테스트할 수 있을 지가 궁금합니다.제가 아래와 같이 테스트 코드를 작성해보았을 때,@SpringBootTest class MemberSignupEventListenerTest { @Autowired ApplicationEventPublisher eventPublisher; @MockBean MemberSignupEventListener memberSignupEventListener; @Test @DisplayName("회원가입이 이루어지면 회원가입 리스너가 이벤트를 수신한다.") void when_signup_then_create_checkingAccount() { // given Long memberId = 1L; MemberSignupEvent event = MemberSignupEvent.of(memberId); // when eventPublisher.publishEvent(event); // then verify(memberSignupEventListener).createCheckingAccount(any(MemberSignupEvent.class)); } }실패메시지는 아래와 같았습니다.Wanted but not invoked: memberSignupEventListener bean.createCheckingAccount( <any member.event.MemberSignupEvent> ); -> at member.event.MemberSignupEventListener.createCheckingAccount(MemberSignupEventListener.java:20) Actually, there were zero interactions with this mock.두번째 질문으로는, 회원가입 요청이 들어왔을 때, 메인계좌까지 잘 생성되는 지 통합테스트를 하고자 하는데, 어떻게 할 수 있을지가 궁금합니다.통합테스트 코드는 아래와 같이 작성해보았는데요.회원 레포지토지와 메인계좌 레포지토리에 데이터가 생성됐는 지로 검증하려 했습니다.(http 테스트로는 회원가입 시 회원데이터와 메인계좌가 DB에 생성되는 것을 확인했습니다.)아래 테스트 같은 경우 메인계좌의 DB 내 존재여부가 false로 나오면서 실패했고,이벤트 리스너와 메인계좌 생성 메서드 코드 라인을 잘 따라가는 지 디버그를 찍어봐도, 디버그로는 추적할 수가 없었습니다.@TransactionalEventListener(phase = BEFORE_COMMIT)으로 작성했기 때문에 동기적으로 동작할 것이라 생각했고, 별도의 스레드로 동작하지 않을 것 같은데, 디버그로 왜 추적이 안되는지도 잘 모르겠습니다..@DisplayName("회원 통합테스트") public class MemberIntegrationTest extends IntegrationTestSupport { private static final String URL = "/member"; @Autowired MemberRepository memberRepository; @Autowired CheckingAccountRepository checkingAccountRepository; @Test @DisplayName("회원 가입") void signup() throws Exception { // given MemberSignupRequest request = MemberSignupRequest.builder() .username("testUser") .password("1234") .build(); // when mockMvc.perform(post(URL) .contentType(APPLICATION_JSON) .content(objectMapper.writeValueAsString(request))) .andExpect(status().isCreated()) .andDo(print()); // then assertThat(memberRepository.existsById(1L)).isTrue(); assertThat(checkingAccountRepository.existsById(1L)).isTrue(); } }이벤트 관련해서는 어떻게 테스트할 수 있을까요?실무에서는 보통 어떤 방법으로 진행될까요?---2024-08-19 수정 내용---혹시 jpa.hibernate.ddl-auto를 create-drop으로 해서 그런걸까요..?
-
미해결스프링 시큐리티 OAuth2
client-credentials 방식 accessToken null 이슈
Cannot invoke "org.springframework.security.oauth2.client.OAuth2AuthorizedClient.getAccessToken()" because "oAuth2AuthorizedClient" is null] with root causekeycloak 버전은 : 21.1.2 @GetMapping("/oauth2Login") public String oauth2Login(Model model, HttpServletRequest request, HttpServletResponse response) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); OAuth2AuthorizeRequest oAuth2AuthorizeRequest = OAuth2AuthorizeRequest .withClientRegistrationId("keycloak") .principal(authentication) .attribute(HttpServletRequest.class.getName(), request) .attribute(HttpServletResponse.class.getName(), response) .build(); OAuth2AuthorizationSuccessHandler successHandler = (authorizedClient, principal, attributes) -> { oAuth2AuthorizedClientRepository .saveAuthorizedClient(authorizedClient, principal, (HttpServletRequest) attributes.get(HttpServletRequest.class.getName()), (HttpServletResponse) attributes.get(HttpServletResponse.class.getName())); System.out.println("authorizedClient : " + authorizedClient); System.out.println("principal : " + principal); System.out.println("attributes : " + attributes); }; auth2AuthorizedClientManager.setAuthorizationSuccessHandler(successHandler); OAuth2AuthorizedClient oAuth2AuthorizedClient = auth2AuthorizedClientManager.authorize(oAuth2AuthorizeRequest); model.addAttribute("oAuth2AuthorizedClient", oAuth2AuthorizedClient.getAccessToken().getTokenValue()); return "home"; } keycloak: clientId: oauath2-client-app clientSecret: HPWAsKr9dEy9DPU1babedRmpstowiXOs clientName: oauath2-client-app authorizationGrantType: client-credentials clientAuthenticationMethod: client_secret_basic provider: keycloak <form sec:authorize="isAnonymous()" action="#"> <p><input type="button" onclick="authorizationCode()" value="AuthorizationCode Grant"/></p> <p><div sec:authorize="isAnonymous()"><a th:href="@{/oauth2Login(username='user',password='1234')}">Password flow</a></div></p> <div sec:authorize="isAnonymous()"><a th:href="@{/oauth2Login}">Client Credentials Flow Login</a></div> </form> @Configuration public class AppConfig { @Bean public DefaultOAuth2AuthorizedClientManager auth2AuthorizedClientManager(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository oAuth2AuthorizedClientRepository) { OAuth2AuthorizedClientProvider oAuth2AuthorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder() .authorizationCode() .password() .clientCredentials() .refreshToken() .build(); DefaultOAuth2AuthorizedClientManager defaultOAuth2AuthorizedClientManager = new DefaultOAuth2AuthorizedClientManager(clientRegistrationRepository, oAuth2AuthorizedClientRepository); defaultOAuth2AuthorizedClientManager.setAuthorizedClientProvider(oAuth2AuthorizedClientProvider); defaultOAuth2AuthorizedClientManager.setContextAttributesMapper(contextAttributeManager()); return defaultOAuth2AuthorizedClientManager; } private Function<OAuth2AuthorizeRequest, Map<String, Object>> contextAttributeManager() { return oAuth2AuthorizeRequest -> { Map<String, Object> contextAttributes = new HashMap<>(); HttpServletRequest httpServletRequest = oAuth2AuthorizeRequest.getAttribute(HttpServletRequest.class.getName()); String userName = httpServletRequest.getParameter(OAuth2ParameterNames.USERNAME); String userPassword = httpServletRequest.getParameter(OAuth2ParameterNames.PASSWORD); if(StringUtils.hasText(userName) && StringUtils.hasText(userPassword)) { contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, userName); contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, userPassword); } return contextAttributes; }; } } 이렇게 됩니다. 현재 상황으로 문제가 되어 있는 부분이 없는 것 같습니다.어디부터 다시 확인해야 될지 조언 부탁드립니다.
-
해결됨서버개발자 과제전형 완벽가이드 - 1편
Readme 파일 작성방법
안녕하세요 강사님 좋은 강의 감사드립니다.readme파일을 잘 작성하는 것도 과제전형을 진행하는데 중요한 요소라고 들었는데예제 소스에 작성된 readme 파일 형식으로 실제 과제전형 시에 제출하기에는 조금 부족해보이는데보통 어떤 형식으로 작성하시는 편이신가요? 또는 이 부분은 꼭 들어갔으면 하는 요소가 있을까요?
-
미해결Java 마이크로서비스(MSA) 프로젝트 실습
ci/cd 항목이 없습니다.
강의 따라 하고있습니다만.. ci/cd 지식이 없는경우??기존에는 깃만 사용하다가 강의들으면서 처음 사용하게되었습니다.강의내용 처럼 ci/cd메뉴를 설정하는것을따라하는 방법이 있을까요?아래는 제가 깃러너?랑 깃랩 설치한 부분입니다.따로 추가 설정해야 하는 부분이 있을까요?동영상의 내용과 비슷하게 진행할수가 없습니다.깃 런너 설치도 여러번 해야지 설치가 생각보다 잘 안됩니다..깃랩을 처음 사용하는 사람이다보니까런너 부터 연결해서.gitlab-ci.yml? 그것을 한다음에..깃랩에 msa 프로젝트 올려야하는것같은데..처음부터 설명이 없으시니까 우왕자왕하게되네요..파이프라인 어떻게해야할지 모르겠습니다.진행이 어렵습니다.깃랩을 하는데 있어서 CI/CD메뉴가 처음부터 없으면 어떻게해야하면 좋을까요?
-
미해결스프링 핵심 원리 - 기본편
ApplicationContext @Autowired관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.providerTest()를 할때 new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class) 를 하면서 스프링 컨테이너를 생성한다는것 까지는 이해가 됐습니다. 저는 여기서 스프링컨테이너에 ClientBean, PrototypeBean 모두가 등록이 되어야 스프링컨테이너가 완성되는거라고 생각했습니다. 하지만 ClientBean을 빈으로 등록하려면 @Autowired로 ApplicationContext를 주입받아야 빈으로 등록이 되는건가요? 만약 그렇다면 ClientBean을 빈으로 등록할당시에는 AnnotationConfigApplicationContext가 아직 완성되지않아서 @Autowired에 주입할 수 없을것같아서 이부분이 이해가 가지않아 질문드립니다. 아니면 빈등록을 할때는 의존관계 주입까지 끝내는게 아니라 빈으로 등록할 class정보만을 받고 그 이후에 의존관계를 주입하는걸까요? 정확한 작동원리가 궁금합니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
h2 연결 후 localhost 거부
h2 연결 후 localhost:8080연결 시 계속 서버 거부가 다음과 같이 뜹니다. 그래서 h2 재연결 후 상태를 확인해봤는데 다음과 같이 떴습니다. h2 설치 과정은 다음과 같습니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ExceptionHandler을 사용할 경우, 트랜잭션 롤백 질문
@Slf4j @Controller public class ExampleExceptionControllerAdvice { //사용자가 Argument를 잘못 보낸 경우 @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandle(IllegalArgumentException e){ log.error("[exceptionHandle] ex",e); if(1==1) { //throw new RuntimeException("예외 발생"); } return new ErrorResult("BAD", e.getMessage()); } @ResponseBody @GetMapping("/api/members") public String members(){ if(1==1){ throw new IllegalArgumentException("예외"); } return "Hello"; } } members 메서드에서 오류를 강제로 발생시킨 후,illegalExHandle 메서드에서 오류를 catch한 뒤 응답을 하는 것으로 강의 내용을 이해하였습니다. 이럴 경우, 트랜잭션 롤백이 발생하기 위해서는 어떻게 해야 하는 지 알고 싶습니다. [첨부 - 챗 GPT 답변]예시 코드@Service public class MyService { @Transactional public void doSomething() { // Some business logic throw new RuntimeException("Something went wrong"); } } @Controller public class MyController { @Autowired private MyService myService; @PostMapping("/example") public String handleRequest() { myService.doSomething(); return "success"; } @ExceptionHandler(RuntimeException.class) public String handleRuntimeException(RuntimeException ex) { // Exception handling logic // If we return without re-throwing the exception return "error"; } }위의 예제에서 doSomething() 메서드에서 발생한 RuntimeException이 handleRuntimeException 메서드에서 처리되면, 예외가 다시 던져지지 않으므로 트랜잭션은 롤백되지 않습니다.결론@Transactional이 서비스 계층에 있고, @ExceptionHandler가 컨트롤러 계층에 있을 때, 예외를 @ExceptionHandler에서 잡아 처리한 후 다시 던지지 않으면 트랜잭션은 롤백되지 않습니다. 만약 트랜잭션이 롤백되길 원한다면, @ExceptionHandler에서 예외를 다시 던져야 합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
/add에 dto사용 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]새로고침 시 상품이 중복 등록되는 문제는 POST가 멱등하기 때문인 것이 맞나요?/add에서 @ModelAttribute로 Item 객체를 바로 만들어서 save했는데, 이 경우 Dto를 거쳐서 저장하는 것이 올바른 방법인가요? @Data public class ItemDto { private String itemName; private Integer price; private Integer quantity; }@PostMapping("/add") public String addItemTest(@ModelAttribute ItemDto itemDto) { Item item = new Item(itemDto.getItemName(), itemDto.getPrice(), itemDto.getQuantity()); itemRepository.save(item); return "basic/item"; }dto를 사용하는 방식으로 변경해봤는데, id가 null이라는 예외가 발생했습니다.org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null에러페이지가 나오지만 목록 페이지로 갔을 때 상품은 정상적으로 저장이 되고 있습니다.controller의 save부분에서 item의 id가 자동으로 생성되고 있는데, 왜 이런 문제가 발생하는지 궁금합니다. -- 수정 --@PostMapping("/add") public String addItemTest(@ModelAttribute ItemDto itemDto) { Item item = new Item(itemDto.getItemName(), itemDto.getPrice(), itemDto.getQuantity()); itemRepository.save(item); return "redirect:/basic/items/" + item.getId(); }redirect로 수정하니 3번 문제는 해결되었습니다. 하지만 이전 코드에서 왜 저런 예외가 떴는지는 아직 모르겠습니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
@Autowired를 쓰면 밑줄이 떠서 찾아보니 PrototypeBean과 ClientBean에 @Component를 붙여야 하는데 질문있습니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Slf4j @SpringBootTest class MemberServiceV3_3Test { @Autowired private MemberRepositoryV3 memberRepository; @Autowired private MemberServiceV3_3 memberService; @BeforeEach void before() { DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD); memberRepository = new MemberRepositoryV3(dataSource); PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); memberService = new MemberServiceV3_3(memberRepository); } @AfterEach void after() throws SQLException { memberRepository.delete("memberA"); memberRepository.delete("memberB"); memberRepository.delete("ex"); } @Test @DisplayName("정상 이체") void accountTransfer() throws SQLException { //given Member memberA = new Member("memberA", 10000); Member memberB = new Member("memberB", 10000); memberRepository.save(memberA); memberRepository.save(memberB); //when memberService.accountTransfer(memberA.getMemberId(), memberB.getMemberId(), 2000); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberB = memberRepository.findById(memberB.getMemberId()); assertThat(findMemberA.getMoney()).isEqualTo(8000); assertThat(findMemberB.getMoney()).isEqualTo(12000); } @Test @DisplayName("이체중 예외 발생") void accountTransferEx() throws SQLException { //given Member memberA = new Member("memberA", 10000); Member memberEx = new Member("ex", 10000); memberRepository.save(memberA); memberRepository.save(memberEx); //when assertThatThrownBy(() -> memberService.accountTransfer(memberA.getMemberId(), memberEx.getMemberId(), 2000)) .isInstanceOf(IllegalStateException.class); //then Member findMemberA = memberRepository.findById(memberA.getMemberId()); Member findMemberEx = memberRepository.findById(memberEx.getMemberId()); //memberA의 돈이 롤백 되어야함 assertThat(findMemberA.getMoney()).isEqualTo(10000); assertThat(findMemberEx.getMoney()).isEqualTo(10000); } }다음과 같이 @Autowired를 쓰면 밑줄이 떠서 찾아보니 PrototypeBean과 ClientBean에 @Component를 붙이면 해결된다고 합니다. PrototypeBean과 ClientBean에 대해서는 아는게 없어서 GPT에 물어봤는데 PrototypeBean과 ClientBean을 정의하고 @Component와 @Scope를 붙히면되고, Spring 컨테이너 설정은 @ SpringbootAplication 이 붙은 클래스가 있는 경우를 전제하에 설명해줬습니다.마지막에 프로토타입빈을 주입받아서쓰면된다고 합니다. 막혔던 부분은 일반적으로 애플리케이션의 PrototypeBean과 ClientBean을 정의하는 코드는@SpringBootApplication 클래스가 위치한 패키지와 그 하위 패키지 내에 배치해야만 한다는데 따로 @ SpringbootAplication이 있는 클래스가 없는데 새로 만들어야되는지 모르겠어요ㅠ마찬가지로 spring컨테이너 설정도 @ SpringbootAplication을 전제하에 설명하는데 지금 코드에 관련 애노테이션은 @SpringBootTest만 있는데 전혀 감이 잡히질 않습니다ㅠ