KOSTA

KOSTA 교육 (RequestParam, ModelAttribute, RESTFul, PathVariable, tiles, File Up/Download, JSON, AOP, Transaction)

코린이 연대기 2021. 4. 23. 12:15

 

배운 내용

 

  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로 돌아온다.