안녕하세요 mvc 2편 코드를 따라하며 프로젝트를 실행시키고 확인하다가, mvc 1편에 특정 부분을 확인하고자 1편에서 썼던 프로젝트를 실행시켰습니다 분명 2편 프로젝트를 실행중지하고, 1편 프로젝트를 실행했는데 localhost:8080 을 통해 나온 welcome page가 2편 프로젝트의 index.html 입니다 왜 1편 프로젝트의 index.html이 welcome page로 뜨지 않는 것일까요? 감사합니다!
안녕하세요 아래 링크의 문의글과 같은 상황이라 문의드립니다. build 생성 오류 질문드립니다...(윈도우) https://www.inflearn.com/questions/268449/build-%EC%83%9D%EC%84%B1-%EC%98%A4%EB%A5%98-%EC%A7%88%EB%AC%B8%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4-%EC%9C%88%EB%8F%84%EC%9A%B0 인텔리제이에서는 정상적으로 컴파일 되는 상태입니다. 인텔리제이를 종료 한 상태에서 CMD를 통해 gradle을 build하면 아래와 같은 오류 메세지가 나오는 상태입니다. 댓글에 안내해주신 대로 프로젝트를 새로 생성 후 바로 CMD에서 컴파일을 했는데도 오류 메세지가 동일해서 문의드립니다.
============================== [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 스프링 부트에서 정적 파일 관리를 제공하는 것이 그래들, 메이븐 모두에게 해당되는 개념인지 아니면 그래들에만 해당되는 얘기인지 궁금합니다. 메이븐 방식일 경우 webapp 하위에 resources와 WEB-INF로 나뉘는데 정적파일이 resources에 저장되는걸로 알고있습니다. 스프링프레임워크에서는 뷰리졸버의 prefix가 기본적으로 /WEB-INF/views/ 이렇게 세팅해두고 하는것으로 알고있거든요...
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 제가 DI를 제대로 이해한 것인지 확인 부탁드려도 될까요? MemberService클래스와 MemberServiceTest클래스의 멤버변수인 MemoryMemberRepository 객체가 다른 객체일 가능성이 있습니다. 각각의 두 클래스에서 굳이 동일한(총 2개) MemoryMemberRepository객체를 만들 필요는 없습니다. 왜냐하면 두 객체가 다른 객체일 가능성도 있고 목적상 다른 객체이어야 할 이유가 전혀 없기 때문입니다. 이러한 문제를 개선하기 위해 DI가 필요합니다. DI를 하는 방법은 다음과 같습니다. MemberService클래스 에서 멤버변수에MemoryMemberRepository 객체를 생성하지 않고 참조변수만을 선언합니다. 생성자를 만들어 MemoryMemberRepository 객체를 주입받고 그 객체를 멤버변수 MemoryMemberRepository로서 사용하도록 합니다. MemberServiceTest클래스 에서 MemberService 생성자를 사용하여 MemberService 객체를 생성하는데 이 때, 생성자의 인자에 MemoryMemberRepository 객체를 생성해 주입합니다. MemberService클래스에서 생성자를 만들었고 생성자의 인자로 MemoryMemberRepository 객체를 주입받고 그 객체를 멤버변수로 사용하기로 했다는 것을 잊지말아야 합니다. 이것이 핵심입니다. 물론 14분대 강의영상에서는 MemberServiceTest클래스에서 MemberService의 각 메서드들이 테스트되기 전 매번 MemberService 객체가 만들어져야 하므로 beforeEach() 메서드 안에서 구현이 되었을 뿐, DI의 원리는 지금까지 설명한 바와 동일합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] MemberService에서 아직 어떤 DB를 사용할지 모르니 참조타입을 MemberRepository로 하고 생성자를 MemoryMemberRepository를 한 것은 이해가 갔습니다. 다형성을 위해서 그러신 것이죠. private final MemberRepository memberRepository = new MemoryMemberRepository(); 근데 강의영상 12:00부터 의도치 않은 Member객체를 가르킬 수 있으니 MemberServiceTest에서 멤버변수 AfterEach()를 새로 만들어 리포지토리를 지우기 위해 MemoryMemberRepository의 clearStore()를 가져와야 했습니다. 그래서 MemberServiceTest 16라인에 MemoryMemberRepository memberRepository = new MemoryMemberRepository(); 이렇게 작성하셨습니다. 근데 제가 생각했을 때 참조타입도 MemoryMemberRepository 이고 생성자도 MemoryMemberRepository인데 어째서 참조변수의 이름은 memberRepository 인건지 궁금합니다. 귀한 시간 내주셔서 제 질문 읽어주셔서 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 공통처리는 필터보다는 인터셉터를 우선적으로 고려하라고 말씀해 주셨었는데요, 모든 요청에 대해 request 의 inputStream 을 이용해 requestBody 로깅을 한다고 했을때 필터와 인터셉트 중 어느것을 사용하는게 더 적절하다고 보시는지 궁금합니다.
수업 잘 듣고 있습니다. 자동화를 하고 싶으서 예전 영상 보다가 최근에 다시 올라와서 보는 중 강의 발견하고 바로 수강해서 듣고 있습니다. 궁금한 것이 하나 있는데요. 셀레니움에서 하나의 윈도우 창의 특정 태그 값을 찾아서 다른 윈도우 창을 오픈 한 후 특정 필드에 값을 넣을 수 있나요?
<property name=“jdbcUrl" value="jdbc:mysql:// localhost:3306/com?serverTimezone=UTC"/ > 이 부분의 property name을 발견할 수 없다고 빨간 엑스가 떠서요 pom.xml 이나 나머지는 다 pdf 내용대로 진행했는데 이유를 모르겠습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/) [질문 내용] @ExceptionHandler 을 사용해도 인터셉터의 postHandle는 실행이 안되는게 맞나요?? 로그에서는 postHandle을 건너뜁니다 @ExceptionHandler을 사용하면 정상 흐름으로 바꿔주는걸로 이해했는데 postHandle을 건너뛰는건 맞는건가요 ??
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/) [질문 내용] 여기에 질문 내용을 남겨주세요. MyHandlerExceptionResolver 는 에러가 터지면 서블릿 컨테이너까지 가고 또 다시 /error을 요청하고 UserHandlerExceptionResolver 이건 그냥 바로 그자리에서 끝내는데 그 차이가 response.sendError(...) 이 response.SendError 해주냐 안해주냐 차이라고 생각하면 될까요 ?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요! MemberRepository 코드 중에 findById 는 예전 강의에서 스펙상 Member 객체를 반환하는걸로 권고(?)된다고 들었던 것 같은데, 그렇다면 왜 findByLoginId 는 Optional<Member> 로 반환하는건가요? Optional이 NullPointerException 발생을 줄이기 위해 래퍼 역할을 한다는 것은 알겠는데, 두 메서드의 반환값 차이가 있는 이유가 무엇인지 궁금합니다!
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 상품목록 - 타임리프 진행중에 문제가 생겼습니다. 타임리프에 문제가 있는지.. 변수가 안담깁니다. 구글링으로 찾아봐서 캐쉬초기화도 해봤고 " http://www.thymeleaf.org " 를 http://thymeleaf.org 로 변경도 해봤지만 경고문만 사라지고 해결되지 않았습니다. 근데 여기서 이상한건 th:onclick="|location.href='@{/basic/items/add}'|" 이 타임리프 문장은 작동이 되는것 같아요 저 코드대로 /basic/items/add 경로로 이동이 됩니다. 자바코드에 문제가 있나 확인도 해봤지만 문제점을 찾지 못했습니다 확인해야할게 더 있으면 알려주시면 감사하겠습니다...
클라이언트와 서버간의 동작에 대해 헷갈려서 여쭤보려구요!! 웹 브라우저에 localhost:8080/form/items/add 라고 치면 addForm(Model model) 메서드가 동작해 모델에 "item"이라는 이름에 빈 객체 Item을 넣고 form/addForm 타임리프 페이지를 렌더링 해서 브라우저에 띄운다. 상품 등록 폼에서 상품명, 가격, 수량을 작성해서 상품 등록 버튼을 누르는 순간 @PostMapping의 addItem 메서드가 호출되어 해당 메서드의 로직을 실행한다고 보면 될까요? 위 코드로 스프링 MVC 동작 방식과 순서를 알고 싶습니다.
프로젝트를 전자정부프레임워크에 사용하고 있던데 일단 전자정부프레임워크 바탕으로 공부하되 나중에 수업내용을 다른 곳에 적용할 수 있을까요? 스프링 레거시 프로젝트는 이제 점점 안쓰이고 있는 추세인것 같은데 배워두면 도움이 될까요? 취준생입니다.ㅜㅜ 전자정부프레임워크만 사용하는 곳에 취직한다면 환경설정을 어렵게 할 필요없어서 상관이 없겠는데요. 다른 이클립스, 인텔리제이를 쓰는 곳에 들어가면 꽤나 곤란할 것 같아서요. 특히 인텔리제이로 예제를 실행하면 자꾸 오류가 나서요. 원래 전자정부프레임워크르 바탕으로 만들어진 예제같아서 잘 안되는 것 같은데요 수업자료는 정말 정말 괜찮은데 프로젝트를 전자정부프레임워크에서만 쉽게 실행이 가능하면 환경설정에 약한 처음 공부하는 입장에서 꽤나 곤란할것 같아서요 ㅠㅠ 인텔리제이는 잘 몰라도 이클립스 가지고 프로젝트를 구축하는 방법도 나중에 설명해주셨으면 합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.2 was found. The consumer was configured to find a runtime of a library compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6' but: 메인메소드 실행하려면 이런거뜨고, 실행 버튼도 없고 그러네요... 빌드 가져왔을때부터 동기화 오류나오던데 코끼리눌러도안됩니다.
[ConverterController.java] public String converterForm(Model model) { IpPort ipPort = new IpPort("127.0.0.1", 8080); Form form = new Form(ipPort); model.addAttribute("form", form); return "converter-form"; } [converter-form.html] <form th:object="${form}" th:method="post"> th:field <input type="text" th:field="*{ipPort}"><br/> th:value <input type="text" th:value="*{ipPort}"> </form> th:field가 컨버터로 IpPortToStringConverter를 선택한 이유가 궁금한데요 . 추측해본 이유는 다음과 같습니다. th:field가 value 속성을 만들 때, form.getIpPort()에 컨버터를 적용하려고 한다. 그런데, form.getIpPort()의 타입은 IpPort이다. 그래서, 컨버팅 대상은 IpPort가 되는 것이다. String으로 컨버팅되는 이유는 <input type="text">이기 때문이다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요? 강의 너무 잘 듣고있습니다! 실습하던 중에 저는 addItemV1 버전으로 rejectedValue 없이 오류를 처리했는데도 영한님과 다르게 입력했던 값이 유지가 됩니다. 타임리프가 업데이트 된걸로 봐야할까요? 감사합니다.