분류 전체보기 1341

Ch04. 검증(Validation) - 검증 직접 처리

상품 저장 성공 상품 저장 실패 고객의 검증에 올바르지 않은 데이터를 입력하게 된다면 리다이렉트 하는 것이 아닌 다시 상품 등록 폼을 보여주고 어떠한 값이 잘못 입력했는지를 알려주어야 한다 검증 직접 처리 Item을 등록 시 동작하는 Controller에 검증 로직을 추가한다. @PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { //검증 오류 결과를 보관 Map errors = new HashMap(); //검증 로직 if(!StringUtils.hasText(item.getItemName())){ errors.put("itemName"..

Ch04. 검증(Validation) - 검증 요구사항

요구사항: 검증 로직 추가 타입 검증 가격, 수량에 문자가 들어가면 검증 오류 처리 필드 검증 상품명: 필수, 공백 X 가격: 1000원 이상, 1백만 원 이하 수량: 최대 9999 특정 필드의 범위를 넘어서는 검증 가격 * 수량의 합은 10,000원 이상 지금까지 만든 웹 애플리케이션은 폼 입력 시 숫자를 문자로 작성하거나해서 검증 오류가 발생하면 오류 화면으로 바로 이동한다. 이렇게 되면 사용자는 처음부터 해당 폼으로 다시 이동해서 입력을 해야 한다. 아마도 이런 서비스라면 사용자는 금방 떠나버릴 것이다. 웹 서비스는 폼 입력시 오류가 발생하면, 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 친절하게 알려주어야 한다 컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것..

Ch03. 메시지, 국제화 - 웹 애플리케이션에 국제화 적용하기

messages_en.properties 추가 label.item=Item label.item.id=Item ID label.item.itemName=Item Name label.item.price=price label.item.quantity=quantity page.items=Item List page.item=Item Detail page.addItem=Item Add page.updateItem=Item Update button.save=Save button.cancel=Cancel 빌드. 베포 과정 없이 HTTP Header의 언어의 우선순위만 변경해 주면 메시지가 변경이 된다.. Accept-Language는 클라이언트가 서버에 기대하는 언어 정보를 담아서 요청하는 HTTP 요청 헤더이다 스프..

Ch03. 메시지, 국제화 - 웹 애플리케이션에 메시지 적용하기

messages.properties에 화면에 보여줄 메시지 적기 label.item=상품 label.item.id=상품 ID label.item.itemName=상품명 label.item.price=가격 label.item.quantity=수량 page.items=상품 목록 page.item=상품 상세 page.addItem=상품 등록 page.updateItem=상품 수정 button.save=저장 button.cancel=취소 HTML 수정하기 addForm.html 상품 등록 폼 상품명 가격 수량 상품 등록 취소 editForm.html 상품 수정 폼 상품 ID 상품명 가격 수량 저장 취소 item.html 상품 상세 상품 ID 상품명 가격 수량 상품 수정 목록으로 items.html 상품 목록 상..

Ch03. 메시지, 국제화 - 스프링 메시지 소스 사용

@SpringBootTest public class MessagesSourceTest { @Autowired MessageSource ms; @Test public void helloMessage() throws Exception{ String result = ms.getMessage("hello", null, null); assertThat(result).isEqualTo("안녕"); } @Test public void notFoundMessageCode() throws Exception{ assertThatThrownBy(()->ms.getMessage("no_code", null, null)) .isInstanceOf(NoSuchMessageException.class); } @Test public..

Ch03. 메시지, 국제화 - 스프링 메시지 소스 설정

스프링은 기본적인 메시지 관리 기능을 제공한다. 메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하면 되는데, MessageSource는 인터페이스이다. 따라서 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록하면 된다 @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages", "errors"); messageSource.setDefaultEncoding("utf-8"); return messageSo..

Ch02. 타임리프(스프링 통합과 폼) - 셀렉트 박스

Controller Model 추가 @ModelAttribute("deliveryCodes") public List deliveryCodes(){ List deliveryCodes = new ArrayList(); deliveryCodes.add(new DeliveryCode("FAST", "빠른 배송")); deliveryCodes.add(new DeliveryCode("NORMAL", "일반 배송")); deliveryCodes.add(new DeliveryCode("SLOW", "느린 배송")); return deliveryCodes; } AddForm.html, EditForm.html 배송 방식 ==배송 방식 선택== FAST item.html 배송 방식 ==배송 방식 선택== FAST sele..

Ch02. 타임리프(스프링 통합과 폼) - 라디오 버튼

@ModelAttribute("itemTypes") public ItemType[] itemTypes(){ return ItemType.values(); //Enum의 모든 정보를 받을수 있다 } 상품 종류 BOOK 상품 종류 BOOK ItemType.values()를 사용하면 해당 ENUM의 모든 정보를 배열로 반환한다. 체크 박스는 수정시 체크를 해제하면 아무 값도 넘어가지 않기 때문에, 별도의 히든 필드로 이런 문제를 해결했다. 라디오 버튼은 이미 선택이 되어 있다면, 수정 시에도 항상 하나를 선택하도록 되어 있으므로 체크 박스와 달리 별도의 히든 필드를 사용할 필요가 없다. 타임리프에서 ENUM 직접 사용하기 스프링EL 문법으로 ENUM을 직접 사용할 수 있다. ENUM에 values()를 호출하..

Ch02. 타임리프(스프링 통합과 폼) - 체크 박스(멀티)

ModelAttribute Method Level @ModelAttribute("regions") //해당 값을 사용하는 곳에서 모두 써줘야 하므로 중복이된다. //이를 해결하기위해 특별한 기능 제공 public Map regions(){ //모든 컨트롤러에 해당 값을 전달해준다 Map regions = new LinkedHashMap(); //map 순서를 보장 //성능상 static 으로 해서 한번만 호출해 주는것이 좋다 regions.put("SEOUL", "서울"); regions.put("BUSAN", "부산"); regions.put("JEJU", "제주"); return regions; } 각각의 컨트롤러에서 model.addAttribute(...)을 사용해서 체크 박스를 구성하는 데이터를..

Ch02. 타임리프(스프링 통합과 폼) - 체크박스(단일)

체크 박스 추가(addForm.html) 판매 여부 판매 오픈 값이 잘 전송되는지 Log를 찍어보자 체크가 되어 있을 경우 True가 전달된다. 체크가 되어 있지 않을 경우? false를 기대하지만, null 값이 전달이 된다. HTML checkbox는 선택이 안되면 클라이언트에서 서버로 값 자체를 보내지 않는다. 수정의 경우에는 상황에 따라서 이 방식이 문제가 될 수 있다. 사용자가 의도적으로 체크되어 있던 값을 체크를 해제해도 저장 시 아무 값도 넘어가지 않기 때문에, 서버 구현에 따라서 값이 오지 않은 것으로 판단해서 값을 변경하지 않을 수도 있다 Spring은 이러한 문제를 해결하기 위해 약간의 트릭을 제공(_체크박스 명) 히든 필드를 하나 만들어서, _open 처럼 기존 체크 박스 이름 앞에 ..