주의 : [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)에 선언하면 된다.
'프로그래밍 > JAVA & SPRING' 카테고리의 다른 글
[LifeSoft] spring 18강 이메일 보내기 (0) | 2020.06.07 |
---|---|
[LifeSoft] spring 15강 인터셉터(Interceptor) (0) | 2020.06.07 |
[LifeSoft] spring 13강 AOP의 개요, 로그수집 예제 (0) | 2020.06.07 |
[LifeSoft] spring 12강 Google Chart, JFree Chart (0) | 2020.06.07 |
[LifeSoft] spring 11강 itextpdf를 활용한 pdf 파일 만들기 (0) | 2020.06.07 |