월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 기반 REST API 개발
ResourceSeverConfig를 작성하면 LoginForm을 사용할 수 없게되는건가요?
ResourceServerConfig를 삭제하고 SecurityConfig에서 http를 설정하면 loginForm이 나오더라구요. ResourceServerConfig를 작성하면 기존의 loginForm이 나오지 않고 이렇게 나오는게 맞는건지 궁금해서 질문드렸습니다. ResourceServerConfigurerAdapter가 WebSecurityConfigurerAdapter를 덮어씌우는 건가요? This XML file does not appear to have any style information associated with it. The document tree is shown below. <oauth> <error_description>Full authentication is required to access this resource</error_description> <error>unauthorized</error> </oauth>
- 미해결스프링 기반 REST API 개발
SpringSecurity의 loadUserbyUsername을 구현할때 질문이 있습니다.
accountService를 등록해서 security 내부에서 loadUserbyUsername함수를 사용한다고 할때 name으로 객체를 찾아왔습니다. 그럼 password의 검증은 어떻게 해야 되나요? front에서 로그인하는 상황일때 먼저 따로 controller에서 password에 대한 검증을 한뒤에 ouath/token으로 post를 해서 access_token을 받아와야 하나요?
- 미해결스프링 기반 REST API 개발
Exception 처리 질문 드립니다.
강사님 안녕하세요. 강사님 강좌 중 이번이 세번째 수강인데 첫질문 하나 남겨 봅니다. Controller 로직에서 에러가 발견되면 ResponseEntity 에 에러코드를 기록해서 응답을 하는 부분은 이해를 했는데요. 만약 Service 로직에서 에러가 발생하면 해당 에러를 어떻게 Controller 단의 ResponseEntity 에 기록해 주는 게 좋을까요? Controller 에서 Service 호출 시에 Try/Catch 로 감싸야 하는 것인지.. 좋은 가이드를 간략하게라도 부탁드려봅니다.
- 해결됨스프링 기반 REST API 개발
springframework validator 질문
안녕하세요. 덕분에 많이 배우고 있습니다. validator를 bean으로 등록해서 입력 검증을 구현하셨는게 인상적이네요. 제가 기존에 알고있던 validator를 구현하는 방식은 Validator 인터페이스를 구현한 클래스를 생성한 후 WebMvcConfigurer.getValidator 메소드를 오버라이딩 하는 방법과 controller 클래스에 @InitBinder 에노테이션이 선언된 메소드에서 WebDataBinder.addValidator 호출 하는 방법 두가지를 알고 있습니다. // global validator 등록 class MvcConfig implement WebMvcConfigure { @Override public Validator getValidator() { return new EventValidator(); } } // local validator 등록 @RestController class EventController { @InitBinder public void initBinder(WebDataBinder binder) { binder.addValidator(new EventValidator()); } } 하지만 첫번째 방법의 경우 다른 커맨드 객체를 검증하기 어려운 단점이 있고 두번째 방법은 요청 메소드가 호출될때마다 validator가 매번 생성되는 것으로 알고 있습니다. 혹시 강사님은 custom validation을 구현할때 3가지 방식 중 어떤 방식을 선호하고 왜 선호하는지 알 수 있을까요? 감사합니다.
- 해결됨스프링 기반 REST API 개발
_links 에서 profile 질문드립니다.
강좌를 듣다가 궁금한 점이 생기 질문드립니다! "profile":{ "href":"/docs/index.html#resources-events-list" } 1. 다른 링크들과 달리 profile에는 http://localhost:8080이 붙어있지 않아도 되는것인가요?!
- 미해결스프링 기반 REST API 개발
강의 내용에 대해 질문드리고 싶은게 있습니다.
안녕하세요. 영상 잘보고 있습니다. 다름이아니라 영상에서 /api/로 조회를 하셨고 이 조회를 통해서 다음 페이지로 갈수있는 링크 값을 얻으셨는데, 코드보니깐 /api/에 대한 컨트롤러를 추가한게 없더라구요. 여기서 생긴 링크 값은 어디서 생긴건지 알수 있을까요?
- 미해결스프링 기반 REST API 개발
REST API 개발시 CSRF 처리 문의
항상 좋은 강좌 감사드립니다~ REST API 서버 개발시 보안 관련해서 문의드립니다. REST API 서버 개발일 경우에 CSRF 처리를 해야하나요? Browser와 session 기반의 서비스가 전혀 없는 순수한 REST API Server라면 CSRF 처리를 하지 않아도 될 것 같은데요...
- 미해결스프링 기반 REST API 개발
badRequets에 index 링크를 넣는 과정에서 궁금증이있습니다.
@Valid나 자체적으로 Vaildator는 Erorrs를 EntityModel로 만들어서 응답하지만 spring.jackson.deserialization.fail-on-unknown-properties=true 에 대한 badrequest에는 어떻게 적용해야 할지 잘 모르겠습니다. 400에러와 null값만 오는데 이것도 EntityModel로 응답할 방법이 있을까요??
- 미해결스프링 기반 REST API 개발
EventResource 클래스 코드 공유드립니다.
EntityModel 객체를 상속하고 EntityModel 내부를 뜯어보았을 때 of 메소드 패턴을 가지고 있고, EventResource는 Event라는 도메인에 종속된 객체이기 때문에 아래와 같이 처리하였습니다. public class EventResource extends EntityModel<Event> { private static WebMvcLinkBuilder selfLinkBuilder = linkTo(EventController.class); private EventResource(){ } public static EntityModel<Event> of(Event event, String profile){ List<Link> links = getSelfLink(event); links.add(Link.of(profile, "profile")); return EntityModel.of(event, links); } public static EntityModel<Event> of(Event event){ List<Link> links = getSelfLink(event); return EntityModel.of(event, links); } private static List<Link> getSelfLink(Event event) { selfLinkBuilder.slash(event.getId()); List<Link> links = new ArrayList<>(); links.add(selfLinkBuilder.withSelfRel()); return links; } public static URI getCreatedUri(Event event) { return selfLinkBuilder.slash(event.getId()).toUri(); }}
- 미해결스프링 기반 REST API 개발
기선님 안녕하세요.
그 profile 관련 url을 도메인 주소가 바뀌거나 뭐 포트가 바뀌거나 등 상대주소만 리턴해주는 것을 이해를 하였습니다. 그런데 강의내용을 보았을 때 게시판 이상의 어플리케이션을 하나 짰을때 왠지 전부 각각의 컨트롤러마다 흩어져있을 것만 같은 느낌이 들어서 질문을 드리는데요... 혹시 profile 같은 어쩌면 event 라는 개념이 conference로 바뀔수도 있는 가능성이 존재하니까요.. create-event -> create-conference가 되는 경우 수정을 해주어야할텐데.. 이런경우 한곳에서 관리할만한 구조가 있으면 편할텐데 그런 방법이 아직까지 감이오지 않아서 혹시 생각해보신 케이스가 있는지 여쭤보고 싶습니다.
- 미해결스프링 기반 REST API 개발
두가지 추가적인 코드 공유드립니다.
1. rest docs 문서에 반환될 값들의 타입을 강하게 걸어서 확실한 테스트를 하고 싶으시다면 아래와 같이 type에 JsonFieldType을 추가하여 테스트할 수 있습니다. 2. 그리고 json의 특정 값이 리턴될 수 있고 안될 수 있는 결과라면.. 예를 들어, response에 description 필드가 있을 경우, 없을 경우를 하나의 문서로 만들기 위해서는 optional()을 붙여주면 됩니다. 결과적으로는 relaxed랑 비슷해졌지만.. 개개의 필드를 설정할 수 있다는 점이 강점인것 같네요. responseFields( fieldWithPath("id").type(JsonFieldType.NUMBER).description("event id"), fieldWithPath("name").type(JsonFieldType.STRING).description("Name of new event"), fieldWithPath("description").type(JsonFieldType.STRING).description("event description"), fieldWithPath("beginEnrollmentDateTime").type(JsonFieldType.STRING).description("event enroll start date"), fieldWithPath("closeEnrollmentDateTime").type(JsonFieldType.STRING).description("devnet enroll end date"), fieldWithPath("beginEventDateTime").type(JsonFieldType.STRING).description("event start date"), fieldWithPath("endEventDateTime").type(JsonFieldType.STRING).description("event end date"), fieldWithPath("location").type(JsonFieldType.STRING).description("event location"), fieldWithPath("basePrice").type(JsonFieldType.NUMBER).description("event basePrice"), fieldWithPath("maxPrice").type(JsonFieldType.NUMBER).description("event maxPrice"), fieldWithPath("limitOfEnrollment").type(JsonFieldType.NUMBER).description("limit enrollment"), fieldWithPath("free").type(JsonFieldType.BOOLEAN).description("the event is free"), fieldWithPath("offline").type(JsonFieldType.BOOLEAN).description("the event is offline"), fieldWithPath("eventStatus").type(JsonFieldType.STRING).description("event status"), //optional fields fieldWithPath("_links.self.href").type(JsonFieldType.STRING).description("my href").optional(), fieldWithPath("_links.query-events.href").type(JsonFieldType.STRING).description("my href").optional(), fieldWithPath("_links.update-event.href").type(JsonFieldType.STRING).description("my href").optional())
- 미해결스프링 기반 REST API 개발
EventResource 객체를 생성하지 않고 EntityModel 객체를 받아와서 처리했습니다.
소스를 공유합니다. @PostMapping public ResponseEntity createEvent(@RequestBody @Valid EventDto event, Errors errors) { if(errors.hasErrors()) { return ResponseEntity.badRequest().body(errors); } eventValidator.validate(event, errors); if(errors.hasErrors()) { return ResponseEntity.badRequest().body(errors); } Event newEvent = eventRepository.save(modelMapper.map(event, Event.class)); Integer eventId = newEvent.getId(); newEvent.update(); WebMvcLinkBuilder selfLinkBuilder = linkTo(EventController.class).slash(eventId); URI createdUri = selfLinkBuilder.toUri(); EntityModel eventResource = EntityModel.of(newEvent); eventResource.add(linkTo(EventController.class).slash(eventId).withSelfRel()); eventResource.add(linkTo(EventController.class).withRel("query-events")); eventResource.add(selfLinkBuilder.withRel("update-event")); return ResponseEntity.created(createdUri).body(eventResource); }
- 스프링 기반 REST API 개발
기선님 안녕하세요. Location header와 Redirect URL이 이상하게 나와서 질문드립니다ㅠㅠㅠ
삭제된 글입니다
- 스프링 기반 REST API 개발
안녕하십니까 기선님.
삭제된 글입니다
- 해결됨스프링 기반 REST API 개발
핸들러 파라미터로 @AuthenticationPrincipal 어노테이션을 설정 했을때 동작 원리에 대한 질문입니다.
안녕하세요. "현재 사용자 조회" 강의 내용 중 핸들러 메소드의 파라미터로 Spring Security가 제공하는 @AuthenticationPrincipal 어노테이션을 사용하여 Principal 객체를 주입받아서 사용하는 부분이 있었습니다.(EventController.class의 핸들러 메소드 파라미터 부분) Principal 객체란 SecurityContextHolder 안에 담겨 있는 인증된 사용자의 정보이고 기본적으로 username, password, grantType을 가지고 있지만, 이를 Security 설정 파일에서 설정한 UserDetailsService 구현체의 loadUserByUsername() 메소드를 통해 얻어지는 커스텀한 Principal 객체로써도 사용이 가능하다는 것을 알게되었습니다. (추가적인 사용자의 정보를 참조할 수 있다는 점에서 User 타입의 단점(?)을 보완할 수 있다고 생각이 듭니다.) 서론이 길었네요. 궁금한 것은 @AuthenticationPrincipal 어노테이션을 사용했을 때... 그리고 SpEL을 사용하여 "anonymousUser"가 아니라면 메소드 파라미터로 Account 타입의 객체를 주입할 수 있었던 이유는 해당 어노테이션이 인증된 사용자 정보가 SecurityContextHolder안에 담겨져 있으면 자동으로 주입해주는 역할을 하며, 현재 애플리케이션에서는 인증 과정과 어댑터 패턴을 통해 AccountAdapter 객체가 Principal로 SecurityContextHolder 안에 담겨져 있을 테고, SpEL을 통해 AccountAdapter의 getAccount() 메소드를 호출 함으로써 주입한다라고 생각하면 될까요? 긴 글 읽어주셔서 감사합니다.
- 해결됨스프링 기반 REST API 개발
"/oauth/token" URL에 대한 요청 처리가 자동으로 이루어지는 지점에 대한 확인차 질문 글을 남깁니다.
안녕하세요. "스프링 시큐리니 OAuth2 인증 서버 설정" 강의 중 Token 발급 TEST 코드를 작성하면서 "/oauth/token" URL을 POST 방식으로 요청하는 것을 볼 수 있었습니다. 저희가 직접 "/oauth/token" URL에 대해 매핑을 하지 않아도 처리가 가능했던 이유는 pom.xml에서 "spring-security-oauth2-autoconfigure" 의존성 설정을 함으로써 가능했던 것이고, 더 나아가 실제로 어떤 지점에서 "/oauth/token" URL이 매핑되어 처리가 되는지 디버깅을 통해 찾아본 결과, org.springframewirk.security.oauth2.config.annotaion.web.configuration 패키지의 WebSecurityConfigurerAdapter를 상속받은 AuthorizationServerSecurityConfiguration 클래스의 configure(HttpSecurity http) 메소드가 재정의 됨으로써 "/oauth/token" URL이 매핑이 되었다는 것을 알 수 있었습니다. 제가 확인한 사항이 맞는지 궁금합니다.
- 해결됨스프링 기반 REST API 개발
응답 본문으로 반환되는 컴포지트 객체에 대한 Serializitoin시 Unwrapped를 해야하는 이유에 대한 질문입니다.
안녕하세요. 응답 본문에 전달되는 Unwrapped된 JSON 문자열에 대해 궁금한 사항이 두 가지 있어 질문 글을 남깁니다. "Spring HATEOS 적용" 강의 내용 중 응답 본문에 Link 정보를 넣어주기 위해 ResourceSupport 또는 Resource<T>를 상속받는 EventResource 클래스를 생성하고, 이를 사용하여 Event에 대한 링크 정보를 생성할 수 있었습니다. EventController의 createEvent() 메소드에서 응답 본문에 EventResource 타입의 데이터를 반환하는 모습을 볼 수 있었는데요.(ObjectMapper(+BeanSerializer)을 이용한 JSON 문자열 데이터) 이때 EventResource는 컴포지트 객체인 Event 타입의 필드를 가지고 있기 때문에 BeanSerializer가 자동으로 Event 타입의 필드명으로 JSON 문자열을 감싸고, 그 안에 필드 목록을 JSON 데이터로써 넣어주게 되는 것일까요? 이전 수업까지 EventController의 createEvent()에서는 EventDto 객체를 ModelMapper을 사용하여 Event 객체로 변환하고, 응답 본문에 넣어주었는데, 이 경우 Event 객체의 필드 목록에는 컴포지트 객체가 없기 때문에 특정한 필드명으로 감싼 형태의 JSON 문자열이 나오지 않았다고 이해하면 될까요? 또한, JSON 문자열에 대해 Unwrapped를 하느냐, 마느냐에 대한 결정은 개발자의 선택이고, REST API에서 권장사항은 별도로 없는 것인가요? 긴 글 읽어주셔서 감사드리며, 조언 부탁드립니다. [참고사항] Spring HATEOS 1.1.0 버전을 사용하고 있기에 ResourceSupprot ==> RepresentaionModel Resource<T> ==> EntityModel<T> 로 사용하였습니다.
- 해결됨스프링 기반 REST API 개발
javax.validation에서 제공하는 @NotEmpty와 같은 어노테이션이 동작하지 않는 이유가 궁금합니다.
안녕하세요. 이전에 "Bad Request 처리" 강의에 대한 질문 중 스프링부트 버전 2.3.0에서 starter web에 디펜던시로 spring-boot-starter-validation가 제외된 이슈와 관련하여 직접 "javax.validation"을 의존성 설정을 해줌으로써 @NotEmpty와 같은 어노테이션을 사용할 수 있었습니다. 하지만 추가적인 문제가 발생했는데요. EventDto class의 특정 필드에 @NotEmpty, @NotNull과 같은 어노테이션을 설정했음에도 불구하고 유효성 검사가 정상적으로 이루어지지 않고 있습니다.(동작하지 않는 것 같습니다.) "javax.validation"외 추가적인 의존성 설정이 필요한 것인지 궁금합니다. [참고자료] https://stackoverflow.com/questions/8756768/annotations-from-javax-validation-constraints-not-working 위 참고자료를 보면, 저 같이 "javax.validation"이 아닌 "spring-boot-starter-validation"에 대해서 의존성 설정을 추가하라는 제안이 있었는데요. 실제로 유효성 검증을 처리하여 Errors(또는 BindingResult)에 결과를 넘겨주는 라이브러리가 "spring-boot-starter-validation"에는 추가로 존재하는 것일까요?
- 해결됨스프링 기반 REST API 개발
javax.validation 패키지에 대한 질문입니다.
안녕하세요. Spring REST API "Bad Request 처리" 강의 내용 중 javax.validation 패키지를 사용하여 @Valid, @NotEmpty, ... 등과 같은 어노테이션을 사용하는 것을 볼 수 있었습니다. 다만, 직접 코딩했을 때 위 어노테이션을 사용하기 위한 javax.validation 패키지를 import 할 수가 없어서 직접 pom.xml에 의존성을 설정해주었는데요. 이전 Spring MVC 강의를 학습하면서 생성했던 스프링 부트 프로젝트 의존성 설정 내용을 보니, 별도로 javax.validation에 대한 의존성 설정을 추가하지 않고 Validation을 사용했었습니다. javax.validation 패키지에 대해 의존성을 추가하지 않고, 스프링 부트 환경에서는 곧 바로 사용할 수 있는 방법이 별도로 존재 하는걸까요? 아니면, 스프링 부트 프로젝트 버전이 업데이트 되면서 validation이 자동으로 빠진 문제일까요? [참고 링크1 - Spring REST API 학습 저장소] https://github.com/wdEffort/std-spring-rest-api/blob/master/pom.xml [참고 링크2 - Spring MVC 학습 저장소] https://github.com/wdEffort/std-spring-mvc-mid/blob/master/pom.xml
- 미해결스프링 기반 REST API 개발
Long 타입에 대한 질문입니다.
강의에서 엔티티 클래스를 정의할 때, Long 타입을 id로 사용하는 이유가 궁금합니다. primitive 타입인 long 타입도 있는데, Long타입과의 차이점? 사용시의 차이점..?을 알고 싶습니다. 항상 친절한 답변 감사드립니다 (_ _)