24%
65,180원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Testcase 상에서 @Trasactional 사용시
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요.안녕하세요. 호돌맨님 강의 잘 보고 있습니다! Post 관련 테스트를 작성할 때, 저는 @Transactional을 이용해서 DB에 데이터가 반영되지 않도록 시도했습니다.그리고 테스트를 진행하였습니다. 메서드를 각각 테스틀 할 때는 통과했지만, 메서드 모두 동시에 돌릴 때는 테스트 통과에 실패하였습니다. @Transcational, 영속성 컨텍스트로 구글링을 시도했었습니다. @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)를 사용하면 영속성 컨텍스트를 새로 생성함으로써 테스트가 모두 통과가 되었지만, 매번 영속성 컨텍스트를 새로 생성하는 것은 비효율적이라고 생각했습니다.. 결론적으로 제가 본 바로는 유의미한 결과를 얻을 수 없었습니다.. 아래 코드와 그에 출력되는 결과를 이미지로 첨부해두었습니다. 혹시 어떤 것이 원인인건지 힌트라도 알려주실 수 있을까요?? 구글링 키워드를 알려주셨으면 좋겠습니다..! (해결법은 제가 찾겠습니다!!)PostService.java @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class PostService { private final PostRepository postRepository; @Transactional public void save(PostCreateDto postCreate){ // Post post = new Post(postCreate.getTitle(), postCreate.getContent()); Post post = Post.builder() .title(postCreate.getTitle()) .content(postCreate.getContent()) .build(); postRepository.save(post); } public Long findPostById(Long postId){ Post post = postRepository.findById(postId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 게시물입니다.")); return post.getId(); } } PostServiceTest.javaimport com.toktok.core.domain.post.Post; ... @SpringBootTest @Transactional. //똑같이 영속성 컨텍스트를 공유하고 있기 때문에 save가 롤백되어야 하지 않나요??.. class PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("데이터가 저장 되어야합니다.") void save_test(){ //given PostCreateDto postDto = PostCreateDto.builder() .title("제목입니다.") .content("내용입니다.") .build(); //when postService.save(postDto); //then Post post = postRepository.findAll().get(0); assertThat(post.getId()).isEqualTo(1L); assertThat(post.getTitle()).isEqualTo(postDto.getTitle()); } @Test @DisplayName("데이터는 하나 조회") void find_test(){ //given Long postId = 1L; PostCreateDto postDto = PostCreateDto.builder() .title("글 제목입니다.") .content("글 내용입니다.") .build(); postService.save(postDto); //when Long postById = postService.findPostById(1L); //then assertThat(postById).isEqualTo(1L); } @Test @DisplayName("존재하지 않는 데이터 확인") void not_exist_post(){ //given Long notExistPostId = 2L; Post post = Post.builder() .title("글 제목입니다.") .content("글 내용입니다.") .build(); Post savedPost = postRepository.save(post); //when postService.findPostById(savedPost.getId()); //then assertThrows(IllegalArgumentException.class, ()-> postService.findPostById(notExistPostId)); } }
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
@ModelAttribute 사용시 @Valid
@RequestBody @Valid 사용시에 오류가 발생하면ControllerAdvice @ExceptionHandler(MethodArgumentNotValidException.class)로 잡을 수 있었습니다.하지만 @ModelAttribute를 사용하면ControllerAdvice @ExceptionHandler(MethodArgumentNotValidException.class)로 잡히지가 않습니다..제가 잘못한 부분이 있을까요?/author/presentation/AuthorControllergetAuthorListByNickname에서 오류가 잡을 수가 없습니다.ControllerAdvice는/global/error/ControllerAdvice에 있습니다.감사합니다~https://github.com/320Hwany/Webtoon
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
인증요청시 문의드립니다.
강의진행중 궁금한게 있어서 문의드렸습니다!강의중에 토큰이 탈취될수도 있다고하셔서 String jws = Jwts.builder() .setSubject(String.valueOf(userId)) .signWith(key) .setIssuedAt(new Date()) .compact();코드를 넣어주셨습니다. 매번 다른 accessToken값이 나올수 있도록이요! 그 결과 로그인 시마다 매번 다른 토큰값이 나오는데, 로그인을 하고나서 기존의 토큰값으로 /foo 메소드를 호출하여도 인증이 되는데 왜 그런걸까요??1. 로그인시 abc토큰이 나와서 abc토큰으로 /foo 컨트롤러를 호출함 인증됨2. 또 한번 로그인시 abcd토큰이 나옴. 그런데 이전 로그인 토큰이였떤 abc토큰으로 /foo 컨트롤러를 호출하여도 인증 성공됨.왜 그런지 궁금합니다!
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
시즌3 예정에 열렬한 환호를 보냅니다.
시즌3 예정에 열렬한 환호를 보냅니다.
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
PostCreate 기본생성자 없이 테스트 통과에 대하여
작성글 저장2 - 클래스 분리에서 PostCreate 테스트 시 기본생성자 없이 테스트 통과가 어떻게 되는지 궁금합니다.커뮤니티에서 저처럼 이 부분에 대해 궁금증이 생겨 질문한 글을 보았습니다.호돌맨님이 그 글에서 링크 건 동욱님 글도 보고 여러 가지 찾아봤는데요.제 나름대로 결론을 지은 것을 말씀드리면기본 생성자가 없을 때는 ObjectMapper가 인스턴스를 생성해 직렬화를 진행할 때 인자와 멤버 변수 간의 관계를 몰라서 그런게 아닐까 생각이 됩니다그리고 호돌맨님의 답변 중 기본 생성자 없이 title, content에 내용을 넣으려면 어떻게 해야하는지에 대해서 고민해봐야 된다고 하셨는데요저는 일단 아래와 같은 방법을 사용해서 테스트를 통과했습니다.@ToString @Getter public class PostCreate { @NotBlank(message = "제목은 필수입니다!") public String title; @NotBlank(message = "내용은 필수입니다!") public String content; @Builder @JsonCreator public PostCreate(@JsonProperty("title") String title, @JsonProperty("content") String content) { this.title = title; this.content = content; } } 혹시 제가 한 방법말고 기본생성자 없이 내용을 넣는 방법을 찾으셨는지? 궁금하고어떻게 호돌맨님은 기본생성자 없이 테스트가 통과 됐는지.. 궁금합니다...
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
인증 처리에 관하여 질문이 있습니다!
안녕하세요 호돌맨님!강의에서는 호돌맨님께서는 스프링 시큐리티를 사용하시지 않고 AuthResolver 및 JWT 방식으로 인증 과정을 처리하셨는데 실무에서도 이렇게 많이 처리하는 편인지 궁금합니다.인증을 이렇게 처리하고 인가 부분만 스프링 시큐리티를 사용하시는지, 아니면 추후에 인증 부분도 스프링 시큐리티를 사용하셔서 리팩토링 하실지도 궁금합니다!감사합니다.
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
데이터 검증2 ErrorResponse의 Map 변경
안녕하세요 호돌님!데이터 검증2 부분에서 Map을 Dto로 변경후 테스트를 통과하였는데,맞는 방법인지, 더 효율적인 방법이 있는지 궁금합니다! 변경한 코드내용은 다음과 같습니다 ErrorResponseValidation 클래스 생성테스트 코드테스트 결과답변 부탁드립니다 감사합니다!
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Exception에 대해서 질문드립니다.
실무를 하다 보면 다양한 Exception이 많이 나오게될텐데 그럴때마다 Exception파일을 만들어서 상속 받은 뒤 처리를 하시나요?? 그러면 엄청나게 많은 Exception파일들이 생길 것 같아서요!!아니면 공통적인 Exception들만 ExceptionHandler로 잡아서 에러처리하고 공통적이지 않은 Exception들은 어떤식으로 처리하는지 궁금합니다.저희 회사같은 경우는 Enum클래스에 여러가지 상황에맞는 상태코드와 문구를 설정해두고, 해당 상황이 나오면 상태코드와 문구를 Json데이터에 세팅하여 내려주더라구요. 반면에 ExceptionHandler는 사용하지 않고 있어요.호돌맨님은 어떤식으로 처리하는지 궁금하여 질문드립니다.
- 해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
회원가입 성공 시 테스트에 대한 질문입니다.
안녕하세요 호돌맨님회원가입 성공 시 테스트 코드에 대해서 궁금한게 있어 질문 드립니다. @Test @DisplayName("회원가입 성공") void test1() { PasswordEncoder encoder = new PasswordEncoder(); Signup signup = Signup.builder() .name("호돌맨") .email("hodolman@gmail.com") .password("1234") .build(); authService.signup(signup); assertEquals(1L, userRepository.count()); User user = userRepository.findAll().iterator().next(); assertEquals("hodolman@gmail.com", user.getEmail()); // assertNotNull(user.getPassword()); // assertNotEquals("1234", user.getPassword()); assertTrue(encoder.matches("1234", user.getPassword())); assertEquals("호돌맨", user.getName()); } 지금 userRepository에 비밀번호가 암호화 된 상태로 저장중이어서 assertTrue로 테스트를 한 번 짜봤는데 위처럼 하는 방식은 좋지 않은 방식인가요?
- 해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
안녕하세요 유틸클래스 질문있습니다
보통 암호화하는 클래스들을 static 유틸클래스들로 만들었었는데 이런 static유틸클래스와 @Component를 달아서 사용하는 유틸클래스는 어떤 차이를 만들어낼수있는건가요..?제가 생각했을땐 유틸클래스를 스프링 빈으로 관리하겠다는 생각만 떠오르는데.. 이해할수있을만한 예시가있을까요..? 제가 못찾는건지 마땅히 그럴싸한 자료를 못봤던것같아서요 ㅠ강의도중 @Component얘기가 잠깐나와서 생각이나서 질문드려봅니다...
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
스프링부트 3.0.2 querydsl + rest docs + propoerties
스프링부트 3.0.2로 따라하고 계신분들을 위한 공유입니다.queryDSLimplementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api"Spring REST Docsext { asciidocVersion = "3.0.0" }버전을 3.0.0으로 지정application.propertiesspring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
vue설치후 소소하게 질문있습니다!
vue.js설치후 각각의 vue파일안에 html코드가 호돌맨님 코드처럼 색깔이 구분되지 않고 타이핑을해도 자동완성?? <tem 이정도만 쳐도 <template>이렇게 뜨는정도?? 이런게 안되고 있는데, localhost:5137를 실행하면 정상적으로 화면은 뜹니다.제대로 설치가 된걸까요??
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
영상에 나오는 브금 출처좀 알 수 있을까요?
노동요로 좋네요ㅇㅅㅇ
- 해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Interceptor 여러번 호출
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()); } }@Slf4j public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info(" >> preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info(" >> postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info(" >> afterCompletion"); } } 호출이 여러번 되는 현상이 발생합니다. preHandle 로그가 3번 찍혀요.검색하여 기본 + 2번 더 호출된다는 글을 보았으나, 제게는 해결책이 아니었습니다.(https://okky.kr/articles/598386)2번 더 호출 될 때에는 request.getParameter null로 넘어옵니다. (acceessToken까지 진행해보다가 롤백했어요 ... 이거부터 해결이 되어야해서 ㅠ.ㅠ)도와주세요 호돌맨님! (git 주소 가렸어요 ! :D)
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
문서화를 위한 별도의 테스트 클래스를 꼭 만들어야 하나요?
강의에서는 API 문서화를 위한 별도의 테스트 클래스를 만들어서 진행하셨잖아요? 실무에서도 이렇게 별도로 만드시나요? 아니면 컨트롤러 테스트를 하나만 만들고 어노테이션만 추가해서 하시나요?
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
호돌맨님 강의 챕터 순서대로 듣지 않아도 상관없을까요?
Spring Rest Docs 까지 순서대로 들었는데 깃헙이나 배포, Vue 이 부분보다 인증 부분이 좀 더 급한 거 같아 그 부분 먼저 들으려고 하는데 상관없을까요?
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
QueryDsl 추가 과정에서 질문이 있습니다..
안녕하세요 선생님. Querydsl 설정하는 부분에서 질문이 있습니다.호돌맨님 강의영상처럼 똑같이 보고 따라했는데 제꺼에선 Q클래스를 인식하지를 못 하더라구요.제가 기존에 영한님 강의에 익숙해져서 빌드 도구를 gradle이 아니라 인텔리제이로 해놨었거든요.그래서 혹시 몰라 gradle로 바꾸니 이제 QClass가 잘 생성이 되네요.혹시 이 부분은 어느 키워드로 검색을 해야할까요..?
- 해결됨호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
QueryDSL에서 발생한 예외 처리 관련 질문
QueryDSL 사용도중, QueryDSL에서 발생한 예외를 @ExceptionHandler를 이용해 처리할 수 있는지 궁금해서 질문드렸습니다.예를들어, QueryDSL + 게시글의 아이디를 이용해 하나의 게시글을 조회하려 하는데retrun jpaQueryFactory.selectFrom(post).where(post.id.eq(postId)).fetchOne();이런식으로 조회를 하려고 할 때 , 만약 존재하지 않는 postId를 입력하면 NPE(NullPointException)이 발생하는데, 이 이러한 예외가 발생했을 때 @ExceptionHandler에서 어떻게 처리할 수 있는지 궁금합니다.(단건 조회관련 별도의 QueryDSL을 쓰는 이유는 단건 조회시, 조회된 엔티티의 연관관계 조회가 따로 필요가 없을 경우는 findById()로 처리하고, 필요한 경우는 QueryDSL의 join().fetchJoin()을 이용해 한 번에 처리하려고 합니다.) 제가 생각한 방법으로는 첫 번째 방법은 @ExceptionHanlder(NullPointException.class)을 이용해 처리하는 건데, 이러한 방법은 다른 상황에서 발생한 NullPointException 마저도 동일하게 처리하기 때문에 문제가 될 수 있을 거 같고, 두 번째 방법은 findById()에 @EntityGraph를 이용해 연관관계를 처리한 다음, 예외처리 관련해서 기존 방법과 같이 findById().orElseThrow(()->new PostNotFound());를 쓰는 것 같습니다. 그러나 이방법은 단건 조회시 항상 연관관계도 조회해야 하는 단점이 있는것 같습니다. 어떤 방식이 효율적인지 궁금해 여쭤보고자 합니다.
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
PostCreate 기본 생성자 문제 질문드립니다.
우선 수업 잘 듣고 있습니다 호돌맨님! 많이 배우고 있어요 ㅎㅎ제목에서와 같이 PostCreate 부분에서 기본 생성자에 관해 질문을 드립니다. // @Setter @Getter @NoArgsConstructor // TODO: 왜 이게 꼭 있어야 하는 것일까? public class PostCreateDto { @NotBlank(message = "타이틀을 입력해주세요.") private String title; @NotBlank(message = "내용을 입력해주세요.") private String content; @Builder public PostCreateDto(String title, String content) { this.title = title; this.content = content; } }우선 이건 제 코드입니다. 보시면 제 코드에는 @NoArgsConstructor 어노테이션이 있는데요. 이 부분이 없으면 제 PostControllerTest에서는 테스트 실패가 뜨더라구요. 에러 메시지는 다음과 같습니다. Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.blog.request.PostCreateDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)에러메시지를 읽어보니 생성자가 없다는 문제 같아서 @NoArgsConstructor 어노테이션을 붙여보니 정상적으로 작동을 하더군요.이 부분이 궁금해서 찾아보니 RequestBody로 넘어오는 데이터를 맵핑할 때 Jackson의 ObjectMapper가 사용되는데 이게 RequestBody를 생성할 때, DTO가 Property기반이 아니거나 Delegate를 한 상태가 아니라면 기본 생성자로 생성한다 라고 나와있네요. (https://velog.io/@conatuseus/RequestBody%EC%97%90-%EC%99%9C-%EA%B8%B0%EB%B3%B8-%EC%83%9D%EC%84%B1%EC%9E%90%EB%8A%94-%ED%95%84%EC%9A%94%ED%95%98%EA%B3%A0-Setter%EB%8A%94-%ED%95%84%EC%9A%94-%EC%97%86%EC%9D%84%EA%B9%8C-3-idnrafiw)그리고 바인딩할 때 Setter가 없이도 자바 리플렉션을 통해서 DTO에 값이 들어간다고 하는 것도 이번에 알게 됐네요. 그래서 Setter를 지우고 Getter랑 @NoArgsConstructor 어노테이션만 붙이고 테스트를 돌려보니 통과가 잘 됩니다. 그런데 호돌맨님이 올려주신 코드를 보니 PostCreate 부분에 기본생성자가 없더라구요. 그런데도 테스트통과가 잘 되는 것을 보니까 신기하네요. 어떻게 그게 가능한 것인지 설명해주실 수 있나요?
- 미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
Controller layer 테스트시 service가 연관되어 있을때 테스트 진행 질문
안녕하세요. 강의 정말 잘 보고 있습니다(모르는 게 이렇게나 많아서 강의보고 찾아보고 공부 정말 많이 되고있습니다)다름이 아니라 강의를 보고 개인적으로 만들어 보고 있는 상황인데, 테스트를 어떤식으로 짜야되는지 갈피를 잡지 못해서 질문을 드립니다.단순히 Controller 만 테스트하는건 강의를 통해 학습을 하고 있는데 만약 DB 에 저장되어 있는 데이터가 필요해 조회해야하는 상황에서는 어떻게 단위테스트를 할 수 있을까요?당장 구글링을 통해 확인한 결과는 Mockito(?) 를 사용하여 '어떤 메소드를 호출하면 개인적으로 정해둔 값을 리턴해!!(given)' 라고 설정해서 테스트를 진행하는데 그러면 실제 DB 에 들어가 있는 데이터값과 다름에도 불구하고 이런 테스트가 올바른지 잘 이해가 되지 않습니다.//Controller @PostMapping("/login") public ResponseEntity<?> loginMember(@RequestBody MemberLoginRequestDTO memberLoginRequestDTO){ log.info("memberLoginRequestDTO={}", memberLoginRequestDTO.toString()); return ResponseEntity.status(HttpStatus.OK).body(memberService.login(memberLoginRequestDTO)); }//Service @Transactional public boolean login(MemberLoginRequestDTO memberLoginRequestDTO){ Member member = memberJpaRepository.findByMemberIdAndPassword(memberLoginRequestDTO.getMemberId(), memberLoginRequestDTO.getPassword()) .orElseThrow(()->new IllegalArgumentException("회원아이디 혹은 비밀번호를 잘못 입력하셨습니다.")); return true; }//TESTCODE @Test @DisplayName("/login 요청시 200 status + true 리턴") void loginTest() throws Exception { //given given(memberService.login(any())).willReturn(true); //expected mockMvc.perform(MockMvcRequestBuilders.post(COMMON_URL + "/login") .contentType(MediaType.APPLICATION_JSON) .content("{\"memberId\" : \"testId\"," + "\"password\" : \"1234\"}") ) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().string("true")) .andDo(MockMvcResultHandlers.print()); }간단한 login API 테스트 입니다.bddmockito 의 given 메소드를 통해 true 를 반환하도록 정의해놓았는데 이런식으로 테스트를 하는게 맞는걸까요?감사합니다.