묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ISP와 DefaultConversionService의 연관성
DefaultConversionService 가 왜 ISP 원칙에 연관되어있는지 잘 이해가 가지 않아 질문드립니다. 결론적으로 ISP의 경우 인터페이스 분리 원칙, 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 말아야한다인데DefaultConversionService의 경우 사용과 등록을 모두 사용하고 있습니다, 따라서 두 가지 기능을 모두 사용하게 되는데 결국 두개 다 사용하게 되면 애초에 인터페이스를 분할할 필요가 없게 되는것이 아닌지 궁금합니다. 두 개를 분리함으로써 얻게되는 이득에 대해서 다시 한번만 설명이 가능하실지 궁금합니다 ㅠㅠ 감사합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
view.render 오류가 발생합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]package hello.servlet.web.frontcontroller; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import javax.sql.rowset.serial.SerialException; import java.io.IOException; //각 컨트롤러에서 했던 것을 MyView로 만들어서 넘긴다. public class MyView { private String viewPath; public MyView(String viewPath){ this.viewPath=viewPath; } public void render(HttpServletRequest request, HttpServletResponse response) throws SerialException, IOException, ServletException { RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request,response); } } Myview 코드를 작성할 때도, 강의와 다르게 forward 부분에서 오류가 발생해서 throws ServletException을 추가헀습니다.그 이후에, package hello.servlet.web.frontcontroller.v2; import hello.servlet.web.frontcontroller.MyView; import hello.servlet.web.frontcontroller.v2.controller.MemberFormControllerV2; import hello.servlet.web.frontcontroller.v2.controller.MemberListControllerV2; import hello.servlet.web.frontcontroller.v2.controller.MemberSaveControllerV2; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; // @WebServlet(name="frontControllerServletV2", urlPatterns = "/front-controller/v2/*") ///front-controller/v1/* 라고 경로를 설정하면 v1 하위에 있는 어떤 웹은 전부 " FrontControllerServletV1 " 서블릿 호출이 된다. public class FrontControllerServletV2 extends HttpServlet { private Map<String, ControllerV2> controllerMap = new HashMap<>(); public FrontControllerServletV2() { controllerMap.put("/front-controller/v2/members/new-form", new MemberFormControllerV2()); controllerMap.put("/front-controller/v2/members/save", new MemberSaveControllerV2()); controllerMap.put("/front-controller/v2/members", new MemberListControllerV2()); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ String requestURI = request.getRequestURI();//URI를 바로 받을 수 있음. ControllerV2 controller = controllerMap.get(requestURI);// front-controller/v1/members if(controller==null){ response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } MyView view = controller.process(request, response); view.render(request,response); } } 위와 같이 코드를 작성하고view.render을 사용할 때, 오류가 발생하고 인텔리 제이에서 제공하는 오류 해결 방법을 사용했는데도 웹 페이지에 가면 정상적으로 동작하지 않습니다.설명 부탁드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
자바 17은 어떻게 프로젝트를 진행해야 하나요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이런 문구가 떠서 그런데요 그래서java17로 모든 파일의 내용을 복사해서 새로운 프로젝트를 만든 다음에 java17로 진행해야 할지,아니면 자바11 해야 되는지 고민입니다. 근데 자바 17에서 자바 11로 저번에 하려다가 실패해고, 이 파일에만 자바 17로 실행하는 방법이 없어서 어떻게 해야 할지 모르겠네요 ㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
fragment 조각 css적용문제..
[질문 내용]index.html위치templates/index.htmlfragment 조각 위치 template/template/fragment/header.htmlcss위치 resources/static/css/header.css , index.csstemplate/template/fragment의 파일을 th:insert로 삽입하는것 까진 성공했는데요. 삽입할 fragment조각의 header부분에 css가 적용되지 않습니다.index.html의 경우 css가 적용이 됐는데, insert할 대상인 header.html만 css가 적용되지 않는 이유가 궁금합니다.답변 부탁드립니다.. 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
어그리거트 질문
안녕하세요. 개인프로젝트를 하면서 질문이 생겨 올립니다. 데이터베이스에게시글테이블과 첨부파일테이블이 있다면두 개는 각각 다른 어그리거트로 놓는게 좋을까요? (게시글 수정과 첨부파일 추가는) 게시글을 쓴 사람뿐만 아니라 권한이 있는 누구나 할 수 있게 구현할 예정입니다. 예를 들어, jira와 비슷하게 구현하려고 합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
name 질문
[질문 내용]여기에 질문 내용을 남겨주세요.3:00에서 MemberForm을 만들었는데 거기서 name이랑 createMemberForm.html에서 input에 name이 왜 연동이 되는지 궁금합니다ㅠㅠㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터 내에서 다른 계층 빈을 주입받아 사용해도 될까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링 부트를 사용해서 게시판을 만들고 있습니다. 회원의 인증과 인가에 대한 부분을 인터셉터로 처리하려고 합니다. 이때 단순 로그인 부분은 servletRequest.session을 사용해서 확인할 수 있는데, 로그인 사용자의 자세한 정보를 인터셉터에서 열람하여 사용하는 것이 좋은 방식인지 궁금합니다.예를 들어, 자신의 게시물을 삭제하는 api 요청이 왔을 때, 인터셉터에서 session을 통해 요청 사용자의 로그인 여부를 판별하고 (1), service 계층을 주입받아 해당 사용자가 삭제 요청한 게시물을 해당 사용자가 작성하였는지 확인하는 작업(2)이 있을 경우 모두 인터셉터에서 처리하면 인터셉터가 비즈니스 로직의 책임을 부여받는 구조이므로 지양하는 것이 좋은지 궁금합니다. 그와 별개로, 로그를 DB에 저장하기 위해 관련 repository를 주입받는 등 공통 관심사에 집중된 사용의 경우 다른 계층을 주입받는 것은 괜찮은지 궁금합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 관련질
안녕하세요 현재 Java 기본문법을 완료하고 Spring 강의를 들어보려고 합니다.관계형 데이터베이스 기초도 사전 지식에 필요하다는데 해당 지식은 아직 접한게 없어 어떤 강의를 봐야하는지 감이 잡히지 않는데 ..어떤 강의를 봐야할까요..?SQL강의를 보면 될까요?혹시 관계형 데이터베이스 기초 강의를 안봐도 자바 기본문법알면 Spring 강의를 따라갈수 있을까요
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
디렉토리와 패키지의 차이점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 스프링 강의를 보다가 궁금한 게 생겨서 글 남겨요.강의 중간 중간에 하위 폴더를 만들 때 패키지와 디렉토리를 사용해서 만드는데 이때, resource 폴더 안에서는 디렉토리만 뜨고 java 폴더 안에서는 패키지만 뜨던데 혹시 패키지와 디렉토리의 차이점을 알 수 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Unable to load class 'org.slf4j.LoggerFactory'.
이렇게 뜹니다.. 구글로 찾아봤는데도 어떻게 해야 할지 모르겠네요..스프링 입문 강의에도 동일 질문이 하나 있는데 답변대로 해봐도 전혀 해결이 되지 않았습니다.어떻게 해야 저 오류를 해결할 수 있을까요..?
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
나프2탄 스프1탄
나프2탄 후반에 스프링에관한 내용이던데 스프1탄을 들을예정이라면 그부분 건너띄고 바로 스프 1들으면 될까요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
mvc2 form 프로젝트에 있는 add.html 문법문제
제가 지금 스프링부트 3.0 이상 사용하고 있는데 타임리프 문법오류가 나는데 혹시 버전 문제인건가요?<!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head><meta charset="utf-8"><link th:href="@{/css/bootstrap.min.css}"href="../css/bootstrap.min.css" rel="stylesheet"><style>.container {max-width: 560px;}</style></head><body> <div class="container"> <div class="py-5 text-center"><h2>상품 등록 폼</h2></div> <form action="item.html" th:action th:object="${item}" method="post"><div><label for="itemName">상품명</label><input type="text" id="itemName" th:field="*{itemName}" class="form-control" placeholder="이름을 입력하세요"></div><div><label for="price">가격</label><input type="text" id="price" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요"></div><div><label for="quantity">수량</label><input type="text" id="quantity" th:field="*{quantity}" class="form-control" placeholder="수량을 입력하세요"></div> <hr class="my-4"> <!-- single checkbox --><div>판매 여부</div><div><div class="form-check"><input type="checkbox" id="open" th:field="*{open}" class="form-check-input"><label for="open" class="form-check-label">판매 오픈</label></div></div> <!-- multi checkbox --><div><div>등록 지역</div><div th:each="region : ${regions}" class="form-check form-check-inline"><input type="checkbox" th:field="*{regions}" th:value="${region.key}" class="form-check-input"><label th:for="${#ids.prev('regions')}"th:text="${region.value}" class="form-check-label">서울</label></div></div> <!-- radio button --><div><div>상품 종류</div><div th:each="type : ${itemTypes}" class="form-check form-check-inline"><input type="radio" th:field="*{itemType}" th:value="${type.name()}" class="form-check-input"><label th:for="${#ids.prev('itemType')}" th:text="${type.description}" class="form-check-label">BOOK</label></div></div> <!-- SELECT --><div><div>배송 방식</div><select th:field="*{deliveryCode}" class="form-select"><option value="">==배송 방식 선택==</option><option th:each="deliveryCode : ${deliveryCodes}" th:value="${deliveryCode.code}"th:text="${deliveryCode.displayName}">FAST</option></select></div> <hr class="my-4"> <div class="row"><div class="col"><button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록</button></div><div class="col"><button class="w-100 btn btn-secondary btn-lg"onclick="location.href='items.html'"th:onclick="|location.href='@{/form/items}'|"type="button">취소</button></div></div> </form> </div> <!-- /container --></body></html>
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
static과 테스트케이스
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 [질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]MemoryMemberRepositor클래스의 store 변수에 static이 없다면 @AfterEach가 없더라도 이전 데이터로 인한 오류(강의 11:50)가 발생하지 않았습니다. static은 클래스의 변수로 모든 인스턴스들이 공유하게 되어 static store는 @AfterEach가 없다면 오류가 발생하게 된다는 점을 이해했습니다.하지만 static이 없더라도 MemoryMemberRepositoryTest에서 MemoryMemberRepository 인스턴스를 생성했기 떄문에 인스턴스 고유의 store 변수를 가지게 되므로 각 테스트에서 서로 공유되어야 하지 않나요?디버깅을 통해 확인해본 결과 findAll()이후 findByName() 시에 store는 비어있는데 이유가 무엇인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그인인증필터 return "redirect:" + redirectURL; 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 17:48초에 나오는 내용에 질문드립니다.return "redirect:" + redirectURL;위 경로대신 밑에 있는 경로를 썼는데 이상 없던데 이렇게 해도 무방한가요?return "redirect:/items";
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
forward 메소드 설명 부분 이해가 안됩니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]이 부분을 설명하실 때, 강사님께서“고객 요청이 오면 service 메소드가 호출이 되고 ,viewPath라는 경로의 jsp를dispatcher의 forward 함수가 다시 호출을 하고서버 내부에서 서버끼리 new-form.jsp로 제어권을 넘겨준다” 라고 말씀하셨습니다. 여기서 이해가 안되는 부분이 2개 있습니다.1."서버 내부에서 서버끼리"라고 말씀하셨는데 이건 어떤 어떤 서버를 얘기하는 건가요?서블릿은 "자바를 사용해 웹 페이지를 동적으로 생성하는 서버 내 프로그램"이라고 설명이 나와있습니다.그러면 서블릿이 하나 하나의 서버이고, MvcMemberFormServlet 서블릿에서 new-form.jsp 서버로 상호작용을 하고있다. 이렇게 이해하면 되는건가요?이게 아니라면, "서버 내부에서 서버끼리"라는 것은 어떤 서버 내부에서 어떤 서버들을 이야기 하시는 건가요? 2. "new-form.jsp로 제어권을 넘겨준다"에서 MVC 패턴에서 제어권이란 정확히 어떤 개념인가요?제어권이란 현재 데이터에 접근하는 "서블릿이나 서버 또는 객체"를 의미하는건가요?설명 부탁드립니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
service폴더가 hellospring폴더가 아닌 java하위 폴더에 있는 경우 오류
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오)예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예 [질문 내용] 제가 (프로젝트명)폴더가 아닌 java밑에 service폴더를 넣어놨더니이런 오류가 발생했습니다.여기서 궁금한점이 [프로젝트명]폴더 밑에있어야지만 SpringContainer에 service repository controller가 DI되는건가요?확신이없어서 질문드립니다ㅠ
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
DeliveryCode 리팩토링
[문제 상황]강의 자료에서 언급되어 있는 DeliveryCode 객체가 반복 생성되는 것을 개선하도록 리팩토링 해보았습니다. 제가 작성한 코드의 문제점 또는 개선할 점을 알려주신다면 감사드리겠습니다.[리팩토링 전]DeliveryCode 클래스FormItemController에서 Model에 등록item.html[리팩토링 후]DeliveryCodeRepository 클래스 (추가)FormItemController에서 Model 등록 (수정)
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Assertions 메서드 인자 순서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]회원 리포지토리 테스트 케이스 작성 강의에서 assertEquals(A, B), assertThat(A).isEqualTo(B)에 대한 질문이 있습니다. 두가지 메서드 모두 A와 B의 순서가 크게 중요하지 않아보이는데 그런가요?다르다면, 첫번째 메서드는 member를 앞에 넣으시고, 뒤에 메서드는 member1을 뒤에 넣으셨는데, 메서드를 어떻게 해석해야할까요? junit 문서를 찾아보아도 그런 설명이 없네요..
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
통합 테스트 코드 - 회원가입() 메서드 에러 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]16:47초에 실행하시는 통합테스트 코드 - 회원가입() 메서드 실행에서 에러가 납니다.. 에러 내용은 다음과 같습니다.could not prepare statement [Column "M1_0.USERNAME" not found; SQL statement:select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-214]] [select m1_0.id,m1_0.username from member m1_0 where m1_0.username=?]org.hibernate.exception.SQLGrammarException: could not prepare statement [Column "M1_0.USERNAME" not found; SQL statement:select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-214]] [select m1_0.id,m1_0.username from member m1_0 where m1_0.username=?] at app//org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:64) at app//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56) at app//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:187) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:76) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.lambda$list$0(JdbcSelectExecutorStandardImpl.java:102) at app//org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.executeQuery(DeferredResultSetAccess.java:226) at app//org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess.getResultSet(DeferredResultSetAccess.java:163) at app//org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.advanceNext(JdbcValuesResultSetImpl.java:254) at app//org.hibernate.sql.results.jdbc.internal.JdbcValuesResultSetImpl.processNext(JdbcValuesResultSetImpl.java:134) at app//org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues.next(AbstractJdbcValues.java:19) at app//org.hibernate.sql.results.internal.RowProcessingStateStandardImpl.next(RowProcessingStateStandardImpl.java:66) at app//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:198) at app//org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:361) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168) at app//org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93) at app//org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) at app//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:110) at app//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:303) at app//org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:244) at app//org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:518) at app//org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367) at app//org.hibernate.query.Query.getResultList(Query.java:119) at app//hello.hellospring.repository.JpaMemberRepository.findByName(JpaMemberRepository.java:33) at app//hello.hellospring.service.MemberService.validateDuplicateMember(MemberService.java:33) at app//hello.hellospring.service.MemberService.join(MemberService.java:27) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17.0.4.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.4.1/java.lang.reflect.Method.invoke(Method.java:568) at app//org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:756) at app//org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at app//org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) at app//org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at app//org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) at app//org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:756) at app//org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) at app//hello.hellospring.service.MemberService$$SpringCGLIB$$0.join(<generated>) at app//hello.hellospring.service.MemberServiceIntegrationTest.회원가입(MemberServiceIntegrationTest.java:28) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17.0.4.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.4.1/java.lang.reflect.Method.invoke(Method.java:568) at app//org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727) at app//org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at app//org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147) at app//org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at app//org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92) at app//org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138) at app//org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@17.0.4.1/java.util.ArrayList.forEach(ArrayList.java:1511) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base@17.0.4.1/java.util.ArrayList.forEach(ArrayList.java:1511) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at app//org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at app//org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at app//org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at app//org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at app//org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at app//org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at app//org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at app//org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:110) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:90) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:85) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.4.1/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base@17.0.4.1/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.4.1/java.lang.reflect.Method.invoke(Method.java:568) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "M1_0.USERNAME" not found; SQL statement:select m1_0.id,m1_0.username from member m1_0 where m1_0.username=? [42122-220] at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244) at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226) at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213) at org.h2.command.query.Select.prepareExpressions(Select.java:1170) at org.h2.command.query.Query.prepare(Query.java:218) at org.h2.command.Parser.prepareCommand(Parser.java:583) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634) at org.h2.server.TcpServerThread.process(TcpServerThread.java:288) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:833) at app//org.h2.message.DbException.getJdbcSQLException(DbException.java:502) at app//org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at app//org.h2.engine.SessionRemote.done(SessionRemote.java:606) at app//org.h2.command.CommandRemote.prepare(CommandRemote.java:78) at app//org.h2.command.CommandRemote.<init>(CommandRemote.java:50) at app//org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:480) at app//org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) at app//org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92) at app//org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) at app//com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:327) at app//com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$1.doPrepare(StatementPreparerImpl.java:91) at app//org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:177) ... 123 moreJava HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appendedMemberServiceIntegrationTest > ȸ������() FAILED org.hibernate.exception.SQLGrammarException at MemberServiceIntegrationTest.java:28 Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException at MemberServiceIntegrationTest.java:282023-08-20T14:08:26.076+09:00 INFO 17356 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'2023-08-20T14:08:26.079+09:00 INFO 17356 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...2023-08-20T14:08:26.109+09:00 INFO 17356 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.1 test completed, 1 failed> Task :test FAILEDFAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':test'.> There were failing tests. See the report at: file:///C:/Users/man25/OneDrive/����%20ȭ��/������%20����/hello-spring/build/reports/tests/test/index.html* Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights.* Get more help at https://help.gradle.orgBUILD FAILED in 22s4 actionable tasks: 1 executed, 3 up-to-date 아래 사진은 application.properties 디렉터리의 코드입니다. 아래 사진은 SpringConfig 클래스의 코드입니다. 해결 방법을 모르겠네요ㅠㅠㅠ
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
만약 WAS가 죽는 경우 Exception Handling?
안녕하세요!이번에도 강의를 듣던 도중 궁금한 점이 생겨 질문드립니다. 이전에 스프링 MVC 1편 초반부에서 웹 시스템을 구성함에 있어, 정적 리소스는 웹서버에 동적 렌더링이 필요한 데이터 트랜잭션 부분들은 WAS에 역할을 나누어 구성한다고 알려주셨던 것으로 기억하는데요!지금 배우는 부분은 WAS 내에서 서블릿과 스프링 MVC가 어떻게 동작하는지 배우는 것으로 이해했습니다.그렇다면 지금 공부하는 시점에서는 WAS가 죽어버리면 아예 접속이 안되는 (흔히 서버가 다운되어서 Request Timeout이 뜨는 것과 동일함) 것으로 이해하면 될까요? 그리고 콘서트 티켓팅 사이트들에서 예매를 진행하게 될때 모 사이트에서는 아예 Timeout이 됐는지 안됐는지도 개발자 도구에서 확인해야하고 페이지는 하얀 화면만 띄우고 있던데이런 Timeout 관련해서는 Exception을 띄우는게 불가능한건지도 여쭤보고 싶습니다 감사합니다!