월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
url 링크가 변경되지 않는 이유가 궁금합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]WAS에서 /error-page/500 경로로 요청을 다시 하면 url 링크도 변경될 거라고 생각했는데 변경되지 않는 이유가 궁금합니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
messages properties 에러
철자가 이상하게 나옵니다 ㅠㅠ..
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
자바환경변수
JDK 17.0.10 isn't compatible with Gradle 6.8.2. Please fix JAVA_HOME environment variable17버젼사용중이에요. 소스코드를 받아서 들어가려고했는데 이런 에러가 발생하는데 매번 환경변수를 바꿔줘야하나요? 다른 방법이 있을까요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
파일 업로드와 다운로드에서 궁금한 것이 있습니다.
안녕하세요. 파일 업로드와 다운로드 강의 중 문득 궁금한 것이 생겨서 이렇게 질문을 드립니다.강의에서 처럼 메모리에 Item을 저장하는 것이 아니라 실제 RDBMS에 저장을 한다고 가정을 하게되면Item 테이블엔 id와 itemName만 저장하고 파일 경로를 저장할 File 테이블엔 Item의 id와 UploadFile의 uploadFileName과 storeFileName을 저장하는 것일까요? 이렇게 저장한다고 가정하였을 때, DB에서 Item객체를 불러올 땐 Item 테이블에서 id와 itemName을 가져와 set 해주고, File 테이블에서 uploadFileName과 storeFileName을 가져와 UploadFile 객체와 List<UploadFile>을 만들어 Item 객체를 만든다. 로 이해해도 되는 부분일까요?? 뭔가 경우에 따라서 다양한 방법이 있겠지만 지금 제 머리속으론 이런 방식이 떠올라서 이게 맞는건지 궁금해서 여쭈어봅니다. 좋은 강의 항상 감사하게 듣습니다 ㅎ 감사합니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
RequestDispatcher 상수 질문
사소한 질문이지만, RequestDispatcher에 정의된 상수들을 그대로 import 해서 사용하지 않고, 굳이 ErrorPageController에 다시 정의해서 사용하는 이유가 궁금합니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
포스트맨 json 형태로 안내려오네요
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]MVC1 부터 MVC2 학습하며 한 프로젝트에 적용하며 학습중인데요.accept json으로 설정하고 컨트롤러에 @RestController 설정해주었는데도 이렇게 HTML 형식으로 나오는데 뭐가 잘못된 걸까요 ㅠ인터셉터를 설정해준 webConfig를 주석처리 하니 json 형태로 내려오는데 주석처리를 해주는 게 맞나요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
필터가 제가 이해한게 맞을까요?
@Slf4j public class LoginCheckFilter implements Filter { private static final String[] whiteList = {"/","/members/add","/login","/logout","/css/*"};//위 uri 들은 필터x @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); HttpServletResponse httpResponse = (HttpServletResponse) response; try { log.info("인증 체크 필터 시작{}",requestURI); if(isLoginCheckPath(requestURI)){//화이트 리스트가 아니면 log.info("인증 체크 로직 실행 {}",requestURI); HttpSession session = httpRequest.getSession(false);//로그인시 생성된 세션을 불러와서 변수에 저장 if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null){//null 이면 로그인 안된것 log.info("미인증 사용자 요청 {}", requestURI); //로그인으로 redirect + 내가 url에 입력한 주소 httpResponse.sendRedirect("/login?redirectURL=" + requestURI); return;//리다이렉트하고 끝(finally 항상 호출) } } log.info("다음 필터"); filterChain.doFilter(request,response); log.info("다음 필터가 있는지"); }catch (Exception e){ throw e;//예외 로깅 가능 하지만, 톰캣까지 예외를 보내주어야 함 }finally { log.info("인증 체크 필터 종료 {}", requestURI); } } /** * 화이트 리스트의 경우 인증 체크x */ private boolean isLoginCheckPath(String requestURI){ return !PatternMatchUtils.simpleMatch(whiteList,requestURI); } }이 코드에서controller를 호출하기전에 필터에서 인증을 처리해주고인증이 완료됐다면controller로 이동해서 로직을 처리한다 생각하면 될까요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@Login 질문
컨트롤러 메서드의 파라미터에 있는 @Login 어노테이션이 @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)를 완전히 대체한다고 보면 되는 걸까요? @Login이 동작하는 시점이 ArgumentResolver의 영향 범위이기 때문에, 해당 강의의 제목이 ArgumentResolver 활용 인 것인가요? 커스텀 어노테이션을 만드는 것과 'ArgumentResolver 활용'이라는 제목과 무슨 관계가 있는 것인지 궁금하여 질문드려봅니다!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
예외를 던지는 기준이 궁금해요
예외를 공부할땐 예상 밖의 프로세스가 죽는 치명적인 상황을 예방하기 위해 예외 처리한다고 배웠습니다! 하나의 예시를 들자면 비동기로 닉네임 중복 검사를 하는 프로세스가 있는 경우아래와 같이 개발자가 의도한 결과가 나오지 않은 경우 예외로 던져야 할까요?//예시 1 Member member= repository.findByMeberNickname("user00"); if(member == null){ throw new memberNotFoundException(); } return member; //그리고 @RestController에서 에러DTO json 응답 {코드값, 메세지, status} 또는 사실상 개발자가 충분히 예상 가능한 범주 내의상황이니까(+ 프로세스가 죽을 정도의 치명적인 상황도 아님)//예시 2 Member member= repository.findByMeberNickname("user00"); return member; axios.get(...) .then(result=>{ if(result){ //값이 있으면 }else{ //값이 없으면.. }) ....비동기 호출 후 if else로 분기를 줘야할지 고민입니다! 현재 드는 생각은 sql 쿼리까지 정상적으로 호출되었지만결과값이 없었을 뿐이지 에러나 예외는 아니다.입니다. 따라서 후자가 아닐까!!
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
REST API에 대한 내용은 JPA 강의에 포함되어있나요?
REST API방식으로 서버를 만들고 싶어서 MVC패턴에 대한 내용보다는, API에 관하여 집중적으로 공부하길 희망합니다. 궁금한 점은,1.JPA로드맵에서는 API위주로 알려주시는게 맞을까요?2.(1번이 맞다면)현재 MVC2편 학습중인데, DB1,2 -> 스프링부트 핵심원리 -> JPA로드맵 이렇게 공부하면 될까요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
field 태그 질문
*{itemName} 을 하면 item object 안에 속한 값이라고 인식하고 편하게 쓸 수 있다고 하셨는데, value 와 id,name 설정과는 별개인거죠? value 는 user.itemName 로 가져오는 것이고, id랑 name 은 그저 itemName 이라는 명칭만 보고 설정해주는게 맞는건가해서요. 만약 user.itemName 이 value 이고 id,name은 따로 itemNames 라고 설정해주려면 *{itemName} 태그는 못쓰는건가요? 만약 value 값 상관없이 id,name 설정만 해주려고한다면 th:field="itemNames" 라고만 해주면 되나요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HttpSession 질문있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]HttpSession 1. getSession / setAttribute다른 질문들의 답변을 보니 세션 저장소가 Map<JSESSIONID, Map<String, Object>>형태로 저장되어 있다고 하셨는데getSession이 request에 담겨 있는 cookie(JSESSIONID)값으로 세션 저장소에서 Map<String, Object>을 반환하고 이 것을 세션이라고 하는건가요?그리고 getSession(true)일 때 세션이 없으면 세션을 생성하는데, 세션을 생성할 때 JSESSIONID를 만들어서 response에 cookie로 보내고, 세션 저장소에 만들어진 JSESSIONID를 key, 빈 Map을 value로 저장하고, 비어 있는 Map<String, Object>을 반환하나요?그리고 setAttribute로 Map<String, Object>에 값을 저장하는건가요? 2. getAttributegetAttribute할 때는 request에 있는 JSESSIONID로 세션 저장소에서 Map<String, Object>을 찾고, LOGIN_MEMBER값으로 실제 Object(Member)를 찾는 걸까요? 3.마지막으로 세션 저장소가 Map<JSESSIONID, Map<String, Object>> 형식인데 JSESSIONID가 각 member별로 생성되니까, value가 Map<String, Object> 형식이지만 이 맵에는 실제로는 한 쌍의 key, value만 저장되는건가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
이해가 잘 되지 않습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@GetMapping public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model){ if(memberId == null){ // 로그인 안한 사람 return "home"; } Member loginMember = memberRepository.findById(memberId); if(loginMember == null){ // 쿠키가 있어도 db에 없는 경우 return "home"; } model.addAttribute("member", loginMember); return "loginHome"; } 홈 컨트롤러에서 로그인을 아예 한 적이 없으면 쿠키가 없어서 return "home"인 게 이해가 되는데 두 번째에 쿠키가 있어도 회원이 db에 없는 경우가 무슨 상황인지 잘 이해가 되지 않습니다.쿠키가 있으려면 회원 로그인을 해야 하는데 회원이 db에 없을 수 있는지 궁금합니다
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실행이 되지 않습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]java 와 gradle jvm 버전을 17.0.10으로 설정하고 돌렸습니다. 이런 오류가 발생해서 Upgrade Gradle wrapper to 7.2 version and re-import the project를 클릭해서 grdle 버전을 업그레이드 했습니다. 다시 돌리니 이번에는Cause: class lombok.javac.apt.LombokProcessor (in unnamed module @0x689bd195) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x689bd195lombok과 관련된 오류가 발생해서 구글에 검색해보고 롬복 버전을 바꿨습니다. 다시 돌려봤는데또 에러가 발생했습니다.. java 버전과 gradle jvm 버전을 맞췄는데 왜 오류가 발생하는지 모르겠어서 질문드립니다..
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
헤더 - 컨텐츠 - 푸터 영역을 나누고 싶은데 방법이 있을까요..?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 ! 영한 선생님 강의를 들으면서 토이 프로젝트를 진행 중에 있습니다. 다름이 아니라 th:replace를 활용해 템플릿 영역을 헤더, 컨텐츠, 푸터 세 개의 영역이 나뉘어 지지 않고 컨텐츠 코드들이 헤더, 푸터 영역을 침범하더라구요.. header.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <div th:fragment="header"> <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top"> <div class="container-fluid"> <a class="navbar-brand" href="#">갱이</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav me-auto mb-2 mb-lg-0"> <li class="nav-item"> <a class="nav-link active" aria-current="page" href="#">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="#">SNS</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> ONLINE SHOP </a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="#">NEW ARRIVAL</a></li> <li><a><hr class="dropdown-divider"></a></li> <li><a class="dropdown-item" href="#">OUTER</a></li> <li><a class="dropdown-item" href="#">TOP</a></li> <li><a class="dropdown-item" href="#">BOTTOM</a></li> <li><a class="dropdown-item" href="#">A/C</a></li> </ul> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> COMMUNITY </a> <ul class="dropdown-menu"> <li><a class="dropdown-item" th:href="@{/board/notice}">NOTICE</a></li> <li><a class="dropdown-item" th:href="@{/board/review}">REVIEW</a></li> <li><a class="dropdown-item" th:href="@{/board/qna}">Q&A</a></li> </ul> </li> <li class="nav-item"> <a class="nav-link disabled" aria-disabled="true">Disabled</a> </li> </ul> <form class="d-flex" role="search"> <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search"> <button class="btn btn-outline-success" type="submit">Search</button> </form> </div> </div> </nav> </div> </html> footer.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns="http://www.w3.org/1999/html"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <div class="footer bg-dark fixed-bottom text-white" th:fragment="footer"> <footer> <div class="container"> <ul class="nav justify-content-center pb-3 mb-3"> <li class="nav-item"><a href="#" class="navi-link px-2">Home</a></li> <li class="nav-item"><a href="#" class="navi-link px-2">MyPage</a></li> <li class="nav-item"><a href="#" class="navi-link px-2">FAQ</a></li> <li class="nav-item"><a href="#" class="navi-link px-2">About</a></li> </ul> </div> <!-- SNS 링크 --> <ul class="nav justify-content-center"> <li><a href="https://facebook.com/example"><i class="fab fa-facebook px-2 text-white"></i></a></li> <li><a href="https://twitter.com/example"><i class="fab fa-twitter px-2 text-white"></i></a></li> <li><a href="https://instagram.com/example"><i class="fab fa-instagram px-2 text-white"></i></a></li> <li><a href="https://pinterest.com/example"><i class="fab fa-pinterest px-2 text-white"></i></a></li> </ul> </footer> </div> <!-- Font Awesome 아이콘 JS --> <script src="https://kit.fontawesome.com/a076d05399.js"></script> </html> layout1.html <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- Font Awesome 아이콘 CSS --> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet"> <!-- Required meta tags --> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <!-- Custom styles for this template --> <link th:href="@{/css/layout.css}" rel="stylesheet"> </head> <body> <!-- th:fragment=header.html 로 치환--> <div th:replace="~{fragments/header :: header}"></div> <div layout:fragment="content" class="content"></div> <!-- th:fragment=footer.html 로 치환--> <div th:replace="~{fragments/footer :: footer}"></div> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy" crossorigin="anonymous"></script> </body> </html> 혹시 해결 방안이 있을지 조심스레 여쭤드립니다..항상 좋은 강의 자료 주셔서 감사합니다 !
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@ScriptAssert에서 javascript
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]현재 jdk17 이상부터는 @ScriptAssert에서 자바스크립트를 지원하지 않아서 오류가 뜨는데 17버전 이상부터는 @ScriptAssert를 어떻게 사용하나요??
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
bindingResult 질문 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]bindingResult에서 field명은 Model의 멤버변수 이름과 동일하게 사용해야하나요?objectName은 item말고 다른거로 바꿔도 정상적으로 동작하는데 field를 임의로 바꾸면 에러가 발생하네요
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
logout시 redirect 관련
안녕하세요 강의 잘 듣고 있습니다:)로그아웃을 한 다음에 home으로 redirect를 해주었는데실제 로그아웃을 해보니localhost/login?logout 이 뜨면서 login 페이지로 넘어가더라구요..해결방법을 못찾아서 질문남깁니다
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
유틸리티 배열 활용
#array.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Arrays</h1> <ul> <li>username = <span th:text="${userA.username}"></span></li> <li>age = <span th:text="${userA.age}"></span></li> </ul> <h1>LocalDateTime - Utils</h1> <ul> <li>${#arrays.toStringArray(userA)} = <span th:text="${#arrays.toStringArray(userA)}"></span></li> <li>${#arrays.toIntegerArray(userA)} = <span th:text="${#arrays.toIntegerArray(userA)}"></span></li> <li>${#arrays.toLongArray(userA)} = <span th:text="${#arrays.toLongArray(userA)}"></span></li> <li>${#arrays.toDoubleArray(userA)} = <span th:text="${#arrays.toDoubleArray(userA)}"></span></li> <li>${#arrays.toFloatArray(userA)} = <span th:text="${#arrays.toFloatArray(userA)}"></span></li> <li>${#arrays.toBooleanArray(userA)} = <span th:text="${#arrays.toBooleanArray(userA)}"></span></li> </ul> </body> </html>@GetMapping("/array") public String array(Model model) { User userA = new User("userA", 10); User userB = new User("userB", 20); model.addAttribute("userA", userA); model.addAttribute("userB", userB); return "basic/array"; } @Data static class User { private String username; private int age; public User(String username, int age) { this.username = username; this.age = age; } }이렇게 했을 때 Caused by: java.lang.IllegalArgumentException: Cannot convert object of class "hello.thymeleaf.basic.BasicController$User" to an array of Class 이런 에러가 뜨는데 왜 에러가 발생하며, 어떻게 활용하면 될까요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
빈 등록
Component 에 이름없이 써보고 싶은데package hello.thymeleaf.basic; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import lombok.Data; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller @RequestMapping("/basic") public class BasicController { @GetMapping("text-basic") public String textBasic(Model model) { model.addAttribute("data", "Hello Spring!"); return "basic/text-basic"; } @GetMapping("text-unescaped") public String textUnescape(Model model) { model.addAttribute("data", "Hello <b>Spring!</b>"); return "basic/text-unescaped"; } @GetMapping("/variable") public String variable(Model model) { User userA = new User("userA", 10); User userB = new User("userB", 20); List<User> list = new ArrayList<>(); list.add(userA); list.add(userB); Map<String, User> map = new HashMap<>(); map.put("userA", userA); map.put("userB", userB); model.addAttribute("user", userA); model.addAttribute("users", list); model.addAttribute("userMap", map); return "basic/variable"; } @GetMapping("/basic-objects") public String basicObjects(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) { session.setAttribute("sessionData", "Hello Session"); model.addAttribute("request", request); model.addAttribute("response", response); model.addAttribute("servletContext", request.getServletContext()); return "basic/basic-objects"; } /* Component helloBean을 지정한 이유 : 지정하지 않으면 HelloBean 의 빈 이름은 BasicController.HelloBean 으로 설정되기 때문 helloBean을 지정하기 싫으면 내부 클래스 말고 외부에 클래스를 만들어서 사용하면 된다. */ @Data static class User { private String username; private int age; public User(String username, int age) { this.username = username; this.age = age; } } } @Component public class HelloBean { public String hello(String data) { return "Hello " + data; } } 어떻게 수정하면 될까요?