본문 바로가기

Programming/스프링

(17)
[김영한 스프링 MVC 2] 예외 처리와 오류 페이지 서블릿 예외 처리  시작 순수 서블릿 컨테이너가 예외 처리하는 방법  1. Exception (예외) 1) 자바 직접 실행자바의 메인 메서드를 직접 실행하면 main이라는 이름의 스레드가 실행된다. 실행 중 main 메서드를 넘어 예외가 던져지면, 예외 정보를 남기고 해당 스레드가 종료된다. 2) 웹 애플리케이션웹 애플리케이션은 사용자 요청별로 별도의 스레드가 할당되고, 서블릿 컨테이너 안에서 실행된다.애플리케이션에서 예외를 잡지 못해 서블릿 밖으로까지 예외가 전달되면 하단의 과정을 거친다.WAS   WAS로 예외 전달됐을 때 처리 예시@Controllerpublic class ServletExController { @GetMapping("/error-ex") public void errorE..
[김영한 스프링 MVC 2] 로그인 처리2 - 필터, 인터셉터 서블릿 필터 모든 url 접근하기 전, 로그인 여부 확인이 필요함 (로그인 인증)=> 공통 관심사  공통 관심사는 스프링의 AOP로도 해결 가능하지만, 웹과 관련된 공통 관심사는 서블릿 필터/스프링 인터셉터을 권장한다.=> HttpServletRequest  통해 HTTP의 헤더나 URL의 정보 습득 가능하기 때문※ 공통 관심사 : 애플리케이션 여러 로직에서 공통으로 관심이 있는 것  흐름HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 필터 적용 시 필터 호출 후 서블릿이 호출된다필터에 URL 패턴을 적용할 수 있다 ex) /* : 모든 요청에 필터 적용 ※ 스프링 사용 시, 서블릿 = 스프링의 디스패처 서블릿  제한HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 //로그..
logback-spring.xml로 로그 설정하기 (+ log rotate) 참고 더보기 http://guide.ustraframework.kro.kr/ref-doc/02/1IcYIF1zbZEwvl6CKZFQ https://developer-heo.tistory.com/17 https://ckddn9496.tistory.com/79 Dependency 설정 implementation 'org.slf4j:slf4j-api:2.0.6' implementation 'ch.qos.logback:logback-classic:1.4.5' logback-spring.xml 기본 문법 xml 규칙 대부분 따름 camelCase 권장 foo.log %date %level [%thread] %logger{10} [%file : %line] %msg%n %d{HH:mm:ss.SSS} [%thread..
[김영한 스프링 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..