소개
강의
수강평
- 생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
- 생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
- 생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
- 생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
- 생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
게시글
질문&답변
5:23분 테스트 결과 관련 문의드립니다.
스프링부트 버전이 올라가면서 없는 API를 호출할 경우 NoResoucrFoundException 예외를 발생시키도록 바뀐거 같습니다. NoResoucrFoundException을 따로 ExceptionHandler로 처리 해주고 있지 않아서 Exception을 처리하는곳에서 처리가 됐습니다. GlobalExceptionHanlder에 아래 예외를 추가해주면 404로 오류를 반환할 것 입니다.@ExceptionHandler(NoResourceFoundException.class) protected ResponseEntity handleNoResourceFoundException(NoResourceFoundException e) { log.error("NoResourceFoundException", e); ErrorResponse errorResponse = ErrorResponse.of(NOT_FOUND.toString(), "Requested resource not found."); return ResponseEntity.status(NOT_FOUND).body(errorResponse); } 그리고 ExceptionHandler가 먼저 수행되는건 서버 자기 자신한테 요청하기 때문에 자신한테 없는 API이기 때문에 GlobalExceptionHandler에서 먼저 처리를 하고, FeignClientExceptionErrorDecoder 에서는 에러 응답을 받은 후 처리하기 때문에 2번째로 처리가 됐습니다. 8081 서버를 하나 더 띄우고 (사진)8081 서버로 /api/health2 를 요청한다면 8080서버에서는 ExceptionHandler에서 오류 처리를 안하고, FeignClientExceptionErrorDecoder에서만 에러를 처리합니다. 8081 서버는 GlobalExceptionHandler에서 오류 로그를 남기고 반환할 오류 응답을 만들 것 입니다.(사진)
- 0
- 3
- 49
질문&답변
5:23분 테스트 결과 관련 문의드립니다.
안녕하세요 지수님! 강의 잘 듣고 계시 감사합니다!혹시 깃허브링크를 남겨주실 수 있으실까요?
- 0
- 3
- 49
질문&답변
도메인형 패키지 구조 질문
안녕하세요! 도메인 주도 개발이라고해서 꼭 특정 패키지 구조로만 해야 도메인 주도 개발인 것은 아니긴해서 말하기 조심 스러운 부분이 있긴하네요! 단순히 controller / service/ dto 기반으로 화면단위로 개발하는것보다는 도메인 주도 개발쪽에 가깝다고는 생각합니다.
- 0
- 1
- 70
질문&답변
oauth 회원가입 시 필수 추가 정보는 어떤 식으로 받으시나요?
안녕하세요! 인프런 AI인턴이 이미 답을해주었네요! 리소스서버에서 받아오지 않는 정보들은 따로 추가페이지를 만들고 해당 정보들을 다 입력하도록하여 회원가입을 완료하면됩니다.
- 0
- 2
- 89
질문&답변
Xss 에서 WebConfig 오류 발생됩니다.
안녕하세요. 해당 내용을 확인해보았는데 스프링부트3부터 javax에서 jakarta로 변경되면서 구현해야할 Filter가 수정이 되었습니다 ㅠㅠlucy-xss-filter는 최근에 업데이트가 안되고 있어서 github에 이슈로 등록도 다른분이 해두셨더라구요.lucy-xss-filter 버전이 업데이트 되지 않으면 사용이 안될것으로 보입니다. lucy-xss-filter버전 대응이 되면 추후에 사용할 수 있을 것으로 보이네요https://github.com/naver/lucy-xss-servlet-filter/issues/50
- 0
- 1
- 488
질문&답변
리프레시 토큰 사용 관련 문의 건
안녕하세요 저도 보안에 대해서 자세히 아는건 아니지만 제가 아는선에서 답변드리겠습니다.https로 전송 시 값 자체를 암호화해서 보내기 때문에 중간에 탈취되더라도 토큰 값 자체를 볼 수는 없을 것 2. 입니다. 카카오 API도 그렇고 다른 it기업들의 API문서를 보더라도 Response Body에 토큰 값을 담아서 반환하고 있습니다.3. Client에 토큰을 저장 시 어디에 저장할지가 사실 더 중요하다고 생각합니다. 참고할만한 블로그들을 첨부드립니다!https://www.google.com/search?q=%ED%86%A0%ED%81%B0+%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8+%EC%A0%80%EC%9E%A5&sourceid=chrome&ie=UTF-8https://blogeon.tistory.com/entry/JWT%EC%9D%98-Refresh-Token%EA%B3%BC-Access-Token%EC%9D%80-%EC%96%B4%EB%94%94%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C
- 0
- 1
- 221
질문&답변
applycation.yml 의 readTimeout 이 적용이 안됩니다.
안녕하세요! 최근 문서를 보니 다음과 같이 변경이 되었네요!https://docs.spring.io/spring-cloud-openfeign/docs/4.0.6/reference/html/spring: cloud: openfeign: client: config: default: connectTimeout: 5000 readTimeout: 5000(사진)FeignClientExceptionErrorDecoder에서 오류가나는건은 RetryableException 생성자의 다섯번째 생성자retryAfter가 Date 1개만 존재하였는데 Long을 파라미터로 받는 파라미터가 추가되었습니다. 앞에 타입을 (Long)을 지정해주시면 정상적으로 수행될 것 입니다.@Slf4j public class FeignClientExceptionErrorDecoder implements ErrorDecoder { private ErrorDecoder errorDecoder = new Default(); @Override public Exception decode(String methodKey, Response response) { log.error("{} 요청 실패, status : {}, reason : {}", methodKey, response.status(), response.reason()); FeignException exception = FeignException.errorStatus(methodKey, response); HttpStatus httpStatus = HttpStatus.valueOf(response.status()); if(httpStatus.is5xxServerError()) { return new RetryableException( response.status(), exception.getMessage(), response.request().httpMethod(), exception, (Long) null, response.request() ); } return errorDecoder.decode(methodKey, response); } }
- 0
- 2
- 462
질문&답변
applycation.yml 의 readTimeout 이 적용이 안됩니다.
안녕하세요!! 스프링부트 버전과 호환이 안되서 정상적으로 동작하지 않는것으로 보이네요버전을 한번 아래처럼 바꿔보시겠어요?set('springCloudVersion', "2023.0.0")(사진)
- 0
- 2
- 462
질문&답변
강사님 Swagger에 질문드립니다.
안녕하세요! 말씀하신것처럼 springdoc를 사용하는게 더 좋을꺼 같습니다.스프링부트도 버전이 계속 신규로 나오고 다른 라이브러리도 계속 변경될 것 인데 가능하면 최신버전으로 바꾸시면 좋을꺼 같네요!강의에서 진행했던 기능을 동일하게 springdoc에서도 어떻게 사용하는지 정도만 한번 찾아보면 될꺼 같습니다.
- 0
- 2
- 213
질문&답변
kakao token 발급 시 에러
에러를 다시 보니깐 KakaoTokenClient로 카카오 토큰을 받아올 때 변환이 안되서 그렇군요! Response의 contentType을 text/html 로 인식하는거 같네요혹시 모르니 코드도 복사해서 붙여 넣어보시면 좋을꺼 같습니다. @GetMapping("/oauth/kakao/callback") public @ResponseBody String loginCallback(String code) { String contentType = "application/x-www-form-urlencoded;charset=utf-8"; KakaoTokenDto.Request kakaoTokenRequestDto = KakaoTokenDto.Request.builder() .client_id(clientId) .client_secret(clientSecret) .grant_type("authorization_code") .code(code) .redirect_uri("http://localhost:8080/oauth/kakao/callback") .build(); KakaoTokenDto.Response kakaoToken = kakaoTokenClient.requestKakaoToken(contentType, kakaoTokenRequestDto); return "kakao toekn : " + kakaoToken; } KakaoTokenClient @FeignClient(url = "https://kauth.kakao.com", name = "kakaoTokenClient") public interface KakaoTokenClient { @PostMapping(value = "/oauth/token", consumes = "application/json") KakaoTokenDto.Response requestKakaoToken(@RequestHeader("Content-Type") String contentType, @SpringQueryMap KakaoTokenDto.Request request ); }KakaoTokenDto의 Response에서 기본생성자가 없을 경우 오류가 발생하시는 분들도 있으셔서@NoArgsConstructor와 @AllArgsConstructor도 한번 추가해 보시면 좋을꺼 같습니다.public class KakaoTokenDto { @ToString @Builder @Getter @NoArgsConstructor @AllArgsConstructor public static class Response { private String token_type; private String access_token; private Integer expires_in; private String refresh_token; private Integer refresh_token_expires_in; private String scope; } }
- 0
- 2
- 593