1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] "mvc 를 패턴 - 적용" 강의에서 회원 목록을 조회할 때 계속해서 에러가 발생해서 질문드립니다. MvcMemberListServlet.class @WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members") public class MvcMemberListServlet extends HttpServlet { private MemberRepository memberRepository = MemberRepository.getInstance(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Member> members = memberRepository.findAll(); System.out.println("메모리에 저장된 데이터: "); for (Member member : members) { System.out.println("member.username = " + member.getUsername()); System.out.println("member.age = " + member.getAge()); } request.setAttribute("members", members); String viewPath = "/WEB-INF/views/members.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); } } - 회원을 등록하고 " http://localhost:8080/servlet-mvc/members " 경로로 들어간후에, 위 코드의 실행 결과를 확인하면 MemberRepository 에 정상적으로 데이터가 들어 간 것을 확인할 수 있었습니다. 그런데 아래의 에러와 함께 whitelabel page가 보이네요.. org.apache.jasper.JasperException: The absolute uri: [ http://java.sun.com/jsp/jstl/core ] cannot be resolved in either web.xml or the jar files deployed with this application org.apache.jasper.JasperException: The absolute uri: [ http://java.sun.com/jsp/jstl/core ] cannot be resolved in either web.xml or the jar files deployed with this application 위의 에러들에 관해서 구글링을 해보니까 jsp 파일에서 코드를 잘못 작성했을 확률이 높다고 합니다. 그런데 jsp 파일에는 큰 문제가 없어 보입니다 ㅠ <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> </head> <body> 성공 <ul> <li>id=${member.id}</li> <li>username=${member.username}</li> <li>age=${member.age}</li> </ul> <a href="/index.html">메인</a> </body> </html> 그리고 아래는 설정 파일입니다. plugins { id 'java' id 'war' id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' // providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' //JSP 추가 시작 implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl' //JSP 추가 끝 } tasks.named('test') { useJUnitPlatform() } 다른 질문을 보니 implementation 'javax.servlet:jstl' 이 부분을 주석 처리하고 다시 해보라는 답변이 있길래 해봤더니 여전히 에러가 발생합니다. 참고로 메인 클래스에 어노테이션은 저렇게 구성되어 있습니다. 도움 주시면 감사하겠습니다... @ServletComponentScan @SpringBootApplication public class ServletApplication { public static void main(String[] args) { SpringApplication.run(ServletApplication.class, args); } }
A폼에서는 required만 사용하고, B폼에서는 더 구체적인 레벨의 required.item을 사용한다는 가정하에, errors.properties 에 required.item 메시지를 정의해두면 A, B폼 모두 구체적인 레벨의 메시지가 적용될 것이라고 생각합니다. 즉, 여러 단계 레벨의 메시지를 작성해놓더라도, 항상 가장 구체적인 레벨의 메시지만 사용되지 않을까하는 의문입니다. 그럼 결국, 폼에 따라 메시지를 다르게 사용하는 게 아니라 모두 구체적인 메시지를 사용하게 되는 것인데, 어떻게 실무에서는 이걸 다르게 적용되도록 구현하는지 궁금합니다.
단순 값에 의한 처리는 값이 일단 넘어오긴 하니까, bindingFailure 값을 false로 둔 것이고, 타입에 대한 처리는 내부에서 bindingFailure 값이 true로 전달된다고 이해하면 될까요? 이 타입에 대한 처리 코드는 따로 작성할 필요는 없는 건가요? (bindingFailure가 true인)
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 현재 실행이 안되고 있는 상태입니다. 무슨 문제인지 알고 싶습니다 ㅜㅜ 구글 드라이브 링크입니다. https://drive.google.com/drive/folders/15MQr82y4Qdcm4Cs7dZItZMa7rG_fJevw?usp=sharing
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] simplejdbcinsert를 여러 테이블에 적용해야 한다면 적용할 테이블 개수에 맞춰서 객체를 생성해줘야 할까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. addItem도 그렇고 editForm도 상품 등록이나 수정 버튼을 누르면 에러가 뜹니다. 2024-02-20 12:04:29.880 ERROR 71299 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [validation/v3/editForm ], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause @PostMapping("/add") public String addItem(@Validated @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { // 특정 필드가 아닌 복합 룰 검증 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); } } // 검증 실패하면 다시 입력 폼으로 if (bindingResult.hasErrors()) { log.info("errors = {}", bindingResult); return "validation/v3/addForm"; } //성공 로직 Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:validation/v3/items/{itemId}"; } @PostMapping("/{itemId}/edit") public String edit(@PathVariable Long itemId, @Validated @ModelAttribute Item item, BindingResult bindingResult) { // 특정 필드가 아닌 복합 룰 검증 if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice < 10000) { bindingResult.reject("totalPriceMin", new Object[]{10000, resultPrice}, null); } } // 검증 실패하면 다시 입력 폼으로 if (bindingResult.hasErrors()) { log.info("errors = {}", bindingResult); return "validation/v3/editForm"; } itemRepository.update(itemId, item); return "redirect:validation/v3/items/{itemId}"; }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 제대로 이해하고 있는지 궁금합니다 @GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name) { Hello hello = new Hello(); hello.setName(name); return hello; } 1. GetMapping은 브라우저에서 쓰이는 주소 ? 를 뜻하는게 맞나요 localhost:8080/hello-api 라는 주소를 입력하면 컨트롤러에서 주소에있는 hello-api와 일치하는 메서드인 Hello helloApi를 연결해서 실행 2. @RequestParam("name")은 http://localhost:8080/hello-api?name=abcd에서 name을 뜻하고 String name 이 abcd를 의미하는건가요 ? abcd라는 값은 setter 메서드로 설정한것은 알고있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요 강의 정말 잘보고있고, 차분히 잘 따라하고 있습니다. 처음엔 되다가 한번 끄고나서 다시 해보니, h2연동이 안되서 질문드립니다. mac 환경이며, rm test.db도 해보고 통합환경테스트를 할때, 더이상 업데이트 반영이 안되고, 검색해서 연동하란대로 해봤는데 전혀 되지가 않습니다... 항상 좋은 강의 해주셔서 감사하며, 시간날때 답변 부탁드립니다. 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. MemberController.java 를 실행시키면 아래와 같이 오류가 발생하는데 무엇이 문제일까요?
다른 질문의 답변 내용을 읽어보니 실무에서는 Member 가 필요로 하는 정보보다 더 많은 양의 정보가 들어오기 때문에 MemberForm 클래스와 Member 클래스를 나누는 게 좋다고 하더군요. 그렇다면 Member 클래스의 getName() 과 MemberForm 클래스의 getName() 은 어느 기준으로 구분해서 사용해야 하나요?
안녕하세요. AOP 강의를 듣다가 테스트를 할 때는 Start, End가 잘 출력되는데 서버에 띄워서 회원 목록을 누를 시 출력이 안되는 경우가 있었습니다. 저의 경우 test/java/hello.hellospring 밑의 경로로 파일을 만들었기 때문에 생겼었고 이를 main 쪽으로 옮겨주니까 정상적으로 실행이 되었습니다. 혹시 같은 일로 문제가 생기셨다면 참고해주셔도 좋을 것 같습니다. 감사합니다.
강의 4:47 즈음에서 궁금해진 내용입니다. MemoryMemberRepository 에서, save() 함수를 통해 HashMap<> store 에 id 값과 Member 변수를 담도록 되어 있는데, 그 밑에 있는 findById(), findAll() 함수에서 store 에 담겨져 있는 값을 가져오려면 store 가 어딘가에 저장이 되어야 하는 것이 아닌가요? 프로그램을 종료해도 store 에 담겨 있는 정보가 휘발되지 않는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. gradlew.bat build로 입력하면 이렇게 나옵니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 여기에 질문 내용을 남겨주세요. package repository; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemoryMemberRepository; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.util.List; import static hello.hellospring.repository.MemoryMemberRepository.store; import static org.assertj.core.api.Assertions.*; class MemoryMemberRepositoryTest { MemoryMemberRepository repository = new MemoryMemberRepository(); @AfterEach public void afterEach(){ repository.clearStore(); } @Test public void save() { Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); assertThat(member).isEqualTo(result);//member 가 result 와 같다. } @Test public void findByName(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); Member result = repository.findByName("spring1").get(); assertThat(result).isEqualTo(member1); } @Test public void findAll(){ Member member1 = new Member(); member1.setName("spring1"); repository.save(member1); Member member2 = new Member(); member2.setName("spring2"); repository.save(member2); List<Member> result = repository.findAll(); assertThat(result.size()).isEqualTo(2); } public void clearStore(){ store.clear(); } } 이렇게 오류가 뜹니다. 여기 전까지는 오류가 발생하지 않았습니다. 도움 주시면 감사하겠습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 1. 상품 등록 폼 조회 코드 @GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); return "items/addForm"; } 2.회원 가입 폼 조회 코드 @GetMapping("/add") public String addForm(@ModelAttribute Member member){ return "members/addMemberForm"; } 상품 등록 시에는 빈 Item 객체를 Model에 직접 지정해서 넘겼는데 , 회원 가입 시에는 @ModelAttribute를 통하여 자동으로 Member을 Model에 지정해서 넘겼습니다 왜 Item에는 빈 Item 객체를 직접 모델에 담았고 Member에는 @ModelAttribute로 자동으로 처리되게 했는지 궁금하고 어떤 방식이 효율이 좋은지 궁금합니다!
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 코드 실행 했을 때 local8080 입력해서 들어가면 ok라고 뜨고 잘 실행 되긴 하는데 debug가 많이 뜨고 이런 것들이 많이 나옵니다. 이렇게 뜨는 걸 보면 제대로 RUN 된 것 같지 않은데 실행은 잘 되는 것 같아요 어떻게 고쳐야 하는 건가요