ABOUT ME

-

오늘
-
어제
-
-
  • KOSTA 교육 58일차(RequestParam, ModelAttribute, RESTful, PathVariable, tiles, File Up/Download, JSON, AOP, Transaction)
    Review 2020. 6. 24. 00:54

    19. 1. 28(월)

     

    배운 내용

     

    1. @RequestParam
    2. @ModelAttribute
    3. @PathVariable(RESTful)
    4. tiles
    5. File Up/Download
    6. JSON
    7. AOP
    8. Transaction

    1. @RequestParam

    파라미터값을 가져올 수 있는 어노테이션이다. 가져오는 파라미터값을 명확하게 하기 위해 사용하기도 한다.

    • 1:1로 파라미터를 받는 경우에 사용한다.
    • name, value : 파라미터 이름
    • required : 해당 파라미터가 필요한지의 여부 (default : true)
    • defaultValue : 해당 파라미터의 기본 값

     

    • fname이라는 파라미터값을 가져와서 filename이라는 변수를 주었다.
    • 만약 위의 required, defaultValue를 사용하려면 다음과 같다.
      @RequestParam(value=“id” required=“true” defaultValue=“false”)

     

    2. @ModelAttribute

    파라미터값을 가져올 수 있는 어노테이션이다.

    • @RequestParam 과의 차이점으로는 도메인, 오브젝트를 통하여 파라미터를 받는다.
    • Validation을 사용하여 에러 처리가 가능하다.

     

    • “boardCommand”라는 commandName을 가진 form태그의 정보들을 한 번에 가져오기 위하여 사용하였다.

     

    3. @PathVariable(RESTful)

    URL경로에 변수를 넣어주는 어노테이션이다.

    • @RequestMapping의 URL 정의 부분과 메소드 내의 파라미터 부분에 정의하여 사용한다.
    • null 혹은 공백값이 들어가는 파라미터라면 적용이 되지 않는다.
    • 해당 어노테이션과 동일한 이름(템플릿 변수)을 가지는 파라미터에 적용된다.

     

    • URL 주소 옆에 해당 변수 값을 {}내에 추가시킨다.
    • @PathVariable을 통해 int seq를 선언한다.

     

    • 경로 바로 옆에 변수 값이 함께 들어간다.

    4. tiles(타일즈)

    타일즈는 View의 기존 구조를 쉽게 적용하기 위한 템플릿 프레임워크이다.

    • 페이지 수정이 쉬워 유지보수가 용이하다.
    • 일관적인 페이지 관리가 가능하다.

     

    예시(순서)
    1. pom.xml에 라이브러리 추가

     

    • 총 세가지의 라이브러리를 추가한다.
    • 버전은 3.0.7로 통일하였다.

     

    2. Dispatcher Servlet.xml에 View Resolver, xml 추가

     

    • 중요한 부분은 order 속성을 최우선 1번 지정하여 tiles에 해당되는 로직을 우선적으로 로드시킨다는 의미이다.
    • 이에 따라서 다른 order 속성도 차후 번호를 선언하여 주어야 한다.

     

    3. tiles-def.xml 설정

     

    • 위 설정 파일은 타일즈의 layout을 적용하는 화면을 설정해준다.
    • base_layout이라는 name을 가진 템플릿은 value로 설정한 경로의 내용에 맞는 header와 footer를 가지고 있다.
    • 나머지 name을 가진 태그들은 base_layout을 상속받아 기본적으로 header, footer의 속성을 가지고 있을 수 있게 선언한다.
    • 여기서 name은 URL을 통해서 가는 View와 이름이 같아야 한다.

     

    4. 기본 레이아웃을 JSP에 추가한다.

     

    • template.jsp에서 tiles 태그를 사용하여 xml에서 정해준 name을 선언해준다.

     

    • header, body, footer 순으로 선언한 페이지 기준으로 자동으로 layout이 나타나있다.

     

    5. File Up/Download(파일 업 / 다운로드)

    파일을 첨부 및 다운로드 할 수 있게 하는 기능(라이브러리)이다.

     

    예제(순서)
    1. pom.xml에 라이브러리 추가

     

    • 파일 업로드에 관련된 라이브러리를 추가한다.

     

    2. Dispatcher Sevlet에 파일 업/다운로드 세팅을 한다.

     

    • multipartResolver라는 빈 객체를 등록하는데 이 객체는 Multipart 객체를 Controller에 전달하는 역할을 한다.
    • 다운로드시 보여줄 뷰의 객체를 생성하고 viewResolver를 생성하여준다.

     

    3. View 및 DTO를 작성한다.

     

    • board의 fname을 가져와서 board_download인 URL로 이동한다.

     

    • MultipartFile 객체를 이용하여 uploadFile 변수를 선언한다.
    • 파일 이름을 나타낼 fname 변수를 선언한다.

     

    • form 태그에 enctype을 multipart/form-data를 선언한다.
    • input 태그에 file type으로 name = uploadFile을 준다.

     

    4. Controller를 작성한다.

     

    • 파일 경로 설정

     

    • insertAction에서 파일을 선택 후 업로드 시 실행되는 로직이다.
    • multipartFile이라는 객체는 파일을 받는 객체이다.
      이 객체를 이용하여 board에서 getUploadFile 함수를 사용하여 담는다.
    • 그 파일이 만약 비어있지 않다면 getOriginalFilename 함수를 이용하여 fileName에 이름을 담는다.
    • 그리고 담은 이름을 board객체에 set으로 담는다.
    • try catch문을 사용하여 예외 처리를 하고 multipartFile의 함수인 transfetTo를 사용하여 File객체의 주소에 fileName을 지정 경로에 저장한다.

     

    • fname의 변수를 가져와 filename으로 변수를 선언한다.
    • File 객체를 생성하여 경로에 filename을 담는다.
    • 생성된 file을 addAttribute를 통해 담고 view로 출력한다.

     

    5. download 로직을 작성한다.

     

    • File I/O를 사용하여 출력한다.

     

    • 이미지 업로드 하였을 때 다운로드 까지 가능하다.

     

    6. JSON

    JSON을 사용하여 출력할 수 있게 한다.

     

    예제(순서)
    1. pom.xml에 라이브러리 추가

     

    • jackson-databind를 추가한다.

     

    2. Javascript를 활용하여 JSON을 테이블로 출력한다.

     

    3. Controller에서 JSON 데이터를 생성하여 response한다.

     

    • JSON을 담을 객체를 생성한다.

     

    • @RestController를 사용하여 JSON을 만들어준다.
    • Member 객체를 List에 담아 add 해주고 return한다.

     

    • client URL로 오면 client 뷰로 이동한다.

     

    • add 했던 결과값이 출력된다.

     

    7. AOP

    기능을 핵심 로직과 공통 모듈로 구분하고 공통 모듈을 핵심 로직 사이사이에 끼워 넣는 개발 방법이다.

     

    예제(순서)
    1. pom.xml에 라이브러리 추가

     

    • aspects라는 라이브러리를 추가한다.

    2. Dispatcher Sevlet에 AOP 세팅을 한다.

     

    • sessionAspect라는 id를 가진 객체를 생성한다.

     

    3. view를 세팅한다.

     

    • a태그를 이용하여 각 URL로 이동한다.

     

    4. Controller에서 로직을 작성한다.

     

    • req로 이동하는 메소드, 성공시 success로 이동하는 메소드, session을 추가하는 메소드를 정의한다.
    • 여기서 session이 성공한 것을 알기 위해선 request 객체로 session을 가져와야 하기 때문에 파라미터에 객체를 생성해준다.

     

    • @Aspect는 공통사항을 만들어서 핵심사항을 체크하는 어노테이션이다.
    • @Around는 공통 관심사항 가운데 핵심 관심사항이 나타나게 하는 어노테이션이다.
    • execution은 가장 강력한 지시자로서 접근제어자, 리턴 타입, 타입 패턴, 메서드, 파라미터 타입, 예외 타입 등을 조합해서 메서드까지 선택가능한 가장 정교한 포인트컷을 만들수 있다.
    • 여기서 ()안에 들어가는 부분은 경로를 나타낸 것으로 마지막에 exe(..)은 exe라는 글자를 포함한 메소드를 포함하라는 의미이다.
    • ProceedingJoinPoint로 request에서 보낸 값을 받는다.
    • 값이 많을 수 있으니 배열로 선언하여 request 객체에서 index값으로 받고 세션을 가져온다.
    • 추가된 세션(name)이 있다면 name을 가져오고 view는 default로 fail로 이동하게 한다.
    • 예외 처리를 하여 만약 세션이 비어있다면 에러를 던지고 아니라면 view를 joinPoint.proceed를 통해 핵심사항 비즈니스를 실행하여준다.
    • 만약 실행되면 catch문을 건너뛰어 success가 return인 메소드를 실행할 것이고
    • 아니라면 default인 view로 이동할 것이다.

     

    • 세션이 생성 되어있지 않을 때 No Session을 클릭하면 로그인 실패한다.
    • 세션이 add되고 생성되어 있다면 성공한다.

     

    8. Transaction(트랜잭션)

    세부 순서를 가진 업무 단위 혹은 이를 처리하기 위한 기술이다.

    • 비즈니스 안정성을 도모하기 위해 사용한다.

     

    예제(순서)
    1. pom.xml에 라이브러리 추가

     

    2. Dispatcher Sevlet에 트랜잭션 세팅을 한다.

     

    3. view를 세팅한다.

     

    • order URL로 submit 한다.

     

    4. xml를 작성한다.

     

    • 메소드에 맞는 쿼리문을 작성한다.

     

    5. 트랜잭션할 메소드를 정의한다.

     

    • 쿼리문에서 작성한 id를 가져와 추상 메소드를 작성한다.

     

    6. Mapping할 DAO를 선언한다.

     

    • Mapping시켜준다.

     

    7. 트랜잭션을 처리할 Service 객체를 만든다.

     

    • DAO 객체를 생성해준다.
    • @Transactional을 통해 트랜잭션 처리를 한다.
    • REQUIRED는 트랜잭션이 없으면 새로운 트랜잭션을 만든다는 의미이다.
    • rollbackFor은 예외가 하나라도 있다면 rollback을 하겠다는 의미이다.
    • dao에서 Mapping한 메소드를 호출해둔다.
    • 만약 재고보다 많이 주문했다면 재고 부족이라는 오류를 던지는 조건을 준다.

     

    8. Controller 로직을 작성한다.

     

    • form태그로 가는 URL, 주문시 트랜잭션하는 URL을 선언한다.
    • 메소드가 실행되면 orderOk라는 view로 이동하여 성공시 orderok view로 이동한다.
    • 만약 예외가 발생하면 catch로 이동하여 orderForm으로 재이동 하게 선언한다.

     

    • 1대를 주문하면 재고가 있기 때문에 성공 view로 이동한다.

     

    • 만약 1000대를 주문하면 재고가 없기 때문에 다시 Form view로 돌아온다.

     

    오늘 교육 간 느낀점

    오늘로서 Spring 3버전의 전체적인 내용을 한 번 훑어봤다.
    책 1권이 되는 내용을 빠르게 3일만에 나갔는데 사실 정확하게 잡힌 개념이 없는 것 같다. 특히 AOP와 JSON 같은 경우는 중요하고 어려운 부분은 조금 천천히 나가면서 개념을 잡으면서 나가면 좋을텐데 남은 시간이 시간이니 만큼 사실 현실적으로 어렵다고 생각은 든다.

     

    내일부터는 최근에 나온 5버전을 실습하면서 바뀐 Spring과 새로운 기술들을 만날 예정이다. 아마 구정 끝나고 8일 까지 진도를 나갈 예정인데 배울 것은 많은데 해야할 일도 많아서 너무 걱정이다.

     

    오늘 배운 내용 잘 정리해서 파이널 프로젝트 뿐만 아니라 수료 후 개인 프로젝트 및 업무에서도 자유자재로 쓸 수 있도록 노력해야겠다.

    댓글