KOSTA 교육 (RequestParam, ModelAttribute, RESTFul, PathVariable, tiles, File Up/Download, JSON, AOP, Transaction)
배운 내용
- @RequestParam
- @ModelAttribute
- @PathVariable(RESTful)
- tiles
- File Up/Download
- JSON
- AOP
- 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의 기존 구조를 쉽게 적용하기 위한 템플릿 프레임워크이다.
- 페이지 수정이 쉬워 유지보수가 용이하다.
- 일관적인 페이지 관리가 가능하다.
예시(순서)
- 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(파일 업 / 다운로드)
파일을 첨부 및 다운로드 할 수 있게 하는 기능(라이브러리)이다.
예제(순서)
- 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을 사용하여 출력할 수 있게 한다.
예제(순서)
- pom.xml에 라이브러리 추가
- jackson-databind를 추가한다.
2. Javascript를 활용하여 JSON을 테이블로 출력한다.
3. Controller에서 JSON 데이터를 생성하여 response한다.
- JSON을 담을 객체를 생성한다.
- @RestController를 사용하여 JSON을 만들어준다.
- Member 객체를 List에 담아 add 해주고 return한다.
- client URL로 오면 client 뷰로 이동한다.
- add 했던 결과값이 출력된다.
7. AOP
기능을 핵심 로직과 공통 모듈로 구분하고 공통 모듈을 핵심 로직 사이사이에 끼워 넣는 개발 방법이다.
예제(순서)
- 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(트랜잭션)
세부 순서를 가진 업무 단위 혹은 이를 처리하기 위한 기술이다.
- 비즈니스 안정성을 도모하기 위해 사용한다.
예제(순서)
- 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로 돌아온다.