분류 전체보기 (260) 썸네일형 리스트형 [김영한 스프링 MVC 2] 로그인 처리1 - 쿠키, 세션 로그인 요구사항 요구사항 홈 화면 - 로그인 전 회원 가입 로그인 홈 화면 - 로그인 후 본인 이름 (00님 환영합니다.) 상품 관리 로그 아웃 보안 요구사항 로그인 사용자만 상품에 접근하고, 관리 가능 (미로그인 시 상품 관리에 접근하면 로그인 화면으로 이동) 회원 가입, 상품 관리 패키지 구조 설계 hello.login - domain - item - member - login - web - item - member - login ★ 도메인이 가장 중요 도메인 = 화면, UI, 기술 인프라 등을 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역 web을 다른 기술로 바꾸어도 도메인은 그대로 유지할 수 있어야 함 => web은 domain을 의존하지만, domain은 web을 의존하지 않음 => .. [김영한 스프링 MVC 2] 검증2 - Bean Validation 소개 Bean Validation public class Item { private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull @Max(9999) private Integer quantity; //... } 어노테이션으로 검증 로직 편리하게 적용 가능 Bean Validation => 특정한 구현체 X, Bean Validation 2.0(JSR-380)이라는 기술 표준 O => 검증 애노테이션과 여러 인터페이스의 모음 (일반적으로 사용하는 구현체 => 하이버네이트 Validator) 관련 링크 공식 사이트: http://hibernat.. [김영한 스프링 MVC 2] 검증1 - Validation 검증 요구사항 요구사항 - 검증 로직 추가 1. 타입 검증 가격, 수량에 문자가 들어가면 검증 오류 처리 2. 필드 검증 상품명: 필수, 공백X 가격: 1000원 이상, 1백만원 이하 수량: 최대 9999 3. 특정 필드의 범위를 넘어서는 검증 가격 * 수량의 합은 10,000원 이상 서버 검증 폼 입력시 오류 발생할 때, 고객 데이터 유지한 채로 어떤 오류가 발생했는지 친절하게 알려줘야 함 컨트롤러 => HTTP 요청이 정상인지 검증해야 함 클라이언트 검증은 조작할 수 있어 보안에 취약 서버만으로 검증하면 즉각적인 고객 사용성이 부족 ∴ 클라이언트 & 서버 검증 모두 사용하되, 최종적으로 서버 검증은 필수 ∴ API 방식 => API 스펙을 잘 정의해 API 응답 결과에 검증 오류사항을 잘 남겨야 함 .. [김영한 스프링 MVC 2] 타임리프 - 스프링 통합과 폼 타임리프 스프링 통합 기본 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 스프링 통합 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 스프링 통합 시 추가되는 기능들 1. 스프링의 SpringEL 문법 통합 2. 스프링 빈 호출 지원 ${@myBean.doSomething()} 3. 편리한 폼 관리를 위한 추가 속성 th:object (기능 강화, 폼 커맨드 객체 선택) th:field , th:errors , th:errorclass 4. 폼 컴포넌트 기능 checkbox, radio button, List 등을 편리하게 사용하는 기능 지원 5. 스프.. [김영한 스프링 MVC 2] 타임리프 - 기본 기능 타임리프 공식 사이트: https://www.thymeleaf.org/ 공식 메뉴얼 - 기본 기능 : https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 공식 메뉴얼 - 스프링 통합 : https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 특징 서버사이드 HTML 렌더링 (SSR) 백엔드 서버에서 HTML을 동적으로 렌더링 내추럴 템플릿 순수 HTML을 유지해서 웹 브라우저에서 파일을 직접 열어도 내용 확인 가능 + 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과 확인 가능 스프링 통합 지원 스프링과 자연스럽게 통합되고 스프링의 다양한 기능 편리하게 사용 가능 기본 기능 사용.. [김영한 스프링 MVC 1] 스프링 MVC - 웹 페이지 만들기 요구사항 분석 상품 도메인 모델 상품 ID 상품명 가격 수량 상품 관리 기능 상품 목록 상품 상세 상품 등록 상품 수정 서비스 제공 흐름 백엔드 개발자: 디자이너, 웹 퍼블리셔를 통해서 HTML 화면이 나오기 전까지 시스템을 설계하고, 핵심 비즈니스 모델 개발 이후 HTML이 나오면 뷰 템플릿으로 동적 변환, 웹 화면 흐름 제어 ※ 웹 프론트엔드 개발자가 별도로 있으면, 웹 프론트엔드 개발자가 웹 퍼블리셔 역할까지 포함해서 하는 경우도 있음 웹 프론트엔드 개발자 => HTML을 동적으로 만들고 웹 화면의 흐름을 담당 백엔드 개발자 => HTTP API를 통해 웹 클라이언트가 필요로 하는 데이터와 기능을 제공 상품 도메인 개발 Item package hello.itemservice.domain.item; .. [김영한 스프링 MVC 1] 스프링 MVC - 기본 기능 로깅 운영 시스템 => 로깅 라이브러리 사용해 로그 출력 (SLF4J 라이브러리 => Logback, Log4J 등 라이브러리 통합해 인터페이스로 제공) 로그 선언 private Logger log = LoggerFactory.getLogger(getClass()); private static final Logger log = LoggerFactory.getLogger(Xxx.class) @Slf4j LogTestController package hello.springmvc.basic; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.b.. [김영한 스프링 MVC 1] 스프링 MVC - 구조 이해 스프링 MVC 전체 구조 직접 만든 MVC 프레임워크 - 실제 스프링 MVC 구조 비교 FrontController → DispatcherServlet handlerMappingMap → HandlerMapping MyHandlerAdapter → HandlerAdapter ModelView → ModelAndView viewResolver → ViewResolver MyView → View DispatcherServlet 스프링 MVC의 핵심 DispacherServlet => 부모 클래스에서 HttpServlet을 상속받아 사용, 서블릿으로 동작 (DispatcherServlet → FrameworkServlet → HttpServletBean → HttpServlet) 스프링 부트는 Dispache.. [김영한 스프링 MVC 1] MVC 프레임워크 만들기 프론트 컨트롤러 패턴 소개 프론트 컨트롤러 도입 전 프론터 컨트롤러 도입 후 특징 프론트 컨트롤러 서블릿 하나로 클라이언트 요청 받음 → 프론트 컨트롤러가 요청에 맞는 컨트롤러 찾아 호출함 공통 처리 → 나머지 컨트롤러들은 서블릿 사용하지 않아도 됨 스프링 웹 MVC 스프링 웹 MVC의 DispatcherServlet => 프론트 컨트롤러 패턴으로 구현됨 프론트 컨트롤러 도입 ControllerV1 package hello.servlet.web.frontcontroller.v1; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRespo.. [김영한 스프링 MVC 1] 서블릿, JSP, MVC 패턴 회원 관리 웹 애플리케이션 요구사항 회원 정보 나이 : age 이름 : username 기능 요구사항 회원 저장, 회원 목록 조회 클래스 회원 도메인 모델 package hello.servlet.domain.member; import lombok.Getter; import lombok.Setter; @Getter @Setter public class Member { private Long id; // 회원 저장소에서 id 할당시킴 private String username; private int age; public Member() { } public Member(String username, int age) { this.username = username; this.age = age; } } 회원 저장.. 이전 1 2 3 4 5 6 7 ··· 26 다음