-
KOSTA 교육 63일차(Spring, AOP, Transaction, FileUpload)Review 2020. 6. 24. 01:16
19. 2. 7(목)
배운 내용
- AOP
- Transaction
- FileUpload
1. AOP
Aspect-oriendted Programming (AOP)은 OOP를 보완하는 수단으로, 흩어진 Aspect(공통 관심 사항)를 모듈화 할 수 있는 프로그래밍 기법.
- 기존의 코드를 수정하지 않고도 원하는 관심 사항을 엮거나 수정이 가능하다.
AOP 세팅
- aspect에 관련된 라이브러리를 추가한다.
- component-scan을 통하여 AOP를 등록한다.
Service
- 인터페이스에서 메소드 정의
- 비즈니스 로직을 작성한다.
- str1 + str2를 return하는 메소드 구현
Advice
- AOP를 구현할 패키지와 클래스를 작성한다.
- Aspect를 구현하기 위해 @Aspect를 선언하였다.
- 빈 등록을 위해 @Component를 사용하여 등록
- @Before는 관심사항 메소드가 실행되기 이전에 출력되게 한다.
- execution을 사용하여 모든 SampleService에 있는 메소드를 실행시키도록 한다.
- str1과 str2를 추적하기 위해 메소드를 선언한다.
- execution을 이용하여 doAdd의 메소드에 있는 && args를 선언하고 메소드의 파라미터로 가져와 log로 선언한다.
- str1, str2를 추적하여 값을 출력하였다.
- @AfterThrowing은 예외 발생 뒤에 실행되는 어노테이션이다.
- SampleService에 있는 메소드의 파라미터가 잘못되었다면 예외를 발생시킨다.
- exception을 파라미터에 선언한다.
- @Around는 직접 대상 메소드를 실행할 수 있고 실행 전, 후에 처리가 가능하다.
- ProceedingJoinPoint를 결합하여 파라미터 및 예외 처리가 가능하다.
- ProceedingJoinPoint는 AOP의 대상이 되는 Target이나 파라미터를 파악하거나, 실행을 결정할 수 있다.
- return타입을 필요로 하며 try catch문을 사용하여 예외를 처리해야한다.
Test
- JUnit로 test class를 생성했다.
- service 객체를 생성하여 test 어노테이션을 통해 test를 실행한다.
- service 변수는 인스턴스가 출력된다.
- getClass().getName()으로 프록시 기법을 적용하여 출력한다.
- doAdd메소드에 두 파라미터를 선언하여 테스트를 한다.
- before 어노테이션이 적용된 메소드가 먼저 출력된다.
- 메소드 return 값이 출력된다.
- 숫자가 아닌 문자열을 선언했다.
- 예외가 발생하고 exception에 대한 내용을 출력한다.
- 100과 200를 더한 Around 어노테이션 test
- @Around가 먼저 동작하고 @Before가 실행된 후에 시간이 로드 되는 것을 확인할 수 있다.
2. Transaction
쪼개질 수 없는 하나의 단위 작업을 나타내며 한 번에 이루어지는 작업의 단위를 말한다.
- ACID 원칙으로 설명 가능하다.
ACID
- 원자성(Atomicity) : 하나의 트랜잭션은 하나의 단위로 처리되어야 한다. 즉, 어떠한 과정에서 실패할 경우 모든 것이 원점으로 돌아가야한다.
- 일관성(Consistency) : 성공시 DB의 모든 데이터는 일관성을 유지한다.
- 격리(Isolation) : 트랜잭션 처리 과정 시 외부 간섭이 없어야한다.
- 영속성(Durability) : 트랜잭션이 성공적으로 처리되면 그 결과는 영속적으로 보관되어야 한다.
트랜잭션 세팅
- 트랜잭션에 관한 라이브러리 추가
- DB 및 등록 작업을 해준다.
- 500바이트와 50바이트 둘다 만족해야 트랜잭션이 되는 예제를 구현하기 위해 위 두가지의 테이블을 생성한다.
Mapper
- 각각의 Insert문을 가진 메소드를 정의한다.
Service
- 트랜잭션할 메소드를 선언한다.
- 각 mapper를 DI하고 선언한 메소드를 구현메소드로 오버라이딩 한다.
- 그리고 mapper메소드를 불러온다.
Test
- testLong 메소드를 통해서 50바이트 보단 크고 500보다 작게 문자열을 선언하여 insert를 시도한다.
- 500바이트 테이블은 값이 들어갔다.
- 50바이트의 테이블은 에러가 발생한다.
- @Transactional을 상사용하여 트랜잭션 처리를 해 하나라도 실패하면 rollback을 하는 결과 값을 확인해보자
- 만족하지 않을 시 rollback()한 결과를 볼 수 있다.
3. FileUpload
첨부파일을 서버에 전송하여 파일을 업로드한다.
- Form 태그를 이용한 방법 : 브라우저의 제한이 없어야 하는 경우 사용
- Ajax를 이용한 방법 : 첨부파일을 별도로 처리하는 방식
- MultipartFile 메소드
String getName() : 파라미터의 이름 <input>태그의 이름
String getOriginalFileName() : 업로드 되는 파일의 이름
boolean isEmpty() : 파일이 존재하지 않는 경우 true
long getSize() : 업로드되는 파일의 크기
byte[] getBytes() : byte[]로 파일 데이터 변환
inputStream getInputStream() : 파일 데이터와 연결된 inputStream을 반환
transferTo(File file) : 파일의 저장
세팅
- 3.1로 수정한다.
- multipart-config를 선언한다.
- multipartResolver를 추가한다.
<Form>파일 업로드
- uploadForm으로 이동하는 메소드를 선언한다.
- button을 클릭하면 input태그의 file을 multiple로 첨부할 수 있다.
- form태그에는 enctype=“multipart/form-data” 를 선언해주어야 한다.
- 위와 같은 페이지가 나오게 된다.
- Post방식으로 Mapping한다.
- Spring에서 지원하는 MultipartFile을 이용하여 여러개일 수 있으니 배열을 선언하여준다.
- for문을 사용하여 출력한다.
- 첨부파일을 넣으면 파일이 입력된 것을 알 수 있다.
파일 저장
- uploadFolder에 저장할 경로를 선언한다.
- File인 io를 선언하여 new File로 file을 saveFile 변수안에 넣는다.
- transferTo로 저장한다.
- 해당 폴더에 첨부한 파일이 들어간다.
Ajax 파일 업로드
- Get메소드를 통해 이동한다.
- div 태그로 file을 선언한다.
- uploadResult에는 ul태그만 선언해둔다.
- button 태그를 선언한다.
- click이벤트를 주어 FormData라는 객체를 이용하여 파일 업로드를 한다. (가상의 Form태그)
- input태그의 name이 uploadFile인 것을 찾아 inputFile변수에 넣는다.
- 파일이 들어간 것을 확인할 수 있다.
- Ajax를 이용하여 보내기 업로드 하기 위해 요청이 들어오면 저장될 수 있게끔 작성한다.
- IE는 전체 파일 경로가 전송 되므로 위와 같이 작성한다.
- Script와 Ajax 요청을 통하여 업로드한다.
- processData와 contentType은 항상 false로 두어야 업로드가 되니 주의한다.
오늘 교육 간 느낀점
구정연휴가 끝나고 약 1주일 만에 학원에 출근하였다. 연휴간 배우고 싶었던 스프링부트를 공부했더니 이질감이 들진 않았다.
오늘은 AOP와 트랜잭션, 간단한 파일 업로드를 배웠다.기존에 배웠던 부분들도 있지만 큰 틀만 비슷하고 내부 코드들은 달랐다.
AOP는 여전히 어려웠고 트랜잭션은 어노테이션을 통해 가볍게 구현할 수 있었다. 하지만 파일 업로드의 경우 Ajax를 이용한 업로드가 생각보다 어려워서 애먹었다. 다음 주부터 본격적으로 파이널 프로젝트가 진행되는데 스크립트 적인 부분이 많아서 Ajax를 프로젝트 때 많이 사용해봐서 수료 후 언제든 스크립트를 자유자재로 사용하고싶다.'Review' 카테고리의 다른 글
자바스크립트 코딩의 기술 책 리뷰 (0) 2020.07.01 KOSTA 파이널 프로젝트 64 ~ 78일차(업무 협업 툴) (4) 2020.06.24 KOSTA 교육 62일차(Spring, REST, RestController, Reply) (0) 2020.06.24 KOSTA 교육 61일차(Spring, Oracle DB Hint, Paging, Search) (0) 2020.06.24 KOSTA 교육 60일차(Spring, Test, CRUD, MVC) (0) 2020.06.24