월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
return이 안돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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}"; }
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
상품 등록 폼 조회 , 회원 가입 폼 조회 시의 차이
[질문 템플릿]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로 자동으로 처리되게 했는지 궁금하고 어떤 방식이 효율이 좋은지 궁금합니다!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
9. API 예외처리 공부중 디버깅모드 하려면
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof IllegalArgumentException) { log.info("IllegalArgumentException resolver to 400"); response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage()); return new ModelAndView(); } } catch (IOException e) { log.error("resolver ex", e); e.printStackTrace(); } return null; }이 코드에서 return new ModelAndView(); 에대해 intellij에서 디버깅모드를 해서 진행과정을 보고싶은데 디버깅모드로 실행하고 중단점을 해줘도 디버깅모드가 실행히 안되더라구요 어떻게하면 디버깅모드를 볼수있을까요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
컨트롤러 매핑이 안됩니다 ㅠㅠ
강의를 다듣고 혼자서 게시판을 구현하기 위해 작업중인데요 회원가입 기능을 만들기 위해서 index.html 화면에서 회원가입 버튼을 누르면 회원가입 뷰로 이동하게 할려고 했는데 컨트롤러가 매핑이 안되어 뷰가 보이지 않습니다. 어떻게 해결해야 할까요? https://drive.google.com/drive/folders/1qfnBICO1XDiGDS_BTleEBumPHN2bnJi6?usp=drive_link
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
placeholder에 국제화 적용해보기
placeholder에 국제화를 적용하려면 다음과 같이 하면 되는 걸까요? <기존><수정>message.properties에 위의 값 추가
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
개인 미니 프로젝트
스프링 MVC1,MVC 2편을 다 수강하여서 개인 프로젝트를 간단하게 만들어보려고 합니다. 화면에 보이게 할 수 있도록 타임리프 기술을 활용하려고 하는데요. html,css, 부트스트랩은 강의때 복사 붙여넣기만 해봐서 구현할줄을 잘 모릅니다. 구글링을 해봐도 사용법이 친절하게 나오지 않아서 좀 어려운데 도움될만한 사이트나 책이 있을까요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
파일 저장 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의에서 설명하는 대로 제출을 했지만 파일이 저장되지 않습니다. 404 오류가 뜨지만 302 리다이렉트는 정상적으로 실행이 되었습니다. 제가 로컬디스크 C에 file이라는 폴더를 만들어서 application.properties 에는 file.dir=C:/file/ 이라는 경로로 지정해주었습니다. 파일이 저장되지 않는 이유가 뭘까요?
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
LocalValidatorFactoryBean과 섹션4에서 배운 Validator 인터페이스의 차이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 Bean Validation - 스프링 적용 강의 듣던 중 질문드립니다.그러면 섹션 4에서 진행했던 supports()와 validate() 기능을 제공했던 Validator 인터페이스와어노테이션 기반 검증을 진행하는 Bean Validation 역할을 하는 글로벌 Validator인 LocalValidatorFactoryBean과는 서로 @Validated를 보고 검증을 해준다는 개념은 같지만 그 외의 방식은 완전히 다른 객체라고 보면 될까요? 찾아보니LocalValidatorFactoryBean의 부모인 Validator의 패키지는 jakarta.validation.Validator이고 섹션 4에서 배운 supports()와 validate()을 갖는 Validator 인터페이스의 패키지는 org.springframework.validation.Validator 라서 서로 다른 패키지이긴 합니다 !
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@SpringBootTest 에러
[질문 템플릿]1. 강의 내용과 관련된 질문인가요?예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요?예[질문 내용]메시지/국제화 파트의 @SpringBootTest를 하는 과정에서 다음과 같은 오류가 납니다.그냥 Junit 단위 테스트는 잘되지만 스프링 부트 테스트에서만 해당 오류가 발생합니다.다른 수강생의 비슷한 질문도 확인하여 해당 질문의 답변에 따라 조치도 취해보았고, 스택오버플로우를 찾아보며 mockito-inline 관련 설정도 해보았음에도 해결되지 않아 질문 올립니다!#콘솔 오류 메시지 # 테스트코드#프로젝트 설정
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
폼 요청에도 @ModelAttribute 사용하는 이유는 뭔가요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@GetMapping("/login") public String loginForm(@ModelAttribute("loginForm") LoginForm form) { return "login/loginForm"; }로그인 예제에서 로그인 폼 요청을 할때도, @ModelAttribute 로 값을 받는데, 어떤 기능을 하는지 궁금합니다.폼 요청시에는 파라미터 값이 없어서 필요없을것 같아지워보니 오류가 발생합니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:field, th:value 질문 있습니다
위에서 th:field와 th:value 값이 같다면, 셀렉트 박스의 경우, selected 속성이 활성화된다고 이해했습니다. 애플리케이션 실행 후, 만약 '빠른 배송'이라는 것을 선택하면, thh:field의 값으로 'FAST'가 넘어오게 되고,th:each로 순회되면서 th:value의 값으로 'FAST'을 만났을 때, selected 속성이 활성화되는 것이 맞을까요? 맞다면, 아래와 같은 궁금증이 있습니다.위 과정에서 '빠른 배송' 글자를 클릭했을 때, 어떠한 코드로 인해서 'FAST'가 넘어오게 되는지th:field와 th:value의 값이 String의 equals()와 같은 원리로 동작해서 단순히 똑같은 문자임을 확인하는 것인지th:field와 th:value 값이 각각 어떻게 입력이 되어서 비교가 되는지 (item.deliverCode는 객체이고, deliverCode.code는 String 타입인데 어떻게 비교가 되는지..)장문의 질문 읽어주셔서 감사합니다 (_ _)
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
예외 처리 질문드립니다.
[질문 내용]안녕하세요 해당 강의에서 LoginCheckFilter 구현 중에 try - catch 코드에서 질문이 있어서 글을 남깁니다. catch (Exception e) { throw e; // 예외 로깅 가능하지만 , 톰캣까지 예외를 보내주어야 함.}부분이 이해가 가질 않습니다. 톰캣까지 예외를 보내줘야하는 이유를 모르겠네요. 그리고 try 구문 내에서 return으로 다음을 진행하지 않고 끝을 내는 부분도 잘 와닿지 않습니다.제가 예외 처리 부분 개념이 약한 거 같은데, 위에 질문 드린 내용들을 뭐라고 검색하고 공부하면 좋을까요?
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:field 에 id부여 방식에 대해서 궁금합니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]먼저 올해도 spring강의 수강생들과 강사님 모두 새해 복 많이 받으시길 기원합니다제가 질문드리고싶은 사항은 th:field=*{regions} 를 통해서 id,name값을 설정하는 부분입니다 addForm에서는 item.regions에 아무런 값이 없는데도 불구하고 id를 th: each 문에 맞춰서 regions1,2,3 를 타임리프가 알아서 단순히 텍스트로 생성해주는 건가요?? addform에서는 분명 데이터가 없을텐데 저렇게 id가 생성되는 이유가 궁금해서 질문 드립니다
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
[체크박스-멀티] 안녕하세요. #ids의 작동 방식에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요, 우선 좋은 강의에 감사드립니다.다름이 아니라, 강의를 듣는 도중 멀티 체크박스를 정의하는 과정에서 #ids.prev('regions')부분에서 이해가 되지 않았습니다. th:each를 사용하는 경우 id에 1, 2, 3과 같은 숫자를 붙여 regions1, regions2.. 와 같이 만드는데, 왜 #ids.prev에선 'regions'를 입력으로 넣는지가 이해가 되지 않았습니다.(뿐만 아니라 전체 흐름을 조금 더 명확하게 이해하고 싶었습니다.)구글링을 해봤는데, 해당 강의에 대한 블로그 정리는 많지만 제가 원하는 내용은 찾지를 못했습니다..ㅜㅜ그래서, 이번 기회에 소스코드를 찾아보며 이해를 해보려고 했는데, 아래 작성된 과정이 맞는지, 제가 잘 이해한게 맞는지가 궁금하여 질문 드리게 되었습니다. 너무나도 긴 질문이라 미리 죄송하다는 말씀 드립니다..다음 코드는 SpringInputCheckboxFieldTagProcessor 클래스의 doProcess()와, AbstractSpringFIeldTagProcess 클래스의 computeId() 메서드 입니다.protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName, String attributeValue, IThymeleafBindStatus bindStatus, IElementTagStructureHandler structureHandler) { String name = bindStatus.getExpression(); name = name == null ? "" : name; String id = this.computeId(context, tag, name, true); // 이하 생략.. } protected final String computeId(ITemplateContext context, IProcessableElementTag tag, String name, boolean sequence) { // 이전 부분 생략.. if (sequence) { Integer count = context.getIdentifierSequences().getAndIncrementIDSeq(id); return id + count.toString(); } } computeId()를 보면, sequence인 경우(→ 이 경우는 th:each가 들어간 경우라고 추측합니다.) Id에 count를 붙여서 반환하도록 되어있습니다.2.IdentifierSequences 클래스public final class IdentifierSequences { private final Map<String, Integer> idCounts = new HashMap(1, 1.0F); public IdentifierSequences() { } public Integer getAndIncrementIDSeq(String id) { Validate.notNull(id, "ID cannot be null"); Integer count = (Integer)this.idCounts.get(id); if (count == null) { count = 1; } this.idCounts.put(id, count + 1); return count; } public Integer getPreviousIDSeq(String id) { Validate.notNull(id, "ID cannot be null"); Integer count = (Integer)this.idCounts.get(id); if (count == null) { throw new TemplateProcessingException("Cannot obtain previous ID count for ID \\"" + id + "\\""); } else { return count - 1; } } } IdentifierSequences 클래스를 보면, idCounts 라는 Map에 id와 count 정보를 저장하고, 1에서의 computeId()는 getAndIncrementIDSeq() 를 통해 count 정보를 얻어냅니다.이 세부 과정을 생각해보면,처음에 th:field=”*{regions}”를 통해 regions라는 id가 들어가면 IdentifierSequences 클래스의 Map<String, Integer> idCounts 에는 regions라는 id가 없어 getAndIncrementIDSeq() 의 count값은 1이 됩니다.this.idCount.put(id, count + 1); 을 통해 idCounts에는 {”regions” : 2}가 저장되며, getAndIncrementIDSeq()가 반환하는 count값은 1이 됩니다.즉, 처음에 regions라는 id가 들어가면, 이는 <input> 태그에는 regions1이라는 id로 지정되지만 IdentifierSequence의 idCount 맵에는 count가 2로 되어있는 상태입니다.IDs 클래스public class Ids { private final ITemplateContext context; public String prev(Object id) { Validate.notNull(id, "ID cannot be null"); String str = id.toString(); return str + this.context.getIdentifierSequences().getPreviousIDSeq(str); } public Ids(ITemplateContext context) { Validate.notNull(context, "Context cannot be null"); this.context = context; } } 그러면 #ids.prev(’regions’) 를 통해 label이 regions1로 등록되는 과정은 다음과 같이 이해할 수 있을 것 같습니다.prev 메서드는 id를 입력받아, IdentifierSequence 의 getPreviousIDSeq()을 호출하여 얻은 숫자를 뒤에 붙여 label의 id를 지정합니다.이전 문단의 IdentifierSequence의 getPreviousIDSeq() 코드를 보면, idCount에서 얻은 count에 1을 빼서 반환합니다.idCount에는 count가 2로 지정되어 있기에, 최종적으로 #ids.prev(’regions’)의 결과는 regions1이 됩니다.활용 : #ids.next의 사용<label th:for="${#ids.next('regions')}" th:text="${region.value}" class="form-check-label">서울</label> <input type="checkbox" th:field="*{regions}" th:value="${region.key}" class="form-check-input"> label과 input 태그의 위치를 바꾸고 #ids.next를 사용하면, 이전과 같이 label의 for와 input의 id를 일치시킬 수 있습니다. 결과는 다음과 같습니다.<!-- multi checkbox --> <div> <div>등록 지역</div> <div class="form-check form-check-inline"> <label for="regions1" class="form-check-label">서울</label> <input type="checkbox" value="SEOUL" class="form-check-input" id="regions1" name="regions"><input type="hidden" name="_regions" value="on"/> </div> <div class="form-check form-check-inline"> <label for="regions2" class="form-check-label">부산</label> <input type="checkbox" value="BUSAN" class="form-check-input" id="regions2" name="regions"><input type="hidden" name="_regions" value="on"/> </div> <div class="form-check form-check-inline"> <label for="regions3" class="form-check-label">제주</label> <input type="checkbox" value="JEJU" class="form-check-input" id="regions3" name="regions"><input type="hidden" name="_regions" value="on"/> </div> </div> 세부 과정을 보면 다음과 같습니다.public String next(Object id) { Validate.notNull(id, "ID cannot be null"); String str = id.toString(); return str + this.context.getIdentifierSequences().getNextIDSeq(str); } next()는 IdentifierSequences의 getNextIDSeq() 를 통해 count 정보를 얻습니다.public Integer getNextIDSeq(String id) { Validate.notNull(id, "ID cannot be null"); Integer count = (Integer)this.idCounts.get(id); if (count == null) { count = 1; } return count; } getNextIDSeq() 를 보면, idCounts에 id가 없는 경우 1을 반환합니다. 즉, 처음에 #ids.next(’regions’)가 입력되면, getNextIDSeq()는 1을 반환하기에 첫 번째 label은 for=’regions1’ 이 됩니다.다음 과정은 2번 문단에 적은 세부 과정과 동일한데, 이전의 #ids.prev에서와 달리 #ids.next는 count에 1을 뺀 값이 아닌 count 그대로를 반환하므로, #ids.prev를 사용할 때와 같이 for와 id가 일치된다고 생각할 수 있습니다.읽어주셔서 감사드립니다. 새해 복 많이 받으세요!(질문 작성일이 설 당일이라.. 겸사겸사 인사드립니다!)
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
로그아웃 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.회원가입을 했는데 로그인에서 널포인트가 터지는데 회원저장소의 문제인거같은데 뭐가 문제인지 잘 모르겠습니다https://drive.google.com/file/d/1gjPbYTN4X-ozjYDISGWff1BvvFdNOfen/view?usp=sharing
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
바로 jpa가도될까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 꾸준하게 강의 들어온 학생입니다. 개강이 얼마 안남아서 jpa로 실제 웹서비스 구현하는 것까지 해보고싶은데 db커리큘럼을 잠깐 건너뛰고 수강해도될까요? 물론 나증에 추가로 들을 예정입니다.
- 해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
th:action th:object 순서
영한님께서는th:action th:object="${item}" method="post"로 적어주셨는데,th:action과 method="post"는 붙어 있는 게 더 자연스럽다고 생각이 되서요. th:object="${item}" th:action method="post"라고 적어도 문법적으로는 괜찮은 걸까요? 애플리케이션 실행 시에, 페이지 소스 확인해보니 동일하게 동작하는 것은 확인했지만, 뭔가 일반화된 사용 순서인지 궁금해서 여쭤봅니다!
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
[프로젝트 실행하는 법] for 스프링 부트 3.2 이상 자바 버전 17 이상
start.spring.io 가서 새로 만드시는 게 더 편합니다. Group : helloartifact item-servicepackage name : hello.itemservicepackaging : JarDependencies- Spring Web- Thymeleaf- Lombok그리고 form-start에서 main하고 test 폴더 그대로 복붙하시면 유일하게 한곳에서 에러 뜹니다. 아마 TestDataInit 에서 에러뜨는데 import javax.annotation.PostConstruct;-> import jakarta.annotation.PostConstruct;이렇게 변경하세요 그럼 끝
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
multipartfile 리스트
안녕하세요. 스프링 개발할 때 질문이 있어서 글을 쓰게 되었습니다. 프론트에서 게시글관련 정보와 multipartfile 리스트를 넘겨주는 api를 만들고 있습니다. 만약 multipartfile 리스트를 안넘겨줘도 문제가 없는 요구사항이라면 multipartfile 리스트가 null이나 빈파일을 포함하고 있는지 확인하는 로직은 어디다가 놓는 것이 좋을까요?(빈파일은 size가 0인 multipartfile) 현재는 requestDto 생성자에서 검사하고 있습니다.null이면 빈리스트를 넣도록하고그 다음에 빈파일을 포함하고 있으면 빈파일들을 필터링하게 만들었습니다.
- 미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
코드 상으로 빨간줄 에러 질문드립니다.
위와 같이 컴파일 에러가 표시되긴 합니다만, 애플리케이션 실행 시에는 정상 동작하고 요청 시에도 에러 없이 정상 동작합니다. 원래 이렇게 경고 문구가 코드 상에 나타나는 게 정상인가요?