월 19,800원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 기반 REST API 개발
'스프링 시큐리티 OAuth2 인증 서버 설정' 강의 유투브 영상 관련
안녕하세요. 영상을 보다가 '스프링 시큐리티 OAuth2 인증 서버 설정' 해당 강의만 유투브로 대체되어 있어서 일시적인 인프런 오류인지 아니면 영상이 삭제되어 어쩔 수 없이 교체된 것인지 궁금합니다. 강의 내용에는 지장이 없지만 갑자기 유투브로 넘어가야 하니 조금 불편한감이 들어 궁금해서 문의 드립니다.
- 미해결스프링 기반 REST API 개발
안녕하세요. oAuth2 관련해서 여쭤볼게 있습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.' 안녕하세요. 기선님 강좌를 보면서 다시 새로 공부를 하면서 개발을 하고 있는 개발자 입니다. 차근차근 따라가면서 때로는 필요한 부분을 찾아서 보면서 정말 많은 도움을 받고 있습니다.. 다름이 아니라 oAuth 연동 관련해서 궁금한게 있어서요.. Client 랑 Server 랑 완전히 분리되어 있는 환경에서는 이번 강좌에 있는 oAuth2 연동에 보안상으로 괜찮을까요? 조금 더 부연 설명을 드리면.. Client 는 vue.js 로 개발되어 Aws CloudFront + S3 환경으로 되어 있고 Server는 springboot 기반의 API 서버예요. (client 쪽은 대충 저렇게만 알고 있어요...) 강의에서 배운것처럼 로그인할때 서버에서 클라이언트로 토큰을 전달해서 다른 기능 API를 사용하게 할 예정인데,, 걱정되는부분은 로그인 처리를 할때 클라이언트에서 서버에 접근할때 쓰는 ID와 패스워드이네요.. 노출이 되면 안되는 정보인데... 클라이언트 소스상에 id, pw가 있으면 그대로 노출이 될 것 같아서요.. 개발 경험과 지식이 많이 부족하다보니 구글링도 해보고 이래저래 찾아보는데... 잘 모르겠어서.. 이렇게 두서없는 질문을 드려봅니다 ㅠ 수업내용에서 조금 벗어나는 내용이라,, 이런 질문을 여기다 남겨도 되는지 모르겠네요 ㅠㅠ 기선쌤 강의중에 참고가 될 만한 강의를 알려주셔도 좋습니다 ㅠㅠ 혹시 몰라서 제 email 주소도 남겨놓겠습니다! 감사합니다! luchientes@naver.com
- 해결됨스프링 기반 REST API 개발
@AuthenticationPrincipal 애너테이션이 User 객체만 가져오는 경우...
안녕하세요. 강의 잘 보고 있습니다. 그런데 강의와는 다르게 제 코드에서는 이상하게 동작하는 부분이 있어서 질문 드립니다. 이 강의에서는 컨트롤러에서 @AuthenticationPrincipal 애너테이션을 통해 AccountAdapter 객체를 가져올 수 있었는데요. 제 코드 상에는 loadUserByUsername 메서드에서 AccountAdapter 객체를 반환해도 @AuthenticationPrincipal 애너테이션에서는 해당 클래스의 객체를 가져오지 못합니다. 대신 스프링 시큐리티의 User 클래스로는 잘 받네요. public ResponseEntity<?> getEvent(Long id, @AuthenticationPrincipal User user) {...} // 이때는 User 객체 잘 가져옴 public ResponseEntity<?> getEvent(Long id, @AuthenticationPrincipal AccountAdapter accountAdapter) {...} // 그런데 이 때는 null 값임 처음에는 UserDetailsService 구현 클래스인 AccountService 클래스를 스프링이 사용하지 않아서 그런건가 싶어서 아래 사항들을 체크했습니다. AccountService가 빈으로 등록되었는지 -> 맞게 등록함 (@Service) AccountService 에서 loadUserByUsername 메서드가 AccountAdapter 객체를 반환하는지 -> 맞게 반환함 AccountAdapter가 스프링 시큐리티의 User 클래스를 상속하는지 -> 상속함 SecurityConfig에서 void config(AuthenticationManagerBuilder auth) 메서드를 오버라이드 해서 UserDetailsService 빈을 추가했는지 -> 추가함 org.springframework.security.web.bind.annotation.AuthenticationPrincipal 대신 org.springframework.security.core.annotation.AuthenticationPrincipal 애너테이션을 사용했는지 -> 사용함 제가 어떤 부분을 간과해서 문제가 해결이 안되는 걸까요? 전체 소스는 깃허브에 올렸습니다.
- 미해결스프링 기반 REST API 개발
왜 자꾸 201응답이 오는지 모르겠네요..
@Test public void createEvent_Bad_Request_Empty_Input() throws Exception { EventDto eventDto = EventDto.builder().build(); this.mockMvc.perform(post("/api/events/") .contentType(MediaType.APPLICATION_JSON_UTF8) .content(this.objectMapper.writeValueAsString(eventDto))) .andExpect(status().isBadRequest()); 이 테스트를 진행 하려고하는데 자꾸 201 응답코드만 떨어집니다. 왜그런걸까요??? @valid 어노테이션 잘 설정한거같은데 1시간째 못찾고있습니다 package dlee.demorestapi.events;import org.modelmapper.ModelMapper;import org.modelmapper.internal.Errors;import org.springframework.hateoas.MediaTypes;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import javax.validation.Valid;import java.net.URI;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;@Controller@RequestMapping(value="/api/events",produces = MediaTypes.HAL_JSON_VALUE)public class EventController { private final EventRepository eventRepository; private final ModelMapper modelMapper; public EventController(EventRepository eventRepository,ModelMapper modelMapper){ this.eventRepository = eventRepository; this.modelMapper = modelMapper; } @PostMapping public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors){ //JSON을 객체로 변환하는거니까 deserializationerrors System.out.println(errors.getMessages() + "asdsadasds"); if(errors.hasErrors()){ return ResponseEntity.badRequest().build(); } Event event = modelMapper.map(eventDto,Event.class); Event newEvent = this.eventRepository.save(event); URI createdUri = linkTo(EventController.class).slash(newEvent.getId()).toUri(); return ResponseEntity.created(createdUri).body(event); }} package dlee.demorestapi.events;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;import java.time.LocalDateTime;@Data @Builder @NoArgsConstructor @AllArgsConstructorpublic class EventDto { @NotEmpty private String name; @NotEmpty private String description; @NotNull private LocalDateTime beginEnrollmentDateTime; @NotNull private LocalDateTime closeEnrollmentDateTime; @NotNull private LocalDateTime beginEventDateTime; @NotNull private LocalDateTime endEventDateTime; private String location; @Min(0) private int basePrice; @Min(0) private int maxPrice; @Min(0) private int limitOfEnrollment;}
- 미해결스프링 기반 REST API 개발
update 메소드 분리 관련 질문
update 메소드 하나가 지금 baseprice, maxprice, location 모두를 검증하는 로직을 갖고 있는데, 이것을 update 메소드 내부에서 baseprice, maxprice를 검증하는 메소드 하나 호출, location을 검증하는 메소드를 호출하는 방법은 객체지향적이다 라고 말할 수 있나요?? public void update() { checkPrice(); checkLocation();}
- 미해결스프링 기반 REST API 개발
추후 어떤 강좌를 봐야할지 추천좀 부탁드립니다.
현재 제가 본 강의는 아래와 같습니다. -스프링 기반 REST API 개발 -스프링 부트 개념과 활용 -더 자바 Java8 -더 자바, 코드를 조작하는 다양한 방법 -스프링 웹 MVC (절반정도..) 물론 모든 내용을 이해했다고 하긴 어렵고 코드를 따라가고 이해하려고 노력은 했습니다.... 제가 추후 프로젝트에서 Springboot, JPA, Web, RestAPI, Embbed Tomcat, TDD, Test코드(mvn test 구현) 이렇게 구성한 backend를 추진하고 싶습니다. JPA가 부족해서 강의를 따라가며 학습해야 할거 같은데, 지금 시점에 어떤 강의를 보는게 좋을까요?
- 미해결스프링 기반 REST API 개발
ACCOUNT POSTMAN 테스트시 질문입니다(ACCOUNTROLE관련)
회원가입을 POST로 처리하려고 하는데요. 예제외 동일하게 구현을 하였습니다. account 모델 @Enumerated(value = EnumType.STRING) @ElementCollection(fetch = FetchType.EAGER) private Set<AccountRole> roles; 위 부분의 사용법이나 어노테이션의 의미는 인지를 했습니다. 제가 궁금한건 User를 상속해서 구현한 객체 반환하지 않고, 일반 event 컨트롤러에서 insert를 한 것 처럼 테스트를 하고 싶습니다. 아래는 컨트롤러 소스구요 @PostMapping public ResponseEntity createAccount(@RequestBody @Valid AccountDto accountdto ,Errors errors) { Account account = modelMapper.map(accountdto, Account.class); Account newAccount = accountRepository.save(account); WebMvcLinkBuilder selfLinkBuilder = linkTo(AccountController.class).slash(newAccount.getId()); URI createdUri = selfLinkBuilder.toUri(); AccountResource eventResource = new AccountResource(account); eventResource.add(linkTo(AccountController.class).withRel("query-account")); eventResource.add(selfLinkBuilder.withRel("update-account")); eventResource.add(new Link("/docs/index.html#resources-account-create").withRel("profile")); return ResponseEntity.created(createdUri).body(eventResource); } localhost:8080/api/account/createAccount { "email" : "test@gmail.com" , "password" : "1234" , "roles" : "USER" } 위 주소로 post를 보내면 결과는 아래와 같이 나옵니다. { "timestamp": "2021-08-11T09:12:21.817+00:00", "status": 400, "error": "Bad Request", "trace": "org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.HashSet<com.ws.web.account.AccountRole>` from String value (token `JsonToken.VALUE_STRING`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.HashSet<com.ws.web.account.AccountRole>` from String value (token `JsonToken.VALUE_STRING`)\n at [Source: (PushbackInputStream); line: 4, column: 17] (through reference chain: com.ws.web.account.AccountDto[\"roles\"])\r\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:389)\r\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:342)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:185)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133)\r\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:228)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:190)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:163)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:832)\r\nCaused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.HashSet<com.ws.web.account.AccountRole>` from String value (token `JsonToken.VALUE_STRING`)\n at [Source: (PushbackInputStream); line: 4, column: 17] (through reference chain: com.ws.web.account.AccountDto[\"roles\"])\r\n\tat com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)\r\n\tat com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601)\r\n\tat com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1375)\r\n\tat com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1322)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:392)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromString(CollectionDeserializer.java:326)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:250)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)\r\n\tat com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n\tat com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:402)\r\n\tat com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)\r\n\tat com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)\r\n\tat com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)\r\n\tat com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3601)\r\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:378)\r\n\t... 51 more\r\n", "message": "JSON parse error: Cannot deserialize value of type `java.util.HashSet<com.ws.web.account.AccountRole>` from String value (token `JsonToken.VALUE_STRING`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.HashSet<com.ws.web.account.AccountRole>` from String value (token `JsonToken.VALUE_STRING`)\n at [Source: (PushbackInputStream); line: 4, column: 17] (through reference chain: com.ws.web.account.AccountDto[\"roles\"])", "path": "/api/account/createAccount" } 하지만 roles를 제거하고 테스트하면 { "email" : "test@gmail.com" , "password" : "1234" } { "id": 1, "email": "test@gmail.com", "password": "1234", "roles": null, "_links": { "self": { "href": "http://localhost:8080/api/account/1" }, "query-account": { "href": "http://localhost:8080/api/account" }, "update-account": { "href": "http://localhost:8080/api/account/1" }, "profile": { "href": "/docs/index.html#resources-account-create" } } } 정상적으로 출력이 됩니다 왜저러는 걸까요..? Cannot deserialize value of type `java.util.HashSet<com.ws.web.account.AccountRole>` from String value (token `JsonToken.VALUE_STRING`); 이 부분때문인 것 같은데 테스트시 어떻게 해야될 지 모르겠습니다. 도움주시면 감사드리겠습니다!
- 미해결스프링 기반 REST API 개발
@Valid 관련
@Valid 관련 어노테이션을 add Maven dependency 했는데 적용이 안되면 왜 그럴까요?
- 미해결스프링 기반 REST API 개발
rest docs 수정시 질문입니다.
안녕하세요 선장님 먼저 좋은 강의 만들어주셔서 감사드립니다. snippet을 추가/수정/삭제 등등 변경점이 있다면 rest docs 문서를 똑같이 갱신하기 위해서 매번 다시 package를 수행해주면 되는걸까요?
- 미해결스프링 기반 REST API 개발
Spring REST docs 관련 질문
Spring REST docs 관련 질문 안녕하세요 항상 강의 잘 들으면 발전하려 노력하는(?) 개발자입니다~ 강의 들으면서 Spring REST Docs 적용하는 과정에서 좀 문제가 발생하여.. 문의드리려 글 남깁니다. 환경구성 Spring boot 2.4.4 / Cucumber 6.10.2 / Junit 5 / Java 11 이슈 @SpringBootTest 가 있는 SpringIntegrationTest.class 에 @AutoConfigureMockMvc Annotation 을 붙이고, 각 cucumber Testxxx.class 에서 @Autowired Mockmvc mockmvc; 를 사용하는 테스트 소스입니다. 정상적으로 작동하던 테스트 소스가 @AutoConfigureRestDocs 를 붙이니 mockmvc 가 null exception 이 발생하여... 원인을 찾을 수가 없어 질문드립니다.. 추가적으로 cucumber 테스트 형태가 아닌 Junit5 형태의 세팅으로 작업을 진행하였을 때, 정상적으로 나오는 것을 확인하였습니다.. 하지만 cucumber도 junit 을 기반으로 만들어져서... 해당 mockmvc 가 null 이 되는 부분이,,, 문서를 참고하여도 이해가 어려워 문의글 남깁니다 ㅠ ( 추가적으로 SpringBootTest의 @DirtiesContext 는 사용하지 않고 있습니다..)
- 미해결스프링 기반 REST API 개발
응답값에서 질문있습니다
현재 강의부터 응답의 헤더의 Location값과 Redirected URL 값으로 주소가 localhost가 아닌 localhost:8080으로 변해있는데, 아무리 이전강의 뒤져봐도 연관관계가 없어서요. 혹시 어떻게 변한건가요?
- 미해결스프링 기반 REST API 개발
핸들러의 반환타입 질문입니다.
컨트롤러의 createEvent핸들러의 반환타입이 ResponseEntity인에 제너릭 타입을 지정해주지 않아서 인텔리제이에서 경고문구를 알려주네요. ResponseEntity<Object>로 경고문구를 삭제하긴 했으나 이건 타입세입티? 하지 않은 것 같고 하나마나인것 같은데 따로 제너릭 타입을 지정하지 않아도 상관없는 일인가요? 그리고 이미 ResponseEntity를 컨트롤러에 import한 상황이니, badRequest로 리턴 시에 굳이 ResponseEntity.badReauest()를 명시하지 않아도 상관이 없는지 궁금합니다. 테스트는 잘 통과되는군요.
- 미해결스프링 기반 REST API 개발
ModelMapper 에 관해서 궁금한 내용이 생겼습니다!
안녕하세요! 다름이 아니라 ModelMapper 에 대해서 궁금한 사항이 생겼습니다. DDD 에서는 Setter를 지양하라 라는 말이 생각이 나서 Entity에 Setter를 빼고 개발을 해보려 하였습니다만 ModelMapper.map() 에서 대상 엔티티에 Setter가 없으면 동작하지 않는것을 보게 되었습니다. modelMapper without setter, why modelMapper setter 등의 키워드로 찾아보았지만 결국 제가 원하는 'setter 없이 mapping' 하는 방법은 얻지 못하였습니다. 괜찮으시다면 이에 대한 의견을 좀 들을 수 있을까요!?
- 미해결스프링 기반 REST API 개발
expectedException 질문
안녕하세요! 2시간동안 계속 뭐가 문제인지 강의를 돌려보고 돌려보고 했는데 왜 깨지는지 못찾겠어서 질문 드립니다. ㅠㅠ.. findByUserFail 테스트에서 깨집니다 뭐가 잘못 된 건가요?? 혹시 몰라서 깃허브에도 코드를 올려두었습니다. https://github.com/backtony/apistudy
- 미해결스프링 기반 REST API 개발
$ 질문
안녕하세요! 12:41 초 error 테스트 코드 작성하실 때 $의 의미는 뭔가요? [] 배열에 접근하는 건 알겠는데 $의 의미를 잘 모르겠습니다.. 구글링으로 JSON $해도 원하는 답을 얻기가 어려워 질문드립니다!
- 미해결스프링 기반 REST API 개발
응답형식과 dto 질문드립니다.
Event 엔티티의 필드 offline과 free의 변수명을 저는 isOffline, isFree라고 지었는데, 실제 응답바디엔 다음사진처럼 날아가더라구요. 어떻게 된 일인가요?? 아 그리고 하나 더 궁금한 것은 EventController에서 @RequestBody로 EventDto를 받아서 Event로 변환을할 때 Event에 세터가 없을 경우 id를 제외하고는 다 널로 값이 바인딩되더라구요. 이럴 경우 엔티티에는 세터를 지양하라는 말과 반대되는듯 하여 이런 식으로 변환하는게 문제되지 않는지가 궁금합니다. 엔티티에 세터는 굉장히 위험하다고 들었어서요.
- 미해결스프링 기반 REST API 개발
단축키 질문드립니다
2:53 초경 saveRepository.save(event)를 Event타입으로 받을 수 있게 해준 단축키가 무엇인가요?
- 미해결스프링 기반 REST API 개발
안녕하세요 선생님 Controllor와 RestController 에 대해서 궁금증이 생겨 댓글 남깁니다.
안녕하세요 선생님 Controllor와 RestController 에 대해서 궁금증이 생겨 댓글 남깁니다. 질문을 장황하게 썼다가 가독성이 안 좋은것 같아서 짧게 정리해보겠습니다! - @RestController 는 @Controller 에 @ResponseBody 가 붙은 것이다. - @ResponseEntity 는 HTTP Header 와 같이 Body 가 아닌 다른 정보를 세밀하게 조작할 때 사용한다. - 그럼 HTTP Header와 같은 세부 정보를 이용할 때는 @Controller + ResponseEntity 를 이용한다. 이게 맞나요? 아니면 - @RestController의 목적은 @Controlloer와 달리 View와 같은 정보를 반환하지 않고 REST 한 리소스를 반환하기 위함이다. - ResponseEntity 를 사용하면 Body와 Header를 조작하는데, 해당 컨트롤러의 목적에 맞게 (REST API를 제공하는 ) @ResponseBody 어노테이션이 필요 없음에도 불구하고 @RestController 를 이용한다. 뭐가 맞을까요?
- 미해결스프링 기반 REST API 개발
입력제한 강의에서 이에러가 뜨는데 도저히 못찾겠내요...
java.lang.NoSuchMethodError: org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource.<init>(Lorg/springframework/core/type/AnnotationMetadata;Ljava/lang/Class;Lorg/springframework/core/io/ResourceLoader;Lorg/springframework/core/env/Environment;Lorg/springframework/beans/factory/support/BeanDefinitionRegistry;Lorg/springframework/beans/factory/support/BeanNameGenerator;)V at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport$AutoConfiguredAnnotationRepositoryConfigurationSource.<init>(AbstractRepositoryConfigurationSourceSupport.java:133) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport$1.<init>(AbstractRepositoryConfigurationSourceSupport.java:74) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.getConfigurationSource(AbstractRepositoryConfigurationSourceSupport.java:73) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.registerBeanDefinitions(AbstractRepositoryConfigurationSourceSupport.java:61) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:396) ~[spring-context-5.3.4.jar:5.3.4] at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:na] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:395) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:157) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:129) ~[spring-context-5.3.4.jar:5.3.4] at org.springframework.context.annotation.ConfigurationClassPostProcessor.proces
- 미해결스프링 기반 REST API 개발
테스트 DB를 나누는 이유
안녕하세요. 강의를 듣다 문득 궁금해진 것이 생겼습니다. db를 2 개의 db로 나누는 이유가 따로 있을까요? 운영 DB와 테스트 DB를 나눈다는 것은 운영 DB를 더 안정적으로? 사용하기 위함이구나 라고 생각이 막연하게 듭니다. 하지만 너무 막연하여 db를 나누는 것에 대한 필요성을 아직 느끼지 못하고 있습니다. 실제로 운영 DB와 테스트 DB를 나누지 않으면 어떤 상황이 발생할 수 있을까요?