-
자바&파이썬 웹애플리케이션 전문가 양성과정 채용연계형 교육과정 45일차
KT 자바교육 후기 (2021-07-22 ~ 2021-12-06)
2021-09-30
Application 예외처리
WebApplication 에서 예외가 발생했을 경우의 화면
WebApplication 에 존재하지 않는 페이지를 호출했을 때의 화면
Application 의 민감한 정보 (예외가 발생한 상황, 예외 메시지, 패키지 구조, SQL등)가 그대로 노출됨
Application 예외를 처리하는 전통적인 방법
사용자에게 보여질 Custom Error 페이지 작성
상황별 예외 페이지 작성 (web.xml)
@ControllerAdvice("com.hello")
@Controller와 동일한 역할 수행
“com.hello” 패키지 이하에서 catch 되지 않는 Exception 발생 시 해당 클래스 동작함.
Spring이 관리할 대상이기 때문에 applicationContext.xml에 등록 필요
@ExceptionHandler(RuntimeException.class)
@RequestMapping과 동일한 역할 수행
발생한 Exception 이 RuntimeException 일 경우 해당 메소드 동작함
Transaction / AOP
Service Logic (혹은 Business Logic) 실행 시 Exception 발생할 때, Database 변경 사항 Rollback이 필요.
간단한 설정(AOP)으로 Rollback 혹은 Commit 처리를 수행할 수 있도록 지원함.
AOP (Aspect Oriented Programming)
관점 지향 프로그래밍
특정 패키지 또는 클래스 내에서 특정 상황이 발생했을 때, 외부 코드가 자동으로 개입함.
메소드안의 주기능과 보조 기능을 분리한 후 선택적으로 메소드에 적용해서 사용한다는 개념
필요 Dependency 추가
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${org.aspectj-version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>${org.aspectj-version}</version> </dependency>
트랜잭션 설정 (action-mybatis.xml)
action-mybatis.xml > Namespaces > tx, aop 체크
파라미터 검증 (Validation Check)
웹 개발에서 입력 폼의 값이 올바른지 검증하는 것은 매우 중요한 작업.
요청 파라미터의 값을 확인하지 않고 그대로 사용했을 때 데이터베이스 등에 잘못된 데이터가 들어갈 가능성이 높아져 시스템의 신뢰도가 떨어짐.
요청 파라미터 값을 검사할 때에는 크게 두 가지 방법을 이용함.
웹 브라우저 : 자바스크립트를 이용해서 데이터를 웹 서버에 전송하기 전에 미리 검사함.
웹 서버 : 전달받은 요청 파라미터의 값을 검사함. 파라미터 값이 올바르지 않을 경우 에러 코드를 응답하거나 재입력을 위한 폼 화면을 웹 브라우저에 전송함.
웹 브라우저에서 자바 스크립트를 이용해서 폼 값을 검사하는 것은 사용자에게 빠르게 검사 결과를 보여줄 수 있기 때 문에 사용자 입장에서 매우 중요하다.
하지만, 악의적으로 잘못된 데이터를 서버에 전송하거나 클라이언트에서 완전히 값을 검증하지 못할 수도 있기 때문 에, 서버에서도 반드시 값을 검증해야만 한다.
validation-api가 제공하는 주요 Annotation
Validation-api Annotaion이 동작하기 위해서는 반드시 @Valid Annotaion이 필요.
검증 결과를 담기 위해 Errors 파라미터도 함께 필요
<%@ taglib prefix="form" uri=http://www.springframework.org/tags/form %>
▪ @Valid가 동작할 수 있도록 SpringForm JSTL 사용<form:form modelAttribute="boardVO">...</form:form>
▪ @Valid @ModelAttribute 로 전달될 수 있도록 설정
▪ modelAttribute의 값이 Controller의 파라미터 명이 된다.action="${pageContext.request.contextPath}/board/write"
▪ JSTL 내부에 다른 JSTL을 작성할 수 없다.
▪ <c:url value=“”/> 대신 Context Path를 가져올 수 있는 ${pageContext.request.contextPath} 사용<form:errors path="subject" />
▪ @Valid의 결과를 담고 있는 Errors 객체의 결과를 출력하기 위해 사용한다.
Session
Spring Controller는 필요한 객체들을 파라미터를 통해 직접 제공받을 수 있다.
Session 처리를 위해 HttpSession 객체가 필요할 경우 파라미터를 통해 주입 받는다.
파라미터의 순서를 굳이 지킬 필요가 없다.
DispatcherServlet이 필요한 Argument 자리에 Parameter를 전달한다.
Session 정보 가져오는 세 가지 방법
Spring Framework에서 session의 정보를 가져오는 방법
1. HttpSession 을 주입받고 원하는 객체를 꺼내어 온다.
@RequestMapping(value = "/board/write", method=RequestMethod.POST) public ModelAndView doWritePage(@Valid @ModelAttribute BoardVO boardVO, Errors errors, HttpSession session) { ModelAndView view = new ModelAndView("redirect:/board"); if ( errors.hasErrors() ) { view.setViewName("board/write"); view.addObject("boardVO", boardVO); return view; } MemberVO member = (MemberVO) session.getAttribute("_USER_"); boardVO.setEmail(member.getEmail()); MultipartFile file = boardVO.getFile(); ...
2. HttpServletRequest를 주입받고 HttpSession을 가져와 원하는 객체를 꺼내어 온다.
@RequestMapping(value = "/board/write", method=RequestMethod.POST) public ModelAndView doWritePage(@Valid @ModelAttribute BoardVO boardVO, Errors errors, HttpServletRequest request) { ModelAndView view = new ModelAndView("redirect:/board"); if ( errors.hasErrors() ) { view.setViewName("board/write"); view.addObject("boardVO", boardVO); return view; } HttpSession session = request.getSession(); MemberVO member = (MemberVO) session.getAttribute("_USER_"); boardVO.setEmail(member.getEmail()); MultipartFile file = boardVO.getFile(); ...
3. 단순하게 Session 내의 객체만 가져오려면, @SessionAttribute Annotation을 사용한다.
@RequestMapping(value = "/board/write", method=RequestMethod.POST) public ModelAndView doWritePage(@Valid @ModelAttribute BoardVO boardVO, Errors errors, @SessionAttribute("_USER_") MemberVO member) { ModelAndView view = new ModelAndView("redirect:/board"); if ( errors.hasErrors() ) { view.setViewName("board/write"); view.addObject("boardVO", boardVO); return view; } boardVO.setEmail(member.getEmail()); MultipartFile file = boardVO.getFile(); ...
Interceptor
Spring Interceptor는 Controller의 실행 이전에 코드에 관여함.
Spring Interceptor는 실행 시점에 따른 Method 3가지를 지원.
Ajax Response
회원가입시, 중복 이메일 체크를 하기 위해 Ajax Request를 전송한다고 가정
/member/duplicate
POST Body
Email = test@gmail.com
으로 전송했을 때 아래처럼 응답되길 기대함.
{ “duplicate”: true } 혹은 { “duplicate”: false }
Ajax 요청의 응답을 JSON 형태로 돌려주기 위해 Dependency 추가
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> </dependency>
'KT_DS' 카테고리의 다른 글
KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_47일차(Project) (0) 2021.10.05 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_46일차(SPRING개념★) (0) 2021.10.02 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_44일차(SPRING개념★) (0) 2021.09.29 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_43일차(SPRING개념★) (0) 2021.09.28 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_42일차(SPRING개념★) (0) 2021.09.27 댓글 (비로그인 댓글 허용하지 않습니다.)