월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 기반 REST API 개발
asciidoc에서 [[ ]] 의 의미가 궁금합니다.
선생님 좋은 강의 잘 듣고있습니다. 궁금한게 asciidoc에서 [[index]]와 같이 대괄호를 두겹 겹쳐서 사용하는 부분이 있는데, 이게 어떤 의미인지 알 수 있을까요? 구글링해서 찾아보려고 했는데, 잘 안나오네요 ㅠㅠ 답변 주시면 감사하겠습니다. 감사합니다.
- 해결됨스프링 기반 REST API 개발
EventResource 객체 생성자 오류
안녕하십니까 강의를 듣다가 질문이 있어 글을 작성하게 되었습니다 EventController 에 createEvent 에서 EventResource를 생성하는 부분 EventResource eventResource = new EventResource(event); eventResource.add(linkTo(EventController.class).withRel("query-events")); eventResource.add(selfLinkBuilder.withRel("update-event")); 에서 생성자 오류가 발생합니다 EventReource public class EventResource extends EntityModel<Event> { public EventResource(Event event, Iterable<Link> links) { super(event, links); add(linkTo(EventController.class).slash(event.getId()).withSelfRel()); } } 제가 어느 부분을 놓친건지 잘 모르겠습니다.
- 미해결스프링 기반 REST API 개발
로그인 질문
안녕하세요, 항상 좋은 강의 감사합니다. 제가 개인 어플 프로젝트 중에, 로그인에 대해 궁금한 것이 생겨 질문을 하게 되었습니다. jwt 토큰을 가지고 db 인증을 통한 로그인을 구현했습니다. //사용자 정보 깨내기Authentication authentication = SecurityContextHolder.getContext().getAuthentication();Account account = (Account) authentication.getPrincipal(); 위 코드는, @Scheduled를 사용한 메세드 내부로 규칙적인 시간마다 자동으로 오픈 api를 사용자가 어플을 사용하지 않는 동안에도 데이터를 받을 수 있도록 하고 싶은데 로그인을 한 후, 쓰레드 풀에 객체가 담기니 계속해서 데이터를 받을 수 있나요? 혹시 다른 설정을 또 해야하나요? 정리하면 1. 로그인을 하고 jwt 토큰을 담아 전송 2. jwt 확인 후, 객체를 꺼내서 위치 좌표를 사용해서 오픈 api 사용하기 3. 앱을 사용하지 않는 동안에도 매 시간마다 좌표를 꺼내서 api 호출 이렇게 구현하려고 합니다. 로그아웃을 하지 않는 이상 계속해서 쓰레드 풀에 있는 객체를 사용할 수 있나요?
- 미해결스프링 기반 REST API 개발
new Link() 메서드 오류 나시는 분들 주목!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 1.1 버전부터 deprecated 되었다고 합니다. 다음과 같이 Link.of() 사용하시면 됩니다! eventResource.add(Link.of("/docs/index.html#resource-events-create").withRel("profile"));
- 해결됨스프링 기반 REST API 개발
HATEOAS 방식에서 ResponseEntity .notFound() 반환처리 질문입니다.
아무도 안물어보시는것 같아서, 묻게되었습니다.영상 7분 9초 경 - 영상에 없는 "추가적인 NOT_FOUND 반환값"을 갖도록 해서, 문서처리를 하려고합니다이는, ResponseEntity.notFount() 반환값이, HeadersBuilder 인터페이스 타입이라서..ResponseEntity.HeadersBuilder이 경우 body(..) 가 없고, header( .. ) 만 있는데, 본문을 담을 수 없습니다. 그래서 Header 만 추가되도록 구성해야 하는데요, 학생들에게 구현하도록 두신건지,너무 간단해서 언급 안하신건지, 구현하려고 하니 검색자료가 잘 나오질 않아 해매고 있습니다.질문입니다HATEOAS 의 경우, 이런 부분은 일반적으로 어떻게 처리가 되는지요?아래 코드에서 ".header(HttpHeaders.?, ...?)"에 Location 속성에 경로값 설정만 하면 될까요?@GetMapping("/{id}") public ResponseEntity getEvent(@PathVariable Integer id) { var dtoOut = eventRepository.findById(id)... if (dtoOut.isEmpty()) return ResponseEntity .notFound() .header(HttpHeaders.??, ...???) <<< .build(); ... return ResponseEntity.ok(...) }또는, 구현할 필요가 없나요? (HATEOAS 가 전후방 이동경로를 제공하는 메커니즘이라면, 이 경우에도 방향을 잃지 않도록 제공해야 할까요? 아니면 필요가 없나요? 또는 redirect.. )궁금합니다
- 해결됨스프링 기반 REST API 개발
WebLinkBuilder .linkTo( .. ) 사용 시, Class<?> 인수 리팩토링 관련 질문입니다 - feat JAVA9+ StackWalker
안녕하세요 강사님. linkTo() 를 호출하는 시점에 컨트롤러 Class<?> 를 자동으로 알아와 적용하고자 한 동기에서 질문이 시작되었습니다. 아래의 Thread .currentStackTrace() 는 Caller 클래스를 알아오는 기막힌 기능이죠. 그런데 과부하가 걸린다는 단점이 있다고 알게되었습니다. Thread.currentThread().getStackTrace()[1].getClass() 그래서 스텍을 층층히 뒤져서 찾지않는 과부하가 개선된 Java9+ StackWalker 를 알게되었습니다. StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass(); 이것을 아래 코드처럼 WebLinkBuilder .linkTo( ? ) 에 적용하도록 HalModel<T>.of(..) 실행시점으로 옮겼습니다. ( HalModel<T> 은 커스텀 EntityModel-구: Resource<T> 입니다 ) public static <T> HalModel<T> of(T content) { /* Java9+ 이상: getCallerClass() 호출자 @Controller @RestController 클래스를 동적으로 얻어옵니다. */ callerLinkBuilder = linkTo(STACK_WALKER.getCallerClass()); return new HalModel<>(content, Collections.emptyList());} 2가지 질문 입니다 이렇게 적용 하고보니, 2가지 걸리는 문제가 있었습니다.아래는 HalModel 이 적용된 Controller 메서드 예제 입니다. @PostMappingpublic ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) { HalModel<EventDto> model = HalModel.of(eventDto); return ResponseEntity .created(model.contentUri()) .body(model.addSelfContentLink() .addSelfContentLink("update-event") .addSelfLink("query-events") .add(Link.of("/docs/index.html#resources-events-create", "profile")) );} 과연, 이런 방식이 토이프로젝트 외적으로 사용될 수 있을까? 이 방법은, 운영 시 믿을만 한 코드인가? `of() {...}`메서드가 많아지면, callerLinkBuilder = linkTo(STACK_WALKER.getCallerClass()) 이 코드가 매번 들어가야 하는데, 이것을 메서드 추출하면, HalModel 클래스가 Caller 클래스로 얻어지는데, 리팩토링 할 방법이 없음.: Proxy 적용도 힘들고, of 메서드 마다 박혀 있어야 Controller.class 를 얻어오기때문: 위에서 비효율적인 Thread.currentThread() 를 통해 구현할 수도 있지만, 과부하는 피해야 함. 이런 부분에 대해 조언을 얻을 수 있을까요? 읽어주셔서 감사드립니다!
- 해결됨스프링 기반 REST API 개발
withRel( " ... " ) 값을 타입세이프 하게 설정하는 방법에 대한 질문입니다.
안녕하세요 강사님. 열심히 응용하고 있습니다.Relation 이름이 모두 문자열로 있는것이, 마음에 걸려서 아래와 같이 Enum 으로 적용했습니다. // "update-event-etc".withRel(RelationType.UPDATE.dash("event", "etc", ...))// "query-events".withRel(RelationType.QUERY.dash("events")) 타입세이프한 방법을 좀 오버(?)스럽게 대쉬"-" 구분 메서드를 통해 조합되도록 구성했는데요,이와 비슷하거나, 더 나은 방향에 대한 조언을 부탁드려도 될까요? 읽어주셔서 감사합니다.
- 미해결스프링 기반 REST API 개발
EventValidator 질문이 있습니다.
안녕하세요. 다름이 아니라 EventValidator 에서 implement Validator 를 쓰는것과 안쓰는것 차이를 잘 모르겠습니다. 감합니다.
- 미해결스프링 기반 REST API 개발
이벤트 수정 테스트 코드에 대해서
이벤트 수정 테스트 코드에서 document()를 통해 문서를 작업 한다는 것을 이해했습니다. 정상적인 케이스 외, 실패 케이스도 있는데 1. 실패 케이스 같은 경우 - 실패 케이스 별로 문서를 작업한다. - 실패 케이스 별로 테스트 코드를 작성하되 그 중 한 가지만 문서화를 진행한다. 어떠한 방법이 더 좋을까요? 실패에 대한 문서가 너무 많다면 이 또한 관리가 어려울 것 같아 궁금합니다.
- 미해결스프링 기반 REST API 개발
도커 ps 조회 문제
도커 설치 후 docker run --name rest -p 5432:5432-e POSTGRES_PASSWORED=pass -d postgres 이렇게 컨테이너를 만들고나면 docker ps 목록 조회를 할시 안뜨실 경우 docker ps -a 를 하시면 조회가 가능하실거에요. 해당 컨테이너가 실행이 되지 않고있다는 것 인데 설정에 문제가 있어 실행이 안되는 것이라고 하네요. docker ps -a 후에 생성한 컨테이너 ID확인후 docker logs 컨테이너ID <해주시면 아마 문제는 이것이다 라고 설명이 나올겁니다. 저는 (추천하지는 않는다고 하지만 연습이니까) docker run --name rest -p 5432:5432-e POSTGRES_HOST_AUTH_METHOD=trust -d postgres 로 수정해서 docker ps시 조회가 되네용..! 이렇게 하는것이 맞는지 스스로도 의문이 들긴해요..
- 미해결스프링 기반 REST API 개발
Mocking이 되어있는 디스패쳐서블릿
"Mocking이 되어있는 DispatcherServlet" 이라는 표현을 강의중에 사용하셨는데요. @WebMvcTest로 생성되는 빈들은 모두 가짜 객체라고 봐야하며 그 중에 가짜 dispatcherServlet이 있는건지 궁금합니다. 따라서 그 가짜 dispatcherServlet에게 가짜요청을 보낸다고 이해하면 되는건지 알고싶습니다.
- 미해결스프링 기반 REST API 개발
Access is denied
1. 에러 메시지 @EnableWebSecurity 설정해줬는데 왜 이런 에러 메시지가 뜨는 건가요??? 2. AppConfig 3. SecurityConfig 4. target path
- 미해결스프링 기반 REST API 개발
(Resource<Event>(2.1.0.RELEASE) -> EntityModel<Event>(2.2.5.RELEASE))
HATEOAS 적용할 때 스프링부트 버전에 따라 삽집을 많이 해서 자료 공유 합니다. EventResoucre EventController
- 미해결스프링 기반 REST API 개발
페이징된 각 이벤트가 self 이외의 링크도 가져야 할까요??
현재 페이징을 하면 각 이벤트는 각자의 self 링크만 갖고 있는데, 이벤트 단건 조회처럼 self 이외에도 update, query, profile 링크도 가져야 하는지 궁금합니다. 페이징 목적상 '조회'가 우선이므로 페이징시에는 self 링크만 노출하고 클라이언트가 페이징한 이벤트 중 추가 조치가 필요한 이벤트에 대해서 self 링크를 타고 들어가 update나 query 등의 링크를 알게 해야 하는지, (이렇게 self 링크만 있으면 상태전이가 된다고 할 수 있는지요?) 아니면 페이징시에도 모든 링크 관계들을 클라이언트에 전달하는지 고민이 됩니다.
- 미해결스프링 기반 REST API 개발
JUnit5에서 prettyPrint() 적용하기
@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})@SpringBootTestclass EventControllerTest { private MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @Autowired private WebApplicationContext context; @Autowired private EventRepository eventRepository; @BeforeEach void init(RestDocumentationContextProvider restDocumentation) { this.mockMvc = MockMvcBuilders .webAppContextSetup(this.context) .addFilters(new CharacterEncodingFilter("UTF-8", true)) .apply(documentationConfiguration(restDocumentation) .operationPreprocessors() .withRequestDefaults(modifyUris().host("yoonjoy.me").removePort(), prettyPrint()) .withResponseDefaults(modifyUris().host("yoonjoy.me").removePort(), prettyPrint())) .alwaysDo(print()) .build(); } 추가로 addFilters에 UTF-8 설정을 통해 responseBody에서 한글이 깨지는 것을 막고, modifyUris을 통해 호스트 url localhost을 원하는 문자로 바꿀 수 있습니다.
- 미해결스프링 기반 REST API 개발
링크 문자열을 상수로 관리하기도 하나요??
테스트코드를 작성할 때 일일히 문자열로 작성하면 오타 문제가 있을 텐데, 이를 방지하기위해 이넘이나 상수들을 모아두는 클래스에 상수로 링크 문자열을 만들어놓고 사용하는 방법도 하나의 방법이 될 수 있을까요?? HttpHeaders 클래스처럼요!
- 미해결스프링 기반 REST API 개발
안녕하세요 강사님. ObjectMapper가 @Autowired 못읽어오는데 어디서 잘못된건지 모르겠습니다.
안녕하세요. 강의 매우 잘 듣고 있습니다 ! 다름이 아니라 @WebMvcTest 을 빼고 @AutoConfigureMockMvc 를 사용했을 떄, @Autowired ObjectMapper objectMapper;이 쪽에서 에러가 발생하는데 어디쪽을 보면 될까요..?Could not autowire. No beans of 'ObjectMapper' type found.감사합니다.
- 미해결스프링 기반 REST API 개발
테스트코드 관련 질문
안녕하세요. 테스트코드 작성중에 의문점이 있어서 질문드립니다. 테스트 메서드마다 데이터를 비워주기 위해 setUp 메서드에 관련 로직을 넣어서 처리한 것을 확인했는데요. 아래와 같은 오류(NPE)가 발생하네요. 인증시에 오류가 발생하는 것 같은데 도저히 해결책을 못찾겠네요. MockHttpServletResponse: Status = 400 Error message = null Headers = [Cache-Control:"no-store", Pragma:"no-cache", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", X-Frame-Options:"DENY"] Content type = application/json;charset=UTF-8 Body = {"error":"invalid_grant","error_description":"Bad credentials"} Forwarded URL = null Redirected URL = null Cookies = [] 반대로 setUp 메서드를 주석처리하고 실행하면 잘 됩니다. 메서드를 하나만 실행할때와 EventControllerTests 클래스에 있는 모든 메서드를 실행할때 모두 동일합니다. 뭔가 다른 문제가 있는걸까요?? 제가 구현했던 코드 아래 링크에서 확인 가능합니다. https://drive.google.com/file/d/1mYSWQ4EPBNiT9mIrnzAgdmVWBHlIBPXT/view?usp=sharing 바쁘시겠지만 확인해주시면 감사하겠습니다.
- 미해결스프링 기반 REST API 개발
Bad Request에 대한 응답 강의관련 디버깅 질문
강의에서 Errors객체의 내부 값을 확인하기 위해 중단점을 찍고 디버깅버튼을 눌렀을 때 중단점위치 소스에서 진행이 멈춘 것을 확인할 수 있었습니다. 그러나 저는 ConstructorResolver.java라는 소스에서 멈췄는데요. 원했던 중단점 위치가 아니라 이상한 소스에서 멈춘 이유를 알고싶습니다. 강의에서 jsonPath에 대한 테스트실패까지 잘 따라왔는데 위 디버깅은 강의내용과 다르게 흘러가고 있습니다. 아래 캡쳐는 디버깅버튼을 누른 후 나온 내용입니다.
- 미해결스프링 기반 REST API 개발
contentType 필수인지 궁금합니다.
415 에러로 HAL_JSON 이 스프링버전문제로 더 이상 지원이 안되는 문제가 있다는 질문글을 읽었습니다. 그러나 저는 다른 문제로 415에러를 발견했는데요 바로 .contentType(MediaType.APPLICATION_JSON_UTF8)을 생략해 버렸기 때문입니다. MockMvc로 post요청을 보낼 때 Event객체를 objectMapper로 JSON 직렬화를 한 상태로 보내주면 받는 쪽(MockMvc의 Controller)에서 알아서 json으로 해석해주겠지 라고 기대하는 건 잘못된 것인지 알고싶습니다.