인프런145 11) 로그인처리 - 쿠키, 세션 직접 개발,적용해보기(개념단계) 프로젝트 패키지 구조 domain item memeber login web item memeber login 도메인 도메인이 가장 중요하다. 도메인 = 화면, UI, 기술 인프라 등등의 영역을 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함 WEB 과 도메인이 나눠져있는 이유 향후 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 한다. 이렇게 하려면 web은 domain을 알고있지만 domain은 web을 모르도록 설계해야 한다. 이것을 web은 domain을 의존하지만, domain은 web을 의존하지 않는다고 표현한다. 예를 들어 web 패키지를 모두 삭제해도 domain에는 전혀 영향이 없도록 의존관계를 설계하는 것이 중요하다. 반대로 이야기하면 domain은 web을.. 인프런/스프링 MVC 2편 2023. 2. 6. 10) Bean Validation, @Validated(@Valid) ,프로젝트 (V3~V4) 검증 기능을 지금처럼 매번 코드로 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다 이전에 Validaotor(검증기)를 만들면서 컨트롤러를 깔끔하게 만들었는데 하지만 Validator 내부코드는 좀 지저분하고, 반복적인 검증이 많다. @Component //스프링빈에 등록시켜서 컨트롤러에서 쉽게 가져다 쓰기위함 public class ItemValidator implements Validator { @Override public boolean supports(Class clazz) { return Item.class.isAssignableFrom(clazz); //매개변수로 들어오는 클래스타입과 ite.. 인프런/스프링 MVC 2편 2023. 2. 5. 9) Validator , @Validated (@Valid) 검증로직 Validator를 만들어서 분리 복잡한 검증 로직을 별도로 분리하자. 컨트롤러에서 검증 로직이 차지하는 부분은 매우 크다. @PostMapping("/add") public String addItemV4(@ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model) { if (bindingResult.hasErrors()) { log.info("erros = {}", bindingResult); // log.info("model ={}", model); return "validation/v2/addForm"; } log.info("objectName={}", bin.. 인프런/스프링 MVC 2편 2023. 2. 4. 8)Validation(검증) , 오류 코드와 메시지처리 (4 ~ 6) 우선 테스트 코드로 MessageCodesResolver를 알아보자. MessageCodesResolver는 인터페이스이고 안의 메소드를 보면 주어진 에러코드와 필드설명을 받아서 에러코드들 (String[]) 을 반환해준다. 필드에러의 코드리스트를 만드는데 사용된다고 한다. ObjectError 테스트 Object Error는 객체의 에러인데 그 객체의 필드에러를 넘어서는 복합적인 에러를 만들때 생성해서 bindingResult에 담아둔다. public class MessageCodesResolverTest { MessageCodesResolver codesResolver = new DefaultMessageCodesResolver(); // 구현체는 DefaultMessageCodesResolver를 .. 인프런/스프링 MVC 2편 2023. 2. 3. 7) Validation (검증) , 프로젝트 (V1 ~V2) ,오류 코드와 메시지처리 (1~3) 검증 요구사항 지금까지 만든 웹 애플리케이션은 폼 입력시 숫자를 문자로 작성하거나해서 검증 오류가 발생하면 오류 화면으로 바로 이동한다. 이렇게 되면 사용자는 처음부터 해당 폼으로 다시 이동해서 입력을 해야 한다. 아마도 이런 서비스라면 사용자는 금방 떠나버릴 것이다. 웹 서비스는 폼 입력시 오류가 발생하면, 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 친절하게 알려주어야 한다. 에러뜨면 이동하는 화면은 아래 페이지를 말하는것이다. 컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이다. 그리고 정상 로직보다 이런 검증 로직을 잘 개발하는 것이 어쩌면 더 어려울 수 있다. 검증 직접 처리 고객이 상품 등록 폼에서 상품명을 입력하지 않거나, 가격, 수량 등이 너무 작거나 .. 인프런/스프링 MVC 2편 2023. 2. 3. 6) 메시지 ,국제화 메시지 기획자가 화면에 보이는 문구가 마음에 들지 않는다고, 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 하면 어떻게 해야할까? 여러 화면에 보이는 상품명, 가격, 수량 등, label 에 있는 단어를 변경하려면 그게 존재하는 뷰템플릿으로 가서 모두 수정해줘야한다. 화면 수가 적으면 문제가 되지 않지만 화면이 수십개 이상이라면 수십개의 파일을 모두 고쳐야 한다. 왜냐하면 해당 HTML 파일에 메시지가 하드코딩 되어 있기 때문이다. 이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다. 국제화 메시지에서 한 발 더 나가보자. 메시지에서 설명한 메시지 파일( messages.properties )을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다. 예를 들어서 다음과 같이.. 인프런/스프링 MVC 2편 2023. 2. 2. 5)타임리프 - 라디오버튼,셀렉트박스 라디오버튼 라디오 버튼은 여러 선택지 중에 하나를 선택할 때 사용할 수 있다. 이번시간에는 라디오 버튼을 자바 ENUM을 활용해서 개발해보자. @ModelAttribute를 이용해서 컨트롤러의 모든 메소드의 모델에 값을 넣자 @ModelAttribute("itemTypes") public ItemType[] itemTypes() { return ItemType.values(); // // enum.values를 하면 저장되어있는 값들을 배열로 넘겨준다. } enum타입은 .values()로 값들을 가져올 수 있따. 상품 종류 BOOK itemTypes 데이터로 받아온 enum배열을 하나씩 type에 저장한다. th:field에 Item.itemType을 넣는다. th:value에는 type.name()을.. 인프런/스프링 MVC 2편 2023. 2. 2. 4)타임리프 적용,체크박스,멀티체크박스 타임리프 타임리프는 크게 2가지 메뉴얼을 제공한다. 기본 메뉴얼 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 타임리프 + 스프링 (스프링 통합 메뉴얼) https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위한 다양한 기능을 편리하게 제공한다. 그리고 이런 부분은 스프링으로 백엔드를 개발하는 개발자 입장에서 타임리프를 선택하는 하나의 이유가 된다. 설정방법 https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html#the-springstandard-dialect h.. 인프런/스프링 MVC 2편 2023. 2. 2. 3) 타임리프 (블록 , 자바스크립트 인라인 , 템플릿 조각, 템플릿 레이아웃) 블록 타임리프의 유일한 자체 태그 블록 테스트 컨트롤러 @GetMapping("/block") public String block(Model model) { addUsers(model); return "basic/block"; } private void addUsers(Model model) { List list = new ArrayList(); list.add(new User("userA", 10)); list.add(new User("userB", 20)); list.add(new User("userC", 30)); model.addAttribute("users", list); } 모델에 리스트를 넣어 뷰를 렌더링한다. 뷰 템플릿 사용자 이름1 사용자 나이1 요약 위의 코드를 보면 th:each를 통.. 인프런/스프링 MVC 2편 2023. 2. 1. 2)타임리프 (리터럴,연산,속성값설정,반복,조건부 평가,주석) 리터럴 리터럴은 소스 코드상에 고정된값을 말하는 용어이다. 예시를 보면 hello는 소문자가 연속된 문자이므로 작음 따옴표를 생략할 수 있다. 리터럴 테스트 컨트롤러 @GetMapping("/literal") public String literal(Model model) { model.addAttribute("data", "Spring!"); return "basic/literal"; } 뷰 템플릿 'hello' + ' world!' = 'hello world!' = 'hello ' + ${data} = 리터럴 대체 |hello ${data}| = 리터럴 끼리 더하는연산도 가능하고, 리터럴과 변수를 더하는것도 가능하다. 마지막에 리터럴 대체문자를 이용해서, 합치는 예시인데 작은 따음표도 필요없고, 공백도.. 인프런/스프링 MVC 2편 2023. 2. 1. 1)타임리프 - 기본기능 (escape,unescape,스프링EL표현법,지역변수,기본객체,유틸리티객체,날짜객체,url링크) 패키지 네임에 - 라는 기호가 안들어가게 주의해야한다! 타임리프 Documentation - Thymeleaf Articles Quick glimpses into what Thymeleaf can bring to your project. Introductions With Spring Comparisons www.thymeleaf.org 타임리프 공식문서 타임리프 사용 선언 타임리프 기본 표현식 타임리프 표현식보는 공식문서 Tutorial: Using Thymeleaf 1 Introducing Thymeleaf 1.1 What is Thymeleaf? Thymeleaf is a modern server-side Java template engine for both web and standalone envi.. 인프런/스프링 MVC 2편 2023. 1. 30. 끝)리다이렉트(RedirectAttributes),PRG 패턴(Post/Redirect/Get) 상품 수정 폼 컨트롤러 BasicItemController에 추가 상품 수정폼 이동 메소드 @GetMapping("/{itemId}/edit") //상품수정 폼으로 이동 public String editForm(@PathVariable Long itemId, Model model) { //수정하는 화면에서 상품내용이 보여야하므로 상품아이디를 받아 상품을 찾는다. Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/editForm"; } 상품 ID 상품명 가격 수량 상품 수정폼 이동url과 내용수정하는 url를 method만 다르게해서 구성할것이다. 그래서 th:action을 아무것도 주지않아.. 인프런/스프링 MVC 1편 2023. 1. 30. 이전 1 ··· 5 6 7 8 9 10 11 ··· 13 다음