묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 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만 있는데 전혀 감이 잡히질 않습니다ㅠ
-
미해결스프링 핵심 원리 - 기본편
@Test @DisplayName 안됨
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]위 두개를 임포트해도 오류가 뜹니다
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
H2 데이터베이스 member 테이블 생성이 안 돼요
테스트 코드는 오류 없이 초록불이 뜨는데 DB 내 테이블 생성이 안 됩니다. 강사님의 다른 강의와, 응용 프로젝트를 만들어 볼 땐 잘 됐어서 자주 묻는 질문들을 참고해도 어느 곳이 문제인지 잘 모르겠네요ㅠㅠ.. 일단 올려두고 계속 방법을 찾아보겠습니다! package jpabook.jpashop; import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() throws Exception{ //given Member member = new Member(); member.setUsername("memberA"); //when //ctrl+alt+v 변수 뽑기 Long saveId = memberRepository.save(member); Member findMember = memberRepository.find(saveId); //then Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장 } }spring: application: name: jpashop #port번호 설정 server: port: 8050 #DB datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver #JPA jpa: hibernate: ddl-auto: create properties: hibernate: show_sql: true format_sql: true logging: level: org.hibernate.SQL: debug org.hibernate.orm.jdbc.bind: trace
-
미해결토비의 스프링 부트 - 이해와 원리
강의 자료 레퍼지토리에 업로드
안녕하세요, 강사님.저는 강사님의 스프링 부트 강의를 수강하며 학습하고 있는 학생입니다. 학습한 내용을 정리하고 코드와 함께 깃허브에 업로드하여 관리하고 있습니다.제가 학습의 편의를 위해, 강의에서 제공해주신 자료도 함께 깃허브 레포지토리에 올려서 관리하고자 하는데, 이를 public으로 설정해도 괜찮을지 여쭤보고 싶습니다. 만약 문제가 된다면, 레포지토리를 private으로 설정하고 학습 자료를 개인적으로만 참고하겠습니다.답변 주시면 감사하겠습니다!감사합니다.
-
해결됨Practical Testing: 실용적인 테스트 가이드
데이터 일관성유지를 어떻게 하면서 테스트하는지 궁금합니다.
안녕하세요. 인강 너무 잘 들었습니다. 궁금한 게 몇 가지 있어 질문드리게 되었습니다.현재 H2 데이터로 테스트 코드를 작성해 주셨는데요. 개발 환경의 DB 서버를 My-sql DB로 생성하고 테스트 코드를 구현하게 되면, 다른 개발자로 인해 DB의 데이터가 인입되면서 테스트 코드의 일관성이 깨지는 경우가 많이 발생되었습니다. 그렇다고 H2 데이터로 로컬환경을 붙이려고 하니 Mysql과 H2의 엔티티의 컬럼 선언이 다른경우가 존재해서 JPA의 자체 auto-ddl: create가 안먹히는 경우가 발생이되었습니다. [요약]개발 환경을 MY-SQL DB로 구현하면 같이 개발하면서 데이터가 인입되면서 테스트 코드의 일관성이 깨짐그렇다고 H2 DB로 진행하려고 하니, 엔티티의 칼럼 설정하는 것이 달라서 스프링 부트가 실행되지 않음Service Layer에서 일관성 있게 테스트 환경을 설정하려면 H2와 Mysql을 같이 돌릴 수 있게 프로젝트를 변경해 줘야 되는지 궁금합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
윈도우 빌드 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.gradlew build를 하면 계속 오류가 떠서 게시판 글들을 살펴보았는데요. V3 실시간 검사를 해제하면 된다는 이야기가 있길래 해보려고 했는데, 비밀번호가 걸려있어서 실시간 검사 해제가 안 됩니다..인터넷 검색을 해도 비밀번호를 찾는 방법은 안 나오네요. 이거 때문에 지금 이틀 동안 진도가 안 나가는데 어떻게 해야 할까요?