본문 바로가기

프로그래밍/JAVA & SPRING

[LifeSoft] spring 14강 AOP와 트랜잭션 처리 실습

반응형

주의 : [org.springframework.web.servlet.PageNotFound.noHandlerFound:1248]-
    No mapping for POST /spring02/messages 라는 오류메시지가 뜨면 mapping 실수이다.

반듯이 아래와 같이 매핑을 하자.

 

@RestController
@RequestMapping("/messages")
public class MessageController {

  @Inject MessageService service;

  @RequestMapping(value="" , method = RequestMethod.POST)
  public ResponseEntity<String> addMessaged (@RequestBody MessageDTO dto ) {
   ...
  }
}



ARC 프로그램을 이용한다.

 

테스트가 성공적으로 잘 되었다면

AOP와 트랜잭션이 잘 수행되었다는 것이다.

 

다음은 고의로 실패하게 코드를 수정해 본다.

코드에서 pointMapper에서 오타를 내어보자

서버 재시작하고

오라클에서 데이터 초기화하고 (마지막에는 commit을 하자)

ARC프로그램에서 SEND를 누르면

400 ERROR가 뜨고 메시지가 나온다.

### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-00942: ??? ?? ?? ???? ????

...

디비를 보면 트랜잭션 처리가 되어서 업데이트 되지 않았다.

select * from tbl_message;
select * from tbl_user;

다음은 MessageService에서 Transactional을 주석처리 한다.

 

<a>//@Transactional</a> // method 내부의 코드를 트랜잭션(거래처리 단위)으로 묶음.

 @Override
 public void create(MessageDTO dto) {
  messageDAO.create(dto);
  pointDAO.updatePoint(dto.getSender(), 10);
 }

 


현재 pointMapper.xml에서 고의로 오타를 낸 상태이다.

ARC 툴에서 JSON 데이터를 POST로 SEND하면

400 Bad Reques 에러가 뜨고

디비는 message는 입력이 되고 포인트는 입력이 안되었다.

무결성이 깨진 것이다.

select * from tbl_message;

21 user01 user02 Good morning  19/04/10


select * from tbl_user;

user00 user00 kim 0
user01 user01 park 0
user02 user02 hong 0
user03 user03 choi 0
user04 user04 lee 0

 

트랜잭션 테스트가 잘 되었으면

다시 원래코드로 돌려놓고

AOP가 잘 동작하는지 콘솔을 통해 확인한다.

 

 

[http-nio-8080-exec] INFO [com.example.spring02.controller.message.MessageController.addMessagedd:34]
[http-nio-8080-exec] INFO [jdbc.connection.connectionOpened:541]- 1. Connection opened
[http-nio-8080-exec] INFO [com.example.spring02.aop.MessageAdvice.startLog:22]-
        핵심 업무 코드의 정보: void com.example.spring02.service.message.MessageService.create(MessageDTO)
[http-nio-8080-exec] INFO [com.example.spring02.aop.MessageAdvice.startLog:23]-
        method: create
[http-nio-8080-exec] INFO [com.example.spring02.aop.MessageAdvice.startLog:24]-
        //매개변수에 누가 누구에게 보냈는지 DTO에 쌓여 있다.
        매개변수: [MessageDTO [mid=0, targetid=user01, sender=user02, message=Good morning, opendate=null, senddate=null]]
[http-nio-8080-exec] DEBUG [jdbc.sqlonly.sqlOccurred:223]-
         org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
1. insert into tbl_message (mid, targetid, sender, message) values (message_seq.nextval, 'user01',
'user02', 'Good morning')

[http-nio-8080-exec] INFO [jdbc.sqltiming.sqlTimingOccurred:373]-
        insert into tbl_message (mid, targetid, sender, message) values (message_seq.nextval, 'user01',
'user02', 'Good morning')
 {executed in 9 msec}
[http-nio-8080-exec] DEBUG [jdbc.sqlonly.sqlOccurred:223]-
         org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:46)
1. update tbl_user set upoint=upoint+10 where userid='user02'

[http-nio-8080-exec] INFO [jdbc.sqltiming.sqlTimingOccurred:373]-
        update tbl_user set upoint=upoint+10 where userid='user02'
 {executed in 1 msec}
[http-nio-8080-exec] INFO [com.example.spring02.aop.MessageAdvice.timeLog:33]-
        실행시간 : create:298
[http-nio-8080-exec] INFO [com.example.spring02.aop.MessageAdvice.timeLog:34]-
        ===================================
[http-nio-8080-exec] INFO [jdbc.connection.connectionClosed:568]-
        1. Connection closed

 

 

 

조인포인트 pjp는 MessageService의 method들이다.
이 메소드들의 전.후(Around)에서 실행된 로직
전: 시작 시간 체크하는 로직 (다른 로직이 들어갈 수 있음)
methods (원래의 업무로직 수행)
후: 끝 시간 체크하는 로직 (다른 로직이 들어갈 수 있음)

지금은 업무로직 전 후에 걸린 시간만 체크하는 AOP 설정이다.
시간이 'create:298'와 같이 나왔으므로
AOP는 잘 수행되었다고 할 수 있다.

수행될 로직은 어드바이스(MessageAdvice)에 선언하면 된다.