ABOUT ME

-

오늘
-
어제
-
-
  • KOSTA 교육 63일차(Spring, AOP, Transaction, FileUpload)
    Review 2020. 6. 24. 01:16

    19. 2. 7(목)

     

    배운 내용

     

    1. AOP
    2. Transaction
    3. 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를 프로젝트 때 많이 사용해봐서 수료 후 언제든 스크립트를 자유자재로 사용하고싶다.

    댓글