스프링 347

25. 메시지, 국제화 적용

messages.properties hello=안녕 hello.name=안녕 {0} 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=취소 타임리프 템플릿 상품 등록 폼 #{~} 이게 메시지 접근자임. 이렇게 하면 이제 저 messages.properties의 page.addItem을 가져옴. 상품 등록 폼 이렇게 인자넣기 가능. 함수처럼 쓰면 됨. message_en.properties hel..

24. 메시지, 국제화

메시지는 예를 들어, 우리가 상품명 : , 이런 단어들이 있다고 치자. 근데 만약 저걸 "상품이름 : " 이렇게 고치고 싶다면, 웹페이지가 수십개라면 힘들다. 일종의 공통 이름들을 message.properties라는 파일에 정의해둬서 변수처럼 사용할 수 있다. 양식은 #{클래스이름.변수이름} 국제화 위의 저걸 다 영단어로 바꾸면 끝. message_en.properties message_ko.properties 이 기능은 스프링에서 제공하는 추상체 MessageSource 기능을 사용하면 된다. 저걸 Bean에 등록해서 쓰면 된다. @Bean public MessageSource messageSource(){ ResourceBundleMessageSource messageSource = new Reso..

23. 셀렉트 버튼

@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; } 아 난 솔직히 이코드 마음에 안든다. 이런 분류적인건 Enum 썼으면 좋겠다. 이건 김영한 선생님도 언급했는데, 저렇게 하면 컨트롤러를 지날 때 마다 생성하기 때문에, 따로 싱글톤 등으로 해서 쓰는..

21. 멀티 체크박스

@ModelAttribute("regions") public Map regions(){ Map regions = new LinkedHashMap(); regions.put("SEOUL", "서울"); regions.put("BUSAN", "부산"); regions.put("JEJU", "제주"); return regions; } 이렇게 아예 컨트롤러에서 함수로 @ModelAttribute 만들어 두면 모든 컨트롤러 지날 때 저게 들어간다. 이것도 좀 비효율 적이기는 함. 싱글톤같은걸로 처리하는게 좋긴 함. 참고로 LinkedHashMap은 순서가 보장됨. 여튼 위의 "regions"라는 이름으로 return값, regions가 들어감. @Data public class Item { private Long..

20. 단일 체크박스

@PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes) { log.info("open = " + item.getOpen()); Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:/form/items/{itemId}"; } Post방식으로 /add로 들어올 시 수행 판매 오픈 원래 좀 문제가 있는 부분이, html에..

19. 기존 Item에 요구사항 추가.

현재 팔고 있는지 파는 지역 상품 종류 파는 타입 (쿠팡 로켓배송, 일반배송 등) @Data public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; private Boolean open; private List regions; private ItemType itemType; private String deliveryCode; public Item() { } public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.qu..

18. 스프링 타임리프 폼

@GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); return "form/addForm"; } 빈 값은 뭐 보여줄려고 넘기는 거다. 상품명 가격 수량 상품 등록 취소 th:object 커맨드 객체로 지정해 주는거다. 이거 하면 이제 *{} 이렇게 쓸 수 있다. 원래 보통 ${item.itemName} 이렇게 써야 하는데, 저게 커맨드 객체라서 *{itemName} 이렇게 쓰면 ${item.itemName} 이거랑 같다. 저건 자손포함 태그에 하나밖에 못 쓴다. th:field 이거는 th:field="${item.itemName}" 이렇게 해주면 id, name, value를 자동으..

16. 레이아웃 템플릿 확장

@GetMapping("/layoutExtend") public String layoutExtend(){ return "template/layoutExtend/layoutExtendMain"; } 메인 페이지 컨텐츠 메인 페이지 포함 내용 아예 html에 replace 해놨다. 레이아웃 H1 레이아웃 컨텐츠 레이아웃 푸터 레이아웃 템플릿에서 인자로 받아 특정 부분을 대체시킨다. 이건 뭐냐면 비슷한 형태의 웹페이지가 있을 때 특정 부분들은 양식을 지키면서 다른 콘텐츠나 이런 것들만 인자로 줘서 바꾸는 거다. 기본 틀이 있고 거기에 내가 필요한 부분만 태그로 구현해 놓은다음에 그것 부분만 인자로 넘기는. 물론 레이아웃에서도 그게 어디쪽으로 들어갈 지 구현을 해 놔야지. 뭐 조각이냐, 레이아웃이냐, 레이아웃 ..