• KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_45일차(SPRING개념★)

    2021. 9. 30.

    by. KAEY

    자바&파이썬 웹애플리케이션 전문가 양성과정 채용연계형 교육과정 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>

     

     


    댓글 (비로그인 댓글 허용하지 않습니다.)