목록프로그래밍 (408)
쌓고 쌓다
앞서 작성한 bindingResult를 보자. bindingResult.addError(new ObjectError("poster", null, null, "조건: 키와 몸무게 합은 150이상.")); ObjectError 객체를 생성하는데 번거로움이 있다. 이것을 더 간략히 해보자. BindingResult 파라미터의 위치는 @ModelAttribute 뒤에 위치한다. 그러므로 앞서 작성한 ObjectError 객체 생성에 objectName인 "poster"를 작성할 필요가 있을까? 그렇다. BindingResult는 검증할 객체를 알고 있다. log.info("objectName={}", bindingResult.getObjectName()); log.info("target={}", bindingR..
MessageCodesResolver? 그게 뭔데 errors.properties #Level1 required.item.itemName=상품 이름은 필수입니다. #Level2 required=필수 값 입니다. "required" 에러 코드(errorCode)를 만들때 "required.item.itemName"처럼 메시지를 세밀하게 만들 수 있고 "required"처럼 메시지를 단순화하여 사용할 수 있다. 단순화한 메시지는 넓게 사용이 가능하나. 세밀한 메시지는 좁은 범위에서 사용이된다. 즉, 에러 코드만으로 좁은 범위에서 넓은 범위로 메시지를 찾으며 우선순위에 맞춰 메시지를 찾아 사용할 수 있다. 스프링은 MessageCodesResolver가 위의 우선순위에 맞춰 메시지를 찾는 기능을 제공한다. M..
굳이 BindingResult의 에러 메시지를 매번 입력하지 않고 properties로 관리하는 이유가 있다. 예를 들어. 어떤 곳에서는 "설명을 입력해주세요.", 또 어떤 곳에서는 "설명을 입력하세요", "설명은 필수입니다." 와 같이 일관성 없는 메시지를 통일하여 관리할 수 있다는 장점이 있다. application.properties spring.messages.basename=messages, errors 기본은 spring.messages.basename=messages이나 errors를 추가. messages는 메시지, 국제화에 사용하는 properties이었다. 여기에 에러 메시지를 위한 properties 추가. error.properties required.item.itemName=상품 ..
기존에 @Valid로 유효성 검사를 했으나 이번에 배운 BindingResult를 적용해보고자 다시 수정해보았다. 글로벌 에러와 타입 에러를 적용해보고자 뜬금 없지만 게시글 작성시 키와 몸무게도 입력하게 바꿨다. 키와 몸무게 컬럼 추가 ALTER TABLE poster ADD height bigint; ALTER TABLE poster ADD weight bigint; BindingResult 사용 @PostMapping("/posters/{category}") public String write(@ModelAttribute Poster poster, BindingResult bindingResult){ if(poster.getHeight()!=null && poster.getWeight()!=null)..
폼에 데이터를 입력하여 서버에 전달했다. 이때 유효하지 않은 데이터가 있다면 다시 데이터를 작성할 필요가 있다. 이때 작성한 데이터는 유지하고 에러 내용을 같이 넘겨보자. 폼 데이터 유지 먼저 폼 데이터 유지 방법에 대해 보자. @GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); return "validation/v1/addForm"; } 입력 폼을 요청이 들어왔을때 입력 폼을 통해 바인딩할 빈 객체를 하나 생성해서 넣어준다. 이렇게 빈 객체를 왜 넣어줘야하나싶지만 유효성 검사나 재사용에 매우 좋은 효과를 얻을 수 있다. 입력 폼에서 th:object와 th:field로 많은 이점을 ..
공지사항 기능을 위해 공지사항 테이블을 따로 만들까, 게시글에 카테고리 컬럼을 추가할까... 이런저런 생각하다가 일단 상단 고정 기능부터 만들어봤다. Poster 클래스 fix 필드 추가 @Entity @Getter @Setter public class Poster { private Boolean fix; } 고정할 게시글인지 fix 필드로 구별한다. Poster 테이블 fix 컬럼 추가 alter table poster add fix boolean; -- BOOLEAN = tinyint(1) -- 고정할 게시글은 fix 컬럼의 0과 1로 구별한다. 게시글 작성 폼 체크박스로 게시글 고정 유무를 설정하다. 게시글 목록 HTML No title writer date ... 게시글 목록 출력 위에 반복문으로..
사용자에게 보이는 HTML 화면에 "상품명"이라는 단어를 모두 "상품 이름"으로 바꾸길 원한다. 하지만 "상품명"은 아래처럼 하드코딩되어 있다. 상품명 "상품명"을 "상품 이름"으로 바꾸길 원한다면 모든 파일을 하나하나 열어서 수정해야 한다. 이 문제를 해결할 좋은 메시지 기능이 있다. 이런 문자열 메시지를 한 곳에서 관리하는 것이다. resources 아래에 messages.properties로 관리 파일을 만들자. 그리고 아래의 내용을 작성해 보자. messages.properties label.item=상품 label.item.id=상품 ID label.item.itemName=상품명 Key와 Value 형식이다. {0}로 파라미터를 받을 수 있다. test.html TEST TEST 타임리프의 #..
@Data public class Item { private List regions; //등록 지역 } 아이템 클래스의 등록 지역(ex. 부산, 서울)을 가지는 필드가 있다. 이 필드를 다중 체크 박스를 통해 값을 넣어보자. @ModelAttribute("regions") public Map regions() { Map regions = new LinkedHashMap(); // HashMap은 순서가 보장안되나 LinkedHashMap은 보장됨 regions.put("SEOUL", "서울"); regions.put("BUSAN", "부산"); regions.put("JEJU", "제주"); return regions; } 컨트롤러에 @ModelAttribute를 메서드에 사용하여 어떤 메서드를 호출하더..