월 66,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
테스트 시 DB 싱크 문제
안녕하세요 기선님! 테스트코드를 작성하는 도중에, 태그를 추가하는 테스트와 태그를 삭제하는 테스트에서 NullPotintException이 발생했습니다. 이유는 account 객체에서 getTags() 메서드를 호출한 결과가 Null이었기 때문이었습니다. 이 말은 ManyToMany 관계가 정상적으로 DB에 싱크가 되지 않았다는 것인데, 기선님 말씀대로 테스크 클래스에 @Transactional을 통해서 트랜잭션 처리를 해주었음에도 싱크가 이루어지지 않는 것 같습니다. mockMvc.perform(post("/settings/tags/add") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(tagForm)) .with(csrf())) .andExpect(status().isOk()); 트랜잭션 처리를 해주어서 persist하게 만들어 줬는데도 왜 DB 싱크가 제대로 되지 않는 것인지 궁금합니다!! 그리고 테스트가 아닌 실제 어플리케이션 실행에서는 문제없이 잘 작동을 했습니다! org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException: Cannot invoke "java.util.Set.add(Object)" because the return value of "com.sejin.domain.Account.getTags()" is null
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
detached 객체에 대해서 질문이 있습니다!!
기선님 강의 잘 듣고있습니다~~^^ 저번 강의에서 Account 클래스에서 @ManyToMany로 tags 필드를 통해서 Tag 엔티티와 관계를 만들었습니다! 기선님이 그때 @ManyToMany로 맺은 클래스의 필드는 detached 객체일 경우에 해당 필드가 null이라고 하셨습니다~! settings/tags/add 요청을 통해서 tag를 추가를 하고나면, 해당 account 객체의 tags Set에 해당 값들이 저장이 되어 있을 것이라고 생각을 했습니다. 그래서 한번 태그들이 저장이 되고 나서는 detached 객체이더라도, tags 필드가 null 이 아니라 tag들에 대한 값을 저장하고 있지 않을까 했는데, 역시나 detached 객체에 대해서 해당 tags필드는 null 이었습니다!! 그렇다는 말은 @ManyToMany로 맺은 관계는 영속성 컨텍스트의 관리를 받고 있을때만, 해당 tag앤티티들과 tags 필드를 연관시켜주고 데이터베이스 상에서의 관계대로 접근이 가능하다고 생각을 하면 되는 것인가요~? 항상 재밌고 좋은 강의 잘 듣고있습니다 : )
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
Request payload & Form data
안녕하세요 기선님!! 강의 정말 잘 듣고 있습니다 : ) 강의를 들으면서 제가 이해하고 있는 것이 맞는것인지 한번 여쭤보고 싶어서 질문을 드리려고 합니다! 관심 주제 부분에서는 tagify 라이브러리의 사용과 함께 동적으로 AJAX요청을 서버측으로 보내기 때문에 이전과 요청을 받고 처리하는 방식이 다르다고 하셨습니다! 기선님 말씀대로 AJAX 요청시에는 크롬에서도 요청에 대해서 확인해보니 body 부분에 해당하는 request payload의 형식으로 브라우저에서 요청이 날아가고 있었습니다! 그럼 지금까지 저희가 했던 방식은 타임리프를 통해서 뷰에 폼 객체를 넘겨주게 되고, 폼객체에 POST 요청의 그값에 해당하는 부분을 폼 객체의 필드에 매핑시켜서 전송했습니다.그래서 이 경우에는 브라우저에서 form data의 형식으로 보내고 있는게 맞나요?? 기선님 강의를 보면서 공부해나가고 있는 학생인데 항상 질문에 잘 답변해주셔서 갑사합니다!!^^
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
패스워드 수정 GET Mapping 컨트롤러 질문있습니다!
삭제된 글입니다
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
model attribute가 없다고 나옵니다.
안녕하세요 강의 잘 수강하고 있습니다. 다름이아니라 제 테스트에서 java.lang.AssertionError: Model attribute 'singUpForm' does not exist 에러가 나오며 테스트 통과가 안되어 이상해서 문의드립니다. AccountController에서 model.addAttribute("signUpForm", new SignUpForm() ); attribute추가도 잘 했는데 .andExpect(model().attributeExists("singUpForm")); 테스트에서 이부분만 통과를 못합니다.. 화면에서는 잘 동작해서 테스트코드는 작성 안하고있다가 추가해봤더니 오류가나서.. 혹시 특별한 이유가 있을까요? ㅜㅜ
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
프로필 뷰 에러는 어떻게 테스트 해볼 수 있을 까요?
이번 강좌에서 존재하지 않는 닉네임으로 접근하면 IllegalArgumentException 이 발생하는데 어떻게 해야 테스트를 할수 있을까요? mockMvc.perform(get("/profile/{nickname}", nickname)) .andExpect(result -> assertTrue(result.getResolvedException() instanceof IllegalArgumentException)); 이렇게 하면 에러를 캐치하지 못하고 assertThrows(IllegalArgumentException.class, () ->mockMvc.perform(get("/profile/{nickname}", nickname))); 이방식으로는 스프링 래퍼 클레스인 <org.springframework.web.util.NestedServletException>이 발생했다고 나옵니다 org.assertj.core.api.Assertions.Assertions.assertThatThrownBy(() -> mockMvc.perform(get("/profile/{nickname}", nickname))).hasCause(new IllegalArgumentException()); 이건 에러메세지 까지 비교하는데 어떤방법으로 테스트 하는게 좋을까요? 참고 : https://www.baeldung.com/junit-assert-exception https://www.python2.net/questions-151506.htm
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
로그아웃에 대해서 질문드립니다!
강의 정말 잘 듣고있습니다 : ) 실습을 하는 중에 의문점이 생겨서 질문드립니다! 회원가입 후(자동 로그인) authenticated 한 상태이기 때문에 다른 요청을 하더라도 그 상태가 유지 되는 것을 확인할 수있었습니다. (비록 요청에 대한 구현을 하지않아서 페이지를 출력해주진 못하지만 말입니다!) 그런데 토글바에서 로그아웃버튼만 누르면 unathenticated 하게 변하는것을 알 수 있었습니다! 그리고 해당하는 요청도 index 페이지에선 /logout 으로 지정해주었지만, 요청을 하게 되었을 때 실제 요청은 어째서 /login?logout 으로 요청이 들어가는지 잘 모르겠습니다!
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
롬복 인식문제
질문사항은 아닌데 저에게 발생했던 문제를 공유하려고 합니다! 강의를 쭉 따라 하면서 롬복 의존성도 추가를 한 상황이었지만, SignUpForm 클래스의 @Data 애노테이션과 SignUpFormValiator 클래스의 @RequiredArgsConstructor 애노테이션이 먹히지를 않았습니다. 롬복이 인식이 되지 않는 것 같아서 찾아본 결과, 프로그램은 의존성을 통헤서 롬복을 인식하지만 IDE가 롬복을 인식하지 못할 수도 있다는 글을 보게 되었습니다. 그래서 인텔리제이에 롬복 플러그인을 설치하고 재시작하였더니 롬복이 잘 인식이 되었습니다! 혹시나 저와 같으신분들은 한번 참고하시면 좋을 것 같습니다 :)
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
@ExceptionHandler 메서드에서 ResponseEntity 반환 시 상황 질문
안녕하세요 백기선 강사님! 덕분에 강의를 완주하고 사이드프로젝트로 api 서버를 만들고 있습니다. restapi를 만들고있는데 view기반이랑 조금은 달라서 찾아볼게 많네요.!!ㅎ 익셉션핸들러 처리 중 질문거리가 생겨서 달려왔습니다. @RestControllerAdvice public class ControllerExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(value=HttpStatus.BAD_REQUEST) public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException e){ System.out.println(e.toString()); ErrorResponse response = ErrorResponse.builder() .status(HttpStatus.BAD_REQUEST.value()) .message(e.getMessage()) .build(); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } @Getter @Builder public class ErrorResponse { @Builder.Default private LocalDateTime timestamp = LocalDateTime.now(); private String message; //예외 메시지 저장 @Builder.Default private String code = ""; // 예외를 세분화하기 위한 사용자 지정 코드 private int status; // HTTP 상태 값 저장 400, 404, 500 등 } 익셉션핸들러에 대해 위처럼 작성하였고 핸들러메서드에서 return으로 ResponseEntity 가 반환되고, body부로 ErrorResponse 객체 전달하고 있습니다. ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.itevent.iteventapi.common.error.ControllerExceptionHandler#handleIllegalArgumentException org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 위와 같은 에러가 났었는데 결론은 ErrorResponse에 @Getter를 붙이지 않아서 에러가 났고 @Getter 붙여서 해결하였는데요. 어떤 이유로 게터가 없어서 에러가 났는지 짐작이 안되서 질문드립니다. ErrorResponse객체에 getter가 왜 필요한건가요? (jackson변환할 때 getter가 필요..? POJO 객체의 필수조건? 다양한 생각은 드는게 확신이 안서서 질문드립니다.. 아시면 답변 부탁드리겠습니다 :) )
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
인텔리제이 커뮤니티버전
기선님 인텔리제이 커뮤니티 버전을 사용하면 말씀해주신 대로 html, css, javascript에 관련된 부분만 불편하다는 말씀이신가요?? 커뮤니티 버전에서는 스프링을 지원하지 않는다고 들은 것같은데, 커뮤니티 버전으로는 스프링을 사용한 프로젝트는 개발이 불가능한가요?
- 스프링과 JPA 기반 웹 애플리케이션 개발
안녕하세요. 실습 진행하다가 html 코드 위치를 못찾아서 문의 드립니다. sign-up 페이지에 나오는 코드들은 구글 문서에서 커밋위치 찾아서 보고 하는거 맞나요??
삭제된 글입니다
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
스프링부트 2.4.2 버전 에서는 TestExecutionEvent.TEST_EXECUTION 적용되는 것 같습니다.
안녕하세요 ㅎㅎ 스프링부트 2.4.2 버전에서 실습중입니다. @WithUserDetails(value = "seungmoo", setupBefore = TestExecutionEvent.TEST_EXECUTION) 이렇게 셋팅하니까 정상적으로 적용되네요!!
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
REST API로 로그인 설정 시 remember-me 문제
안녕하세요, 기선님. 항상 강좌 잘 듣고 있습니다! 다름이 아니라, 제가 이 강좌를 바탕으로 현재 프로젝트를 진행중인데 프론트엔드는 Vue.js로 진행하므로 rest api를 사용하고 있습니다. 현재 postman으로도 테스트중인데 alwaysRemember 값을 true로 설정해도 remember-me 쿠키가 들어오지 않더라구요 ㅜㅜ 하지만 네이버 oauth2 로그인을 하면 또 멀쩡하게 들어옵니다.. 현재 일반 로그인에서는 리다이렉션을 막아뒀는데 혹시 그것과 관련이 있을까요? 며칠동안 이것저것 찾아보다 도저히 답이 안나와서 이렇게 질문 남깁니다.. 코드도 첨부하겠습니다 @Componentpublic class AuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { response.setStatus(HttpServletResponse.SC_OK); }} @Slf4jpublic class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private boolean postOnly = true; private HashMap<String, String> jsonRequest; @Override protected String obtainPassword(HttpServletRequest request) { String passwordParameter = super.getPasswordParameter(); if(request.getHeader("Content-Type").equals(ContentType.APPLICATION_JSON.getMimeType())) { return jsonRequest.get(passwordParameter); } return request.getParameter(passwordParameter); } @Override protected String obtainUsername(HttpServletRequest request) { String usernameParameter = super.getUsernameParameter(); if(request.getHeader("Content-Type").equals(ContentType.APPLICATION_JSON.getMimeType())) { return jsonRequest.get(usernameParameter); } return request.getParameter(usernameParameter); } @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response){ if(postOnly && !request.getMethod().equals("POST")) { throw new AuthenticationServiceException("Authentication method not supported : " + request.getMethod()); } if(request.getHeader("Content-Type").equals(ContentType.APPLICATION_JSON.getMimeType())) { ObjectMapper objectMapper = new ObjectMapper(); try { this.jsonRequest = (HashMap<String, String>) objectMapper.readValue(request.getReader().lines().collect(Collectors.joining()), new TypeReference<Map<String, String>>() { }); } catch (IOException e) { e.printStackTrace(); throw new AuthenticationServiceException("Request Content-Type(application/json) Parsing Error"); } } String username = obtainUsername(request); String password = obtainPassword(request); //String rememberMe = request.getParameter("remember-me"); if(username == null) username = ""; if(password == null) username = ""; username = username.trim(); UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } @Override public void setPostOnly(boolean postOnly) { this.postOnly = postOnly; }} @Overrideprotected void configure(HttpSecurity http) throws Exception { http.oauth2Login() .userInfoEndpoint() .userService(customOAuth2UserService); http.exceptionHandling() .authenticationEntryPoint(restAuthenticationEntryPoint); // 인증 실패시 401 http.formLogin().disable(); http.logout() .logoutSuccessUrl("/"); // 로그인 유지 String rememberKey = "remember_me"; http.rememberMe() .key(rememberKey) .rememberMeParameter(rememberKey) .rememberMeCookieName(rememberKey) .userDetailsService(memberService) .alwaysRemember(true) .tokenRepository(tokenRepository()); http.csrf().disable(); http.cors(); // Json http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);}// Json@Beanpublic CustomAuthenticationFilter customAuthenticationFilter() throws Exception { CustomAuthenticationFilter filter = new CustomAuthenticationFilter(); try { filter.setFilterProcessesUrl("/login"); filter.setAuthenticationManager(this.authenticationManagerBean()); filter.setUsernameParameter("email"); filter.setPasswordParameter("password"); filter.setAuthenticationSuccessHandler(authSuccessHandler); //filter.setAuthenticationFailureHandler(authFailureHandler); } catch (Exception e) { e.printStackTrace(); } return filter;}@Beanpublic PersistentTokenRepository tokenRepository() { JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); return jdbcTokenRepository;}
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
cycleCheck 테스트가 실패 (event->study->event) 합니다.
안녕하세요! 구조 정리 따라하다가 막힌 부분이 있어서 질문 드립니다. cycleCheck 테스트에서 event->study->event 순환참조를 하고 있다고 faild 처리 되었는데요.제가 보기엔 event 에서 study만 참조하고 있는것 같은데 어딜를 더 보아야할지 모르겠습니다..영상과 github 참고하여 따라왔기 때문에 코드도 맞을텐데 어떤 부분이 문제인지 확인해주시면 감사하겠습니다!! github urlhttps://github.com/uzini0418/studyolle-test 에러 로그 java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'slices matching 'com.studyolle.modules.(*)..' should be free of cycles' was violated (1 times): Cycle detected: Slice event -> Slice study -> Slice event Dependencies of Slice event Class <com.studyolle.modules.event.EventControllerTest> extends class <com.studyolle.modules.study.StudyControllerTest> in (EventControllerTest.java:0) Constructor <com.studyolle.modules.event.EventController.<init>(com.studyolle.modules.study.StudyService, com.studyolle.modules.event.EventService, org.modelmapper.ModelMapper, com.studyolle.modules.event.validator.EventValidator, com.studyolle.modules.event.EventRepository, com.studyolle.modules.study.StudyRepository)> has parameter of type <com.studyolle.modules.study.StudyRepository> in (EventController.java:0) Constructor <com.studyolle.modules.event.EventController.<init>(com.studyolle.modules.study.StudyService, com.studyolle.modules.event.EventService, org.modelmapper.ModelMapper, com.studyolle.modules.event.validator.EventValidator, com.studyolle.modules.event.EventRepository, com.studyolle.modules.study.StudyRepository)> has parameter of type <com.studyolle.modules.study.StudyService> in (EventController.java:0) Field <com.studyolle.modules.event.Event.study> has type <com.studyolle.modules.study.Study> in (Event.java:0) Field <com.studyolle.modules.event.EventController.studyRepository> has type <com.studyolle.modules.study.StudyRepository> in (EventController.java:0) Field <com.studyolle.modules.event.EventController.studyService> has type <com.studyolle.modules.study.StudyService> in (EventController.java:0) Method <com.studyolle.modules.event.Event.getStudy()> has return type <com.studyolle.modules.study.Study> in (Event.java:0) Method <com.studyolle.modules.event.Event.setStudy(com.studyolle.modules.study.Study)> has parameter of type <com.studyolle.modules.study.Study> in (Event.java:0) Method <com.studyolle.modules.event.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> has parameter of type <com.studyolle.modules.study.Study> in (EventControllerTest.java:0) Method <com.studyolle.modules.event.EventRepository.findByStudyOrderByStartDateTime(com.studyolle.modules.study.Study)> has parameter of type <com.studyolle.modules.study.Study> in (EventRepository.java:0) Method <com.studyolle.modules.event.EventService.createEvent(com.studyolle.modules.event.Event, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> has parameter of type <com.studyolle.modules.study.Study> in (EventService.java:0) Constructor <com.studyolle.modules.event.EventControllerTest.<init>()> calls constructor <com.studyolle.modules.study.StudyControllerTest.<init>()> in (EventControllerTest.java:19) Method <com.studyolle.modules.event.EventControllerTest.newEnrollment_to_FCFS_event_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:33) Method <com.studyolle.modules.event.EventControllerTest.newEnrollment_to_FCFS_event_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:36) Method <com.studyolle.modules.event.EventController.newEventForm(com.studyolle.modules.account.Account, java.lang.String, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdateStatus(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:42) Method <com.studyolle.modules.event.EventController.newEventSubmit(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.form.EventForm, org.springframework.validation.Errors, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdateStatus(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:52) Method <com.studyolle.modules.event.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:55) Method <com.studyolle.modules.event.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:58) Method <com.studyolle.modules.event.EventController.newEventSubmit(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.form.EventForm, org.springframework.validation.Errors, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:60) Method <com.studyolle.modules.event.EventController.getEvent(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.StudyRepository.findStudyWithManagersByPath(java.lang.String)> in (EventController.java:68) Method <com.studyolle.modules.event.EventController.viewStudyEvents(com.studyolle.modules.account.Account, java.lang.String, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.StudyService.getStudy(java.lang.String)> in (EventController.java:74) Method <com.studyolle.modules.event.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:82) Method <com.studyolle.modules.event.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:85) Method <com.studyolle.modules.event.EventController.updateEventForm(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdate(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:98) Method <com.studyolle.modules.event.EventController.updateEventSubmit(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.form.EventForm, org.springframework.validation.Errors, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdate(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:110) Method <com.studyolle.modules.event.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:110) Method <com.studyolle.modules.event.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:113) Method <com.studyolle.modules.event.EventController.updateEventSubmit(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.form.EventForm, org.springframework.validation.Errors, org.springframework.ui.Model)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:122) Method <com.studyolle.modules.event.EventController.cancelEvent(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdateStatus(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:127) Method <com.studyolle.modules.event.EventController.cancelEvent(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:129) Method <com.studyolle.modules.event.EventController.newEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.study.StudyService.getStudyToEnroll(java.lang.String)> in (EventController.java:134) Method <com.studyolle.modules.event.EventController.newEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:136) Method <com.studyolle.modules.event.EventControllerTest.newEnrollment_to_CONFIMATIVE_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:136) Method <com.studyolle.modules.event.EventControllerTest.newEnrollment_to_CONFIMATIVE_event_not_accepted()> calls method <com.studyolle.modules.study.Study.getPath()> in (EventControllerTest.java:139) Method <com.studyolle.modules.event.EventController.cancelEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.study.StudyService.getStudyToEnroll(java.lang.String)> in (EventController.java:141) Method <com.studyolle.modules.event.EventController.cancelEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:143) Method <com.studyolle.modules.event.EventController.acceptEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdate(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:149) Method <com.studyolle.modules.event.EventController.acceptEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:151) Method <com.studyolle.modules.event.EventController.rejectEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdate(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:157) Method <com.studyolle.modules.event.EventController.rejectEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:159) Method <com.studyolle.modules.event.EventController.checkInEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdate(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:165) Method <com.studyolle.modules.event.EventController.checkInEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:167) Method <com.studyolle.modules.event.EventController.cancelCheckInEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.StudyService.getStudyToUpdate(com.studyolle.modules.account.Account, java.lang.String)> in (EventController.java:173) Method <com.studyolle.modules.event.EventController.cancelCheckInEnrollment(com.studyolle.modules.account.Account, java.lang.String, com.studyolle.modules.event.Event, com.studyolle.modules.event.Enrollment)> calls method <com.studyolle.modules.study.Study.getEncodedPath()> in (EventController.java:175) Dependencies of Slice study Field <com.studyolle.modules.study.EventControllerTest.enrollmentRepository> has type <com.studyolle.modules.event.EnrollmentRepository> in (StudySettingControllerTest.java:0) Field <com.studyolle.modules.study.EventControllerTest.eventService> has type <com.studyolle.modules.event.EventService> in (StudySettingControllerTest.java:0) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> has parameter of type <com.studyolle.modules.event.EventType> in (StudySettingControllerTest.java:0) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> has return type <com.studyolle.modules.event.Event> in (StudySettingControllerTest.java:0) Method <com.studyolle.modules.study.EventControllerTest.isAccepted(com.studyolle.modules.account.Account, com.studyolle.modules.event.Event)> has parameter of type <com.studyolle.modules.event.Event> in (StudySettingControllerTest.java:0) Method <com.studyolle.modules.study.EventControllerTest.isNotAccepted(com.studyolle.modules.account.Account, com.studyolle.modules.event.Event)> has parameter of type <com.studyolle.modules.event.Event> in (StudySettingControllerTest.java:0) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_accepted()> gets field <com.studyolle.modules.event.EventType.FCFS> in (StudySettingControllerTest.java:42) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:44) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:47) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> gets field <com.studyolle.modules.event.EventType.FCFS> in (StudySettingControllerTest.java:59) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:63) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:64) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:66) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:69) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> gets field <com.studyolle.modules.event.EventType.FCFS> in (StudySettingControllerTest.java:83) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:85) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:86) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:87) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:93) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:96) Method <com.studyolle.modules.study.EventControllerTest.accepted_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EnrollmentRepository.findByEventAndAccount(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:100) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> gets field <com.studyolle.modules.event.EventType.FCFS> in (StudySettingControllerTest.java:111) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:113) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:114) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EventService.newEnrollment(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:115) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:121) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:124) Method <com.studyolle.modules.study.EventControllerTest.not_accepterd_account_cancelEnrollment_to_FCFS_event_not_accepted()> calls method <com.studyolle.modules.event.EnrollmentRepository.findByEventAndAccount(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:128) Method <com.studyolle.modules.study.EventControllerTest.isNotAccepted(com.studyolle.modules.account.Account, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.event.Enrollment.isAccepted()> in (StudySettingControllerTest.java:132) Method <com.studyolle.modules.study.EventControllerTest.isNotAccepted(com.studyolle.modules.account.Account, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.event.EnrollmentRepository.findByEventAndAccount(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:132) Method <com.studyolle.modules.study.EventControllerTest.isAccepted(com.studyolle.modules.account.Account, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.event.Enrollment.isAccepted()> in (StudySettingControllerTest.java:136) Method <com.studyolle.modules.study.EventControllerTest.isAccepted(com.studyolle.modules.account.Account, com.studyolle.modules.event.Event)> calls method <com.studyolle.modules.event.EnrollmentRepository.findByEventAndAccount(com.studyolle.modules.event.Event, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:136) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_CONFIMATIVE_event_not_accepted()> gets field <com.studyolle.modules.event.EventType.CONFIRMATIVE> in (StudySettingControllerTest.java:145) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_CONFIMATIVE_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:147) Method <com.studyolle.modules.study.EventControllerTest.newEnrollment_to_CONFIMATIVE_event_not_accepted()> calls method <com.studyolle.modules.event.Event.getId()> in (StudySettingControllerTest.java:150) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls constructor <com.studyolle.modules.event.Event.<init>()> in (StudySettingControllerTest.java:157) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setEventType(com.studyolle.modules.event.EventType)> in (StudySettingControllerTest.java:158) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setLimitOfEnrollments(java.lang.Integer)> in (StudySettingControllerTest.java:159) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setTitle(java.lang.String)> in (StudySettingControllerTest.java:160) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setCreatedDateTime(java.time.LocalDateTime)> in (StudySettingControllerTest.java:161) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setEndEnrollmentDateTime(java.time.LocalDateTime)> in (StudySettingControllerTest.java:162) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setStartDateTime(java.time.LocalDateTime)> in (StudySettingControllerTest.java:163) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.Event.setEndDateTime(java.time.LocalDateTime)> in (StudySettingControllerTest.java:164) Method <com.studyolle.modules.study.EventControllerTest.createEvent(java.lang.String, com.studyolle.modules.event.EventType, int, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> calls method <com.studyolle.modules.event.EventService.createEvent(com.studyolle.modules.event.Event, com.studyolle.modules.study.Study, com.studyolle.modules.account.Account)> in (StudySettingControllerTest.java:165) ㅌㅌ
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
EntityGraph 적용 시 account 조회 여부 다른 이유?
안녕하세요! 강의 너무 잘 듣고 있습니다. 배울수록 기억이 날라가는지 슬슬 헷갈려지기 시작하네요 ㅎㅎ 첫 질문 남겨봅니다. 최종 리팩토링된 조회 쿼리 기준으로,아래 두 쿼리의 account 조회결과의 차이가 어떤 이유로 달라지나요?(EntityGraphType 을 바꾸는 것으로 테스트해보니 이건 아닌거같네요..) - Study 조회할 때는 account 엔티티도 포함되어 조회됨 select study0_.id as id1_6_0_, tag2_.id as id1_11_1_, zone4_.id as id1_12_2_, account6_.id as id1_0_3_, account8_.id as id1_0_4_, study0_.closed as closed2_6_0_, study0_.closed_date_time as closed_d3_6_0_, study0_.full_description as full_des4_6_0_, study0_.image as image5_6_0_, study0_.path as path6_6_0_, study0_.published as publishe7_6_0_, study0_.published_date_time as publishe8_6_0_, study0_.recruiting as recruiti9_6_0_, study0_.recruiting_updated_date_time as recruit10_6_0_, study0_.short_description as short_d11_6_0_, study0_.title as title12_6_0_, study0_.use_banner as use_ban13_6_0_, tag2_.title as title2_11_1_, tags1_.study_id as study_id1_9_0__, tags1_.tags_id as tags_id2_9_0__, zone4_.city as city2_12_2_, zone4_.local_name_of_city as local_na3_12_2_, zone4_.province as province4_12_2_, zones3_.study_id as study_id1_10_1__, zones3_.zones_id as zones_id2_10_1__, account6_.bio as bio2_0_3_, account6_.email as email3_0_3_, account6_.email_check_token as email_ch4_0_3_, account6_.email_check_token_generated_at as email_ch5_0_3_, account6_.email_verified as email_ve6_0_3_, account6_.joined_at as joined_a7_0_3_, account6_.location as location8_0_3_, account6_.nickname as nickname9_0_3_, account6_.occupation as occupat10_0_3_, account6_.password as passwor11_0_3_, account6_.profile_image as profile12_0_3_, account6_.study_created_by_email as study_c13_0_3_, account6_.study_created_by_web as study_c14_0_3_, account6_.study_enrollment_result_by_email as study_e15_0_3_, account6_.study_enrollment_result_by_web as study_e16_0_3_, account6_.study_updated_by_email as study_u17_0_3_, account6_.study_updated_by_web as study_u18_0_3_, account6_.url as url19_0_3_, managers5_.study_id as study_id1_7_2__, managers5_.managers_id as managers2_7_2__, account8_.bio as bio2_0_4_, account8_.email as email3_0_4_, account8_.email_check_token as email_ch4_0_4_, account8_.email_check_token_generated_at as email_ch5_0_4_, account8_.email_verified as email_ve6_0_4_, account8_.joined_at as joined_a7_0_4_, account8_.location as location8_0_4_, account8_.nickname as nickname9_0_4_, account8_.occupation as occupat10_0_4_, account8_.password as passwor11_0_4_, account8_.profile_image as profile12_0_4_, account8_.study_created_by_email as study_c13_0_4_, account8_.study_created_by_web as study_c14_0_4_, account8_.study_enrollment_result_by_email as study_e15_0_4_, account8_.study_enrollment_result_by_web as study_e16_0_4_, account8_.study_updated_by_email as study_u17_0_4_, account8_.study_updated_by_web as study_u18_0_4_, account8_.url as url19_0_4_, members7_.study_id as study_id1_8_3__, members7_.members_id as members_2_8_3__ from study study0_ left outer join study_tags tags1_ on study0_.id=tags1_.study_id left outer join tag tag2_ on tags1_.tags_id=tag2_.id left outer join study_zones zones3_ on study0_.id=zones3_.study_id left outer join zone zone4_ on zones3_.zones_id=zone4_.id left outer join study_managers managers5_ on study0_.id=managers5_.study_id left outer join account account6_ on managers5_.managers_id=account6_.id left outer join study_members members7_ on study0_.id=members7_.study_id left outer join account account8_ on members7_.members_id=account8_.id where study0_.path=? - Event 조회 쿼리에서는 enrollment의 account id만 조회됨 select event0_.id as id1_4_0_, enrollment1_.id as id1_3_1_, event0_.created_by_id as created10_4_0_, event0_.created_date_time as created_2_4_0_, event0_.description as descript3_4_0_, event0_.end_date_time as end_date4_4_0_, event0_.end_enrollment_date_time as end_enro5_4_0_, event0_.event_type as event_ty6_4_0_, event0_.limit_of_enrollments as limit_of7_4_0_, event0_.start_date_time as start_da8_4_0_, event0_.study_id as study_i11_4_0_, event0_.title as title9_4_0_, enrollment1_.accepted as accepted2_3_1_, enrollment1_.account_id as account_5_3_1_, enrollment1_.attended as attended3_3_1_, enrollment1_.enrolled_at as enrolled4_3_1_, enrollment1_.event_id as event_id6_3_1_, enrollment1_.event_id as event_id6_3_0__, enrollment1_.id as id1_3_0__ from event event0_ left outer join enrollment enrollment1_ on event0_.id=enrollment1_.event_id where event0_.study_id=? order by event0_.start_date_time asc N+1 관련내용은 이해가 되었는데 account 를 보니 좀 헷갈려서.. 확실히 알고 싶어 질문 드립니다!!
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
springboot sign-up test 질문드립니다.
안녕하세요 백기선선생님. 현재 강좌를 잘보고 있습니다. 저는 타임리프를 사용하지 않고 기존에 만든 프로젝트가 있어서 jsp로 예제를 따라하는 중인데요 스프링시큐리티 적용하고 jsp 페이지를 컨트롤러에서 호출해서 정상적으로 로드되는 것은 확인 하였습니다. 그런데 테스트를 진행시에 404에러가 뜨면서 호출이 되지 않는데요 원인을 잘 모르겠습니다. application.properties 파일 spring.mvc.view.prefix= /WEB-INF/views/spring.mvc.view.suffix= .jsp 따라서/user/sign-up 을 리턴하구요 @GetMapping("/sign-up")public String signUpForm(Model model) { return "/user/sign-up";} 컨드롤러에서는 위에 url을 호출시에 정상적으로 페이지가 열립니다. 아래는 컨트롤러 테스트입니다. package com.seongbindb.recipe.controller;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.web.servlet.MockMvc;import static org.junit.jupiter.api.Assertions.*;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;@SpringBootTest@AutoConfigureMockMvcclass UserControllerTest { @Autowired private MockMvc mockMvc; @DisplayName("회원 가입 화면 보이는지 테스트") @Test void signUpForm() throws Exception { mockMvc.perform(get("/sign_up")) .andExpect(status().isOk()) .andExpect(view().name("/user/sign-up")); }} 아래는 콘솔 로그입니다. java.lang.AssertionError: Status expected:<200> but was:<404> Expected :200 Actual :404 <Click to see difference> at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:627) at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:196) at com.seongbindb.recipe.controller.UserControllerTest.signUpForm(UserControllerTest.java:24) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) 2021-02-15 21:20:56.279 INFO 11843 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' Process finished with exit code 255
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
javaMailSender bean 등록문제
안녕하세요. 좋은강의 잘 듣고 있습니다. 강사님 코드를 라이브코딩으로 따라치며 강의를 듣는 중인데요 spring-jpa-웹앱 강의 <회원가입 폼 및 서브밋 처리> 부분에서 저는 이런 오류가 뜨네요. Description: Parameter 2 of constructor in com.stdmark.stdmakr.account.AccountController required a bean of type 'org.springframework.mail.javamail.JavaMailSender' that could not be found. Action: Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration. 스프링 부트에서는 javaMailSender가 자동으로 빈으로 등록되는 것으로 알고있는데 이와 같은 오류가 뜨는 이유가 뭔지요? 그리고 이를 해결하고 정상적으로 앱을 기동하려면 config 파일 하나 만들어서 빈과 설정정보를 입력해야할까요? 답변 미리 감사드립니다.
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
rest api + 관리자 페이지 제작 및 oauth 관련하여 질문드립니다.
안녕하세요. 현재 모바일 앱 연동을 위해 bearer 인증 기반으로 rest api 서버를 구축하였습니다. 회원가입은 firebase 의 id_token 인증을 통해 진행됩니다. 여기서 관리자페이지 제작을 하려고 하는데 보통 관리자 페이지는 api서버 프로젝트와 따로 프로젝트를 생성하여 만드는지 아니면 한 프로젝트에 모든 기능을 한 번에 구축하는지 일반적으로 현업에서는 어떤 구조로 이루어져있는지 궁금합니다. 프로젝트를 따로 가져가는 경우 공통된는 service 기능이나 domain은 중복해서 생성해야할거같아서 비효율적일거 같아 우선 저의경우 한 프로젝트에 앱 서버와 관리자 서버 모두 구축하는 방법을 진행해 봤는데 rest api 기반 시큐리티 설정과 웹 시큐리티 설정이 동시에 구축되는게 문제가 있는지 웹 로그인이 진행이 안됩니다. 다른 질문으론 oAuth2가 스프링에서 deprecated 된거같은데 선생님께서는 다른 방안을 어떻게 생각하고 계신가요?? 답변 부탁드립니다. 감사합니다!
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
프로젝트 세팅 중 maven compile시 에러발생합니다
프로젝트 실행하기 강의중에 maven compile시에 아래와 같은 에러가 발생합니다. 해결 방법이 있을까요? Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.8.0:npm (npm install) on project studyolle: Failed to run task
- 미해결스프링과 JPA 기반 웹 애플리케이션 개발
회원 가입 리팩토링 및 테스트 영상 질문입니다.
@DisplayName("회원 가입 처리 - 입력값 정상") @Test void signUpSubmit_with_correct_input() throws Exception { mockMvc.perform(post("/sign-up") .param("nickname", "keesun") .param("email", "email@gmail.com") .param("password", "12345678") .with(csrf())) .andExpect(status().is3xxRedirection()) .andExpect(view().name("redirect:/")); assertTrue(accountRepository.existsByEmail("email@gmail.com")); BDDMockito.then(JavaMailSender).should().send(any(SimpleMailMessage.class)); } 회원 가입 처리 - 입력값 정상 테스트의 마지막줄인 BDDMockito.then(JavaMailSender).should().send(any(SimpleMailMessage.class)); 쪽이 인식을 못하고 빨간줄을 내보냅니다. 영상에서는 then(JavaMailSender).should().send(any(SimpleMailMessage.class)); 코드인데 then 앞에 BDDMockito.를 선언 안하면 아예 인식을 못하더군요. BDDMockito를 사용하여 then을 인식시키면 에러가 뜹니다. .send(any(SimpleMailMessage.class)); 센드쪽에서 any들어가는걸 인식 못하는것 같은데 junit을 써본적이 없어서 이부분을 잘 모르겠습니다. 어디가 잘못 된건지 알 수 있을까요??? spring boot version 2.4.2 입니다. java 11입니다. ======================================================================================= package com.studyolle; import static org.hamcrest.CoreMatchers.any; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; import javax.mail.internet.MimeMessage; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.BDDMockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.test.web.servlet.MockMvc; import com.studyolle.account.AccountRepository; @SpringBootTest @AutoConfigureMockMvc class AppTests { @Autowired private MockMvc mockMvc; @Autowired private AccountRepository accountRepository; @MockBean JavaMailSender JavaMailSender; @DisplayName("회원 가입 화면 보이는지 테스트") @Test void signUpForm() throws Exception { mockMvc.perform(get("/sign-up")) .andDo(print()) .andExpect(status().isOk()) .andExpect(view().name("account/sign-up")) .andExpect(model().attributeExists("signUpForm")); } @DisplayName("회원 가입 처리 - 입력값 오류") @Test void signUpSubmit_with_wrong_input() throws Exception { mockMvc.perform(post("/sign-up") .param("nickname", "keesun") .param("email", "email..") .param("password", "12345") .with(csrf())) .andExpect(status().isOk()) .andExpect(view().name("account/sign-up")); } @DisplayName("회원 가입 처리 - 입력값 정상") @Test void signUpSubmit_with_correct_input() throws Exception { mockMvc.perform(post("/sign-up") .param("nickname", "keesun") .param("email", "email@gmail.com") .param("password", "12345678") .with(csrf())) .andExpect(status().is3xxRedirection()) .andExpect(view().name("redirect:/")); assertTrue(accountRepository.existsByEmail("email@gmail.com")); BDDMockito.then(JavaMailSender).should().send (any(SimpleMailMessage.class)); } }