본문 바로가기

Spring Study/MVC 패턴14

[MVC 패턴] API 예외 처리 API 예외 처리 - 스프링 부트 기본 오류 처리 @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {} @RequestMapping public ResponseEntity error(HttpServletRequest request) {} - errorHtml(): produces = MediaType.TEXT_HTMl_VALUE: 클라이언트 요청의 Accept 헤더 값이 text/html인 경우에는 errorHtml()을 호출해서 view를 제공한다. - error(): 그 외 경우에 호출되고 Resp.. 2023. 9. 4.
[MVC 패턴] 예외 처리와 오류 페이지 서블릿 예외 처리 1. Exception(예외) 2. response.sendError(HTTP 상태코드, 오류 메시지) Exception(예외) 1. 자바 직접 실행 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행된다. 실행 도중 예외를 잡지 못하고 처음 실행한 main 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드는 종료된다. 2. 웹 어플리케이션 웹 어플리케이션은 사용자 요청별로 별로의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 컨트롤러(예외 발생) → 인터셉터 → 서블릿 → 필터 → WAS package hello.exception.servlet; import lombok.extern.slf4j.Slf4j; import org.spring.. 2023. 9. 1.
[MVC 패턴] 로그인 처리2 - 필터, 인터셉트 서블릿 필터 필터흐름 HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러 필터 제한 HTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러 //로그인 사용자 HTTP 요청 → WAS → 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) //비 로그인 사용자 필터에서 적절하지 않은 요청이라고 판단하면 필터에서 끝을 낼 수 있다. 따라서 로그인 여부를 체크하기 좋다. 필터 체인 HTTP 요청 → WAS → 필터1 → 필터2 → 필터3 → 서블릿 → 컨트롤러 필터는 체인으로 구성되며, 중간에 필터를 자유롭게 추가할 수 있다. 필터 인터페이스 public interface Filter { public default void init(FilterConfig filterConfig) throws Servl.. 2023. 8. 31.
[MVC 패턴] 로그인 처리1 - 쿠키, 세션 로그인 처리하기 - 쿠키 사용 로그인 상태를 유지하기 위한 방법에는 쿼리 파라미터를 계속 유지하면서 보내는 방법이 있다. 하지만 이 방법은 매우 어렵고 번거로운 작업이기 때문에 쿠키를 사용한다. 서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달 후 브라우저는 해당 쿠키를 지속해서 보내준다. 쿠키 종류 쿠키에는 영속 쿠키와 세션 쿠키가 존재한다. 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지 브라우저 종료시 로그아웃 되길 원하므로, 세션 쿠키가 필요하다. 쿠키 생성 로직 //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료) Cookie idCookie = new Cookie("memberId".. 2023. 8. 29.
[MVC 패턴] 검증2 - Bean Validation Bean Validation - Bean Validation은 특정한 구현체가 아닌 Bean Validation 2.0(JSR-380)이라는 기술 표준이다. - 검증 애노테이션과 여러 인터페이스의 모음이다. 스프링 MVC에서 Bean Validator 사용하는 방법 스프링 부트가 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 Bean Validator를 인지하고 스프링에 통합한다. implementation 'org.springframework.boot:spring-boot-starter-validation' Bean Validation 애노테이션 적용 코드 package hello.itemservice.domain.item; import lombok.Data; im.. 2023. 8. 24.
[MVC 패턴] 검증1 - Validation 컨트롤러의 중요한 역할 중 하나는 HTTP 요청이 정상인지 검증하는 것이다. * 클라이언트 검증, 서버검증 클라이언트 검증은 조작할 수 있으므로 보안에 취약하다. 서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다. 둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수이다. API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨주어야 한다. 상품 등록 검증 코드 @PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { //검증 오류 결과를 보관 Map errors = new HashMap(); //.. 2023. 8. 24.
[MVC 패턴] 메시지, 국제화 메시지 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 의미한다. 사용 예시 messages.properties라는 메시지 관리용 파일을 생성 item=상품 item.id=상품 ID item.itemName=상품명 item.price=가격 item.quantity=수량 각 HTML에서 다음과 같이 해당 데이터를 key 값으로 불러서 사용 국제화 messages.properties를 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다. 사용 예시 messages_en.properties item=Item item.id=Item ID item.itemName=Item Name item.price=price item.quantity=quantity messages_ko.properties item=상품 i.. 2023. 8. 22.
[MVC 패턴] 타임리프 (Thymeleaf) - 스프링 통합과 폼 스프링 통합으로 추가되는 기능들 - 스프링의 SpringEL 문법 통합 - ${@myBean.doSomething()} 스프링 빈 호출 지원 - 편리한 폼 관리를 위한 추가 속성 th:object (기능 강화, 폼 커맨드 객체 선택) th:field, th:errors, th:errorclass - 폼 컴포넌트 기능 checkbox, radio button, List 등을 편리하게 사용할 수 있는 기능 지원 - 스프링 메시지, 국제화 기능의 편리한 통합 - 스프링의 검증, 오류 처리 통합 - 스프링의 변환 서비스 통합 (ConversionSerivce) 입력 폼 처리 - th:object : 커맨드 객체를 지정한다 - *{. . .}: 선택 변수 식이라고 한다. th:object에서 선택한 객체에 접근한.. 2023. 8. 18.
[MVC 패턴] 타임리프 (Thymeleaf) 타임리프 (Thymeleaf) 타임리프는 컨트롤러가 전달하는 데이터를 이용해 동적으로 화면을 만들어주는 역할을 하는 뷰 템플릿 엔진이다. 타임리프 특징 서버 사이드 HTML 렌더링 (SSR) - 타임리프는 백엔드 서버에서 HTML을 동적으로 렌더링하는 용도로 사용된다. 내츄럴 템플릿 - 타임리프는 순수 HTML을 최대한 유지하려는 특징이 있다. - 순수 HTML을 그대로 유지하면서 뷰 템플릿도 사용할 수 있는 타임리프의 특징을 의미한다. 스프링 통합 지원 - 타임리프는 스프링과 자연스럽게 통합되고, 스프링의 다양한 기능을 편리하게 사용할 수 있게 지원한다. 타임리프 기본 기능 타임리프 사용 선언 기본 표현식 간단한 표현: 변수 표현식: ${. . .} 선택 변수 표현식: *{. . .} 메시지 표현식: .. 2023. 8. 16.
[MVC 패턴] MVC 기본 기능 로깅 (Logging) 운영 시스템에서는 System.out.println() 보다는 별도의 로깅 라이브러리를 사용해 로그를 출력한다. 로그 선언 방법 (3가지) private Logger log = LoggerFactory.getLogger(getClass()); private static final Logger log = LoggerFactory.getLogger(Xxx.class) @Slf4j //Lombok 사용 로그 호출 방법 log.info("hello") log.info("info log={}", name); 로그 사용시 장점 - 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다. - 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버.. 2023. 8. 15.