묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
FrontControllerServletV4 와 model
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]FrontControllerServletV4에서 아래 코드 부분에서 model 을 직접 생성해 view에 넘겨주는데 model 은 controller.process 를 통해 controller 에 paramMap과 model 을 넘겨 model 값을 설정합니다. 그 후 다시 프론트 컨트롤러에서 model 정보도 같이 view로 render 해주는데 이때 model 의 값이 채워져있는건가요?제가 생각하기로는 controller.process 를 통해 model 의 값이 채워지지만 viewName 만 반환해 결국 프론트 컨트롤러의 map 은 초기화 상태 그대로인것 같아서요:)이러면 model 을 View 에 넘기는 것이 의미가 없지 않나요?@Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestURI = request.getRequestURI(); ControllerV4 controller = controllerMap.get(requestURI); if (controller == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } Map<String, String> paramMap = createParamMap(request); Map<String, Object> model = new HashMap<>(); String viewName = controller.process(paramMap, model); MyView view = viewResolver(viewName); view.render(model, request, response); }
-
미해결
이전 로그인 시간 팝업
안녕하세요 영한님 수업을 듣다가 관리자 페이지를 만들어보면서 듣고 있는데요제가 이것저것 찾아보면서 다른 기능들을 넣으면서 공부를 하고 있습니다.하지만 의문점이 하나가 생겼습니다. 로그인, 로그아웃까지 구현을 했으나,이전에 로그인한 시간 팝업에 띄우고 싶은데 Session으로 하면 정해진 시간까지 Session이 동작하여서 이것을 쓰면 안 될 것 같은데요 어떤 기능을 공부해서 사용해야 하나요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 프레임워크 동작 구조 정리
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 !![1] 요청 시에 @RequestBody와 HttpEntity를 안 쓰는 경우 , 응답 시에 @ResponseBody와 HttpEntity를 안 쓰는 경우[2] 요청 시에 @RequestBody와 HttpEntity를 쓰는 경우 , 응답 시에 @ResponseBody와 HttpEntity를 쓰는 경우이 두 가지 케이스로 나누어 스프링 프레임워크의 동작 구조를 정리해보았는데 제가 이해하는 게 맞는지 너무 길지만 한번만 피드백해주시면 감사하겠습니다 !![1]요청 : 파라메터 타입에 @RequestBody X 이거나 HttpEntity X의 경우응답 : 반환 값에 @ResponseBody X 이거나 HttpEntity X의 경우 1. 클라이언트의 요청 2. DispatcherServlet를 호출(urlPatterns = /* 경로이기 때문) 3. HandlerMapping의 가장 우선순위에 있는 구현체인 RequestMappingHandlerMapping을 통해 @Controller이 붙은 클래스의 객체를 매핑 정보로 활용 4. doDispatch()의 getHandler()에서 해당 매핑 정보의 컨트롤러 객체 반환 5. doDispatch()의 getHandlerAdapter()을 통해 HandlerAdapter을 호출 후 컨트롤러를 처리할 수 있는 어댑터 있는지 검증(supports()) 후 어댑터 호출(handle()) 6. 이때 컨트롤러는 @Controller의 @RequestMapping이 붙어있으므로 HandlerAdapter의 가장 우선순위의 RequestMappingHandlerAdapter 어댑터 구현체가 호출되는 것! 7. 어댑터는 컨트롤러의 파라메터에 해당되는 객체가 ArgumentResolver의 구현체로 존재하는지 검증(supportsParameter()) 후 존재하면 생성(resolveArgument()) 8. 어댑터는 생성된 객체를 컨트롤러의 파라메터에 주입하면서 컨트롤러 호출 9. 컨트롤러는 로직 수행 후 return 값(객체)을 어댑터에 반환 10. 어댑터는 ResultValueHandler 호출하면서 반환값에 해당되는 객체가 존재하는지 검증(supportsReturnType()) 후 존재하면 생성(handleReturnValue()) 11. 어댑터는 생성된 객체 및 논리적 뷰 이름으로 초기화된 ModelAndView 객체 생성 후 DispatchServlet에 반환 12. DispatchServlet에서 ViewResolver에 논리적 뷰 이름을 넘겨주면서 호출 13. ViewResolver에선 논리적 뷰 이름을 물리적 뷰 경로로 바꿔주고 그 값으로 초기화된 View 객체 반환 14. DispatchServlet에서 View객체 이용해서 render() 호출 15. JSP 뷰 템플릿이었으면 render()에서 JSP 코드로 포워드 후 랜더링하고 나머지 타임리프 같은 뷰 템플릿이면 render() 받자마자 바로 화면 랜더링 [2]요청 : 파라메터 타입에 @RequestBody O 이거나 HttpEntity O의 경우응답 : 반환 값에 @ResponseBody O 이거나 HttpEntity O의 경우 1. 클라이언트의 요청 2. DispatcherServlet를 호출(urlPatterns = /* 경로이기 때문) 3. HandlerMapping의 가장 우선순위에 있는 구현체인 RequestMappingHandlerMapping을 통해 @Controller이 붙은 클래스의 객체를 매핑 정보로 활용 4. doDispatch()의 getHandler()에서 해당 매핑 정보의 컨트롤러 객체 반환 5. doDispatch()의 getHandlerAdapter()을 통해 HandlerAdapter을 호출 후 컨트롤러를 처리할 수 있는 어댑터 있는지 검증(supports()) 후 어댑터 호출(handle()) 6. 이때 컨트롤러는 @Controller의 @RequestMapping이 붙어있으므로 HandlerAdapter의 가장 우선순위의 RequestMappingHandlerAdapter 어댑터 구현체가 호출되는 것! 7. 어댑터는 컨트롤러의 파라메터에 해당되는 타입의 객체가 ArgumentResolver의 구현체로 존재하는지 검증(supportsParameter()) 8. ArgumentResovler이 검증하던 중 컨트롤러의 파라메터 타입이 @RequestBody 혹은 HttpEntity임을 감지하고 RequestResponseBodyMethodProcessor 구현체가 동작하며 HTTP 메시지 컨버터 호출 9. RequestResponseBodyMethodProcessor 구현체는 HTTP 메시지 컨버터의 canRead()를 통하여 파라메터의 클래스 타입과 미디어 타입(Content-Type)을 검증하고 조건 만족하면 read()를 통해 HTTP 메세지 바디에 있는 데이터 변환 10. RequestResponseBodyMethodProcessor 구현체는 변환된 객체를 어댑터에 반환 11. 어댑터에선 반환된 객체를 컨트롤러의 파라메터에 주입하면서 컨트롤러 호출 12. 컨트롤러는 로직 수행 후 return 값(객체)을 어댑터에 반환 13. 어댑터는 ResultValueHandler 호출하면서 해당 반환값이 존재하는지 검증(supportsReturnType()) 14. 이때 ResultValueHandler에선 컨트롤러의 반환값이 @ResponseBody , HttpEntity임을 감지 후 RequestResponseBodyMethodProcessor 구현체가 동작하며 HTTP 메시지 컨버터를 호출 15. RequestResponseBodyMethodProcessor구현체는 HTTP 메시지 컨버터의 canWrite()를 통하여 파라메터 클래스 타입과 HTTP 요청 메시지에서의 미디어 타입(Accept)을 검증하고 조건 만족하면 write() 수행 16. write()에선 데이터를 변환하여 HTTP 응답 메세지 바디에 삽입 후 응답 메세지 클라이언트에게 반환감사합니다 !! 그리고 만약 제가 정리한 부분이 맞다면 HTTP API 방식으로 동작하는 경우 맨 마지막 16번에서 write() 이후에 만들어진 응답 메세지를 어디서 클라이언트에게 반환하는 건지 궁금합니다 !
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
HTTP 메시지 컨버터 동작 순서를 변경 하는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. http메시지 컨버터 동작 순서가ByteArrayHttpMessageConverterStringHttpMessageConverterMappingJackson2HttpMessageConverter라고 말씀해주셨는데 제가 해당 부분을 수정해서MappingJackson2HttpMessageConverter가 1번으로 동작하게 변경을 했다고 가정을하면Json데이터를 처리할 때 속도는 미세하게라도 더 빠르다고 생각을 하고 있습니다.아니면 모종의 이유로 속도가 저하 되는지 궁금해서 질문드립니다. ㅎㅎㅎ
-
미해결자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
5~6강 질문이요
post방식은 dto 객체 앞에 @RequestBody가 있는데 get방식은 왜 dto객체 앞에 @RequestParam을 안 써요? 맨 처음에 dto 객체 없었을 때 매개변수 이용하였을 때는 @RequestParam 썼던 것 같은데..
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
이미지 보여주기 @ResponseBody
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.downloadImage 메소드 작성할때 위에 @Responsebody사용한 이유가 이미지를 리턴하기 위해서 사용한게 맞나요 ?그리고 다른 방법은 어떤게 있나요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
~/jpashop.mv.db 파일을 못찾겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]이 과정에서 jdbc:h2:~/jpashop까지 입력을 완료하고 데이터베이스가 잘 생성이 되었는데 ~/jpashop.mv.db이 어디에 생성된건지 모르겠습니다. ~/jpashop.mv.db
-
해결됨스프링 프레임워크는 내 손에 [스프1탄]
스프링 시큐리티 로그인 후 모달창 질문드립니다
(선생님 아래 댓글에 나름대로 해결책 적어놓았습니다!) 선생님 안녕하세요.기존 로그인 방식을 session에서 security로 바꾸면서 로그인에 성공하면 RedirectAttribute를 이용한 모달창 띄워주기는 어떻게 해야 하는지 고민됩니다.시큐리티 내부에서 /login.do 요청을 처리해주니 왠지 시큐리티 내부 필터에 설정을 해줘야 하나? 라는 생각이 듭니다.로그인에 실패하면 시큐리티에서 error를 파라미터를 넘겨주니, 로그인 성공 시 특정 파라미터를 1회성으로 넘겨주는 것이 있을까? 라는 생각도 듭니다.아니면.. 시큐리티로 로그인에 성공하는 순간 url경로를 설정하여 특정 컨트롤러에서 받아줘서 그곳에서 redirect를 해줘야 할까요? 아래의 사진은 기존 로그인 방식에서 RedirectAttributes의 addFlash를 이용한 참고사진입니다.감사합니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
라이브러리 추가하는 법은 어디서 알 수 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. gradle 추가 하실 때 4줄이나 추가 하시더라구요.//JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'jakarta.servlet:jakarta.servlet-api' implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //JSP 추가 끝 이렇게 추가해야 한다는 건 어디서 알 수 있나요? jakarta홈페이지를 봐도 영 알 수 가 없어서...MVNRepository에서 찾아도 한 줄 만 추가하는 거 밖에는 안 보이더라구요.
-
미해결스프링 핵심 원리 - 기본편
AppConfig를 스프링 방식으로 전환 후, MemberApp, OrderApp에서 스프링 로그가 출력되지 않습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]AppConfig를 스프링 방식으로 전환 후, 수업에서 보이는 것 처럼 MemberApp, OrderApp에서 스프링 로그가 출력되지 않습니다.[OrderApp 실행화면]자바 버전은 openjdk 21, springframework 버전은 3.2.1 입니다.@Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public static RateDiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }public class MemberApp { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); Member member = new Member(1L, "memberA", Grade.VIP); memberService.join(member); Member findMember = memberService.findMember(1L); System.out.println("new Member = " + member.getName()); System.out.println("find Member = " + findMember.getName()); } }public class OrderApp { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); OrderService orderService = applicationContext.getBean("orderService", OrderService.class); Long memberId = 1L; Member member = new Member(memberId, "memberA", Grade.VIP); memberService.join(member); Order order = orderService.createOrder(memberId, "itemA", 10000); System.out.println("order = " + order); } }
-
해결됨실전! 스프링 데이터 JPA
커스텀 인터페이스 구현체 이름 작성 시 순환 참조 발생 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 영한님. 이번 강의도 잘 수강한 학생입니다.강의 내용과 공식 문서를 참고하며 간단한 게시글 리포지토리를 만들어보고자, 아래처럼 작성했었습니다. public interface BoardRepository { Long save(final Board board); ... }@Repository @RequiredArgsConstructor public class BoardJpaRepositoryImpl implements BoardRepository { private final BoardJpaRepository boardJpaRepository; ... }public interface BoardJpaRepository extends JpaRepository<Board, Long> { }강의 내용대로 스프링 데이터 JPA인 BoardJpaRepository에 Impl을 붙인 BoardJpaRepositoryImpl을 만들었는데, 아래와 같이 순환 참조 문제가 발생했습니다. The dependencies of some of the beans in the application context form a cycle: boardController defined in file [/Users/hyunjoonchoi/Desktop/2024/2024-mju-mentoring/build/classes/java/main/com/mju/mentoring/board/controller/BoardController.class] ↓ boardService defined in file [/Users/hyunjoonchoi/Desktop/2024/2024-mju-mentoring/build/classes/java/main/com/mju/mentoring/board/service/BoardService.class] ┌─────┐ | boardJpaRepositoryImpl defined in file [/..../build/classes/java/main/com/mju/mentoring/board/infrastructure/BoardJpaRepositoryImpl.class] └─────┘ Action: Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true. 그런데 이름을 BoardRepositoryImpl, JpaBoardRepositoryImpl 등 다른 이름으로 하니까 순환 참조 문제가 해결되더라구요이에 대해서 다른 외국 개발자 분들도 이슈로 올리고, 그것들을 찾아봤으나 메인테이너 분이 @Lazy를 사용하거나 ObjectProvider를 사용해야 한다고 말씀해주시는 것 밖에 없었습니다. 공식 문서 (https://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/repositories.html#repositories.create-instances)를 보면 스프링 데이터 JPA + Impl로 할 시 자동으로 스프링 데이터 JPA의 구현체로 인식한다고 되어 있는 것 같은데, 이런 순환 참조 이슈가 발생한 원인을 알 수 있을까요? 이를 해결해보고자 스프링 데이터 JPA 레포지토리에 직접 이슈로 남기고 (https://github.com/spring-projects/spring-data-jpa/issues/3320) 답변을 받았긴 했습니다만, 여전히 다른 이야기를 하시는 것 같아 영한 님께도 문의드리고 싶습니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@RequestMapping에 대하여
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]1. 스프링 부트를 구동시켜서 톰캣 서버가 띄워지면 HandlerMapping 인터페이스가 애플리케이션 내에 존재하는 핸들러 매핑을 시도하는데 우선적으로 HandlerMapping 인터페이스의 구현체인 RequestMappingHandlerMapping 클래스가 @RequestMapping 어노테이션이 지정된 핸들러를 매핑해서 사용자가 해당 어노테이션으로 지정된 핸들러 중 하나를 요청할 경우 해당 핸들러가 반환되고해당 핸들러에 대한 어댑터를 연결하고 호출하는데 필요한 구현체가 RequestMappingHandlerAdapter 로 이해했는데 맞을까요? 1번의 내용이 맞다면 @RequestMapping을 컨트롤러에 지정할 경우 해당 컨트롤러가 매핑 정보로 활용이 되는데 한 컨트롤러 내에 여러 메서드에 @RequestMapping을 지정할 경우 그 메서드들이 전부 컨트롤러가 되는 것인가요? 그렇다면 메서드들을 정의하고 있는 클래스도 컨트롤러인데 어떤 차이가 있는 건지 궁금합니다 ! 그리고 추가로 컨트롤러는 클래스로 알고있는데 어떻게 메서드 레벨에 @RequestMapping을 지정할 수 있는지도 궁금합니다..
-
미해결스프링부트 시큐리티 & JWT 강의
JWT - 24강 authenticationManager() 문제 해결책
버전 문제로 authenticationManager() 안되면 SecurityConfig @Configuration @RequiredArgsConstructor @EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록된다. public class SecurityConfig { private final CorsConfig corsConfig; // private final CorsFilter corsFilter; // Bean 으로 등록되어 있어서 바로 가져다 써도됨 근데 나는 걍 위에 클래스에서 메소드 호출할거임~ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); // http.addFilterBefore(new MyFilter3(), SecurityContextHolderFilter.class); http.csrf(CsrfConfigurer::disable); // http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.sessionManagement((sessionManagement) -> sessionManagement .sessionCreationPolicy(SessionCreationPolicy.STATELESS)); http.addFilter(corsConfig.corsFilter()); // @CrossOrigin(인증X), 시큐리티 필터에 등록인증(O) // http.formLogin().disable(); http.formLogin((form)-> form.disable()); // http.httpBasic().disable(); http.httpBasic((basic)-> basic.disable()); http.addFilter(new JwtAuthenticationFilter(authenticationManager)); // AuthenticationManger http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/**").authenticated() .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER") .requestMatchers("/admin/**") .hasAnyRole("ADMIN").anyRequest().permitAll()); return http.build(); } } JwtAuthenticationFilter // 스프링 시큐리티에서 UsernamePasswordAuthenticationFilter 가 있음 // /login 요청해서 username, password 전송하면 (post) // UserPasswordAuthenticationFilter가 동작을 함 @RequiredArgsConstructor public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; // /login 요청을 하면 로그인 시도를 위해서 실행되는 함수 @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("로그인 시도: JwtAuthenticationFilter"); return super.attemptAuthentication(request, response); } }
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용2에서 오류가 발생합니다.
MyBatis 버전도 낮춰보고 코드도 비교해보고 했는데 자꾸 Invalid bound statement오류가 발생합니다. 혹시 어떤 게 문제일까요.. 제가 잘 못 찾는 건가요..? 코드 : https://drive.google.com/file/d/14j1mBlyOWm9aELoBGtqbPQ6AAwla6DX5/view?usp=drive_link
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@Enumerated와 hibernate 타입 검증 관련 해결을 어떻게 해야할지 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 안녕하세요 강의에서 설명해주신 대로 따라하려고 했습니다.단 , ddl-auto : create 대신 미리 SQL 문으로 테이블을 생성해놓고 ddl-auto: validate로 실행시 에러가 납니다. 이는 실제로 배운 것을 사용할 수 없는 아주 치명적인 부분이라고 생각하여 질문을 드립니다. [문제 설명]강의에서 설명해주신대로 위와 같이 Enumerated 를 사용하여 status 를 정의 하였습니다.말씀해주신대로 value = EnumType.STRING을 사용했습니다.UserStatus 는 당연히 enum 타입으로 했구요.@Column(name = "status", length = 32) @Enumerated(value = EnumType.STRING) private UserStatus status;이때 status 가 있는 테이블은 아래와 같은 SQL문으로 생성하였습니다.VARCHAR(255)로 생성한 점을 자세히 봐주세요!dbms: MySQLCREATE TABLE user ( `id` BIGINT NOT NULL AUTO_INCREMENT, `status` VARCHAR(255) NOT NULL check (status in ('CREATED', 'WITHDRAW')), PRIMARY KEY (id) ); 또한 application-yml 에는 아래와 같이 ddl-auto 를 validate 로 하였습니다.jpa: hibernate: ddl-auto: validate properties: hibernate: format_sql: true show-sql: true 하지만 이를 실행하면 아래와 같은 status의 타입 오류 에러가 나옵니다.Schema-validation: wrong column type encountered in column [status] in table [user]; found [varchar (Types#VARCHAR)], but expecting [enum ('created','withdraw') (Types#ENUM)]이는 db의 status 의 타입이 enum 이길 기대했지만 실제로는 VARCHAR이기 때문에 에러가 발생한다는 것입니다. (ddl-auto의 validate에 의해 검증 수행)MySQL에서 타입에 enum을 적용하면 해결되지만 쓰는 것을 최대한 지양해야 한다고 알고 있습니다.따라서 mysql 의 status 컬럼의 타입을 enum 대신 column 타입을 varchar(255)로 두고 사용하려고하는데 위와 같은 에러가 나서 실행이 되지 않습니다.ddl-auto : none 으로 설정하면 임시적으로 실행은 할 수 있지만 validate 로 검증을 항상 진행하려고 합니다. [질문 내용]1. mysql의 타입을 varchar로 두고, ddl-auto: validate 를 사용하면서 에러 없이 실행할 수 있는 방법이 궁금합니다.2. ddl-auto : create로 하게 되면 자동 생성되는 sql문에서는 status에 enum 대신 create table user (id bigint not null,status varchar(255) check (status in ('CREATED', 'WITHDRAW')),primary key (id))위처럼 varchar로 column 속성을 주면서 validate 할때만 에러가 나는것이 이상한 것 같은데 왜 그럴까요?3. 이를 현업에서는 어떻게 해결하고 계신지 궁금합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ModelView 객체 여러개 생성
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]MemberSaveControllerV3와 MemberListControllerV3에서 process 메서드가 실행될 때마다 새로운 ModelView객체를 생성하는데, 해당 컨트롤러로 들어오는 url은 같으므로 이를 싱글톤으로 만들면 메모리 관점에서 더 좋은것 아닌가요? 이를 따로 고려하시지 않은건지 아니면 다른 이유가 있는지 궁금합니다!
-
미해결스프링부트 시큐리티 & JWT 강의
코틀린 시큐리티 컨피그 설정방법 참고하세요
코틀린에서 이번강의 설정할땐 import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer import org.springframework.security.web.SecurityFilterChain @Configuration @EnableWebSecurity class SecurityConfig { @Bean fun filterChain(http:HttpSecurity):SecurityFilterChain{ http.csrf(CsrfConfigurer<HttpSecurity>::disable) http.authorizeHttpRequests{ it.requestMatchers("/user/**").authenticated() it.requestMatchers("/manager/**").hasAnyRole("MANAGER","ADMIN") it.requestMatchers("/admin/**").hasRole("ADMIN") it.anyRequest().permitAll() } http.formLogin{ it.loginPage("/login") it.permitAll() } return http.build() } } 이런식으로 하시면됩니다WebSecurityConfigurerAdapter는 사라졌고 대신 빈을 생성해서 등록하는식으로 바뀐거같고기본적으로 직렬로 메서드체이닝하던게 다 람다식으로 빠졌고(자기자신을 설정하는건 다 내부람다식으로 동작하게 바뀐듯)authorizeRequests->authorizeHttpRequestsantMatcher->requestMatchersand().formLogin()->http.formLogin{...}이렇게 이름이 변경된친구들도 있습니다
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
405오류
8080/hello로 가면 왜 405오류가 나는건가요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
MyBatis 적용시 오류
질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]저와 같은 내용의 질문이 있어서 참고해 봤는데도 해결이 안되어 질문드립니다.<MyBatis 적용2 - 설정과 실행 부분 테스트 오류>MyBatis 적용 후 테스트코드 돌려보았는데, Bean설정과 관련된 오류가 나타납니다. 패키지 Path도 확인해보고, 교재와 비교도 해보았는데 어떤 문제인지 잘 모르겠습니다ㅠㅠ테스트 돌렸을때 아래와 같은 오류가 납니다.Parameter 0 of constructor in hello.itemservice.config.MyBatisConfig required a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' that could not be found.Action:Consider defining a bean of type 'hello.itemservice.repository.mybatis.ItemMapper' in your configuration. 구글드라이브 링크 첨부드립니다!https://drive.google.com/file/d/1U8YIKxbUDMvnv2ZaWjzB5gUTgqcwTZ-t/view?usp=sharing
-
해결됨Practical Testing: 실용적인 테스트 가이드
ServiceRequestDto 대신 풀어서 넘기는건 어떻게 생각하시나요?
Controller단의 Dto를 Service 전용 Dto로 변환해서 넘기는 방법을 알려주셨는데Controller단에서 받은 Dto의 컬럼들을 모두 풀어서 Service단 으로 넘겨주는 방법은 어떻게 생각하시는지 궁금합니다.이렇게 하면 순수한 자바코드로 Service단 코드를 작성할 수 있을 거라고 생각하는데 강사님의 생각 알려주시면 감사하겠습니다.