2021-05-13(목) kosta - 스프링수업 6일차(LOGGER,TRANSATION,RESTFUL)
자 오늘은 LOGGER라는 것을 배워보도록 하겠다. 먼저 POM.XML에 아래와 같이 dependency를 추가해준다.
Logger를 예쁘게 출력하기 위해서 pom.xml에 추가해주었다.
<!-- 예쁘게 display --> <dependency> <groupId>org.lazyluke</groupId> <artifactId>log4jdbc-remix</artifactId> <version>0.2.7</version> </dependency>
datasource-context.xml을 아래처럼 바꿔주었다. 기존에 dataSoruce를 막았다.(수업도중 datasource에 문제가 생겨서 아시 datasource를 적었다.)
사실 Spring으로 프로젝트를 만들면서 log4j.xml이 알아서 만들어졌다. 원래 만들어진 log4j.xml은 아래와 같다.
LOG4J에 대한 설명은 교재를 참고하도록 하자. 잘 나와있다. 실제 로거를 사용해보도록 하겠다.EmpController.java에서 테스트 해보도록 하겠다. 로거 사용을 위해 import할때 org.slf4j.Logger 를 import해와야 한다.
아래처럼 Logger 객체를 생성하고 로거를 사용할수 있도록 설정했다.
log4j.xml에 아래 내용을 추가해주었다.
아래처럼 log가 colsole에 잘 표시되는 것을 볼 수 있다.
원래 Console에 찍기 위해서 System.out.println을 사용했는데 앞으로는 logger.info를 사용하도록 하자!
EmpDAOMybatis.java에서 이번엔 Logger를 사용해보도록 하자.
아래처럼 사용해보았다.
그런데 위에서 사용한
logger.info(joblist.size()+"건의 job이 있다."); 보다는
logger.info("{}건의 job이 있다.",joblist.size()); 이렇게 쓰는 것이 훨씬 좋다.
이번에는 log를 별도의 파일로 만드는 방법에 대해서 알아보도록 하겠다. 먼저 log4j.xml로 가서 아래 내용을 추가해준다.
<!-- DailyFile Appenders --> <appender name="dailyFileAppender" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="C:\\spring\\logs\\output.log" /> <param name="Append" value="true" /> <layout class="org.apache.log4j.PatternLayout"> <param name="DatePattern" value="'.'yyyy-MM-dd"/> <param name="ConversionPattern" value="[%d{HH:mm:ss}][%-5p](%F:%L)-%m%n"/> </layout> </appender>
그리고 log4j.xml에 아래부분에 <root></root>안에도 아래 내용을 추가로 넣어주었다.
그리고 sqlConfig.xml에 settings에 아래 내용을 추가해주었다.
그리고 다시 log4j.xml로 가서 아래 두 내용을 추가해주었다.
이제 Transaction에 대해 배워보도록 하자. 트랜잭션 Test를 위해 DB에 Table을 생성했다. 테이블 이름은 cust_account이다.
accountMapper를 아래처럼 만들어주었다.
그리고 아래처럼 com.spring.account라는 빈 package를 만들었다.
교안에 있는 소스를 그대로 com.spring.account에 넣었다.
그리고 servlet-context.xml로 가서 com.spirng.account도 @component를 읽어올 수 있도록 추가해주었다.
accountController를 아래와 같이 만들었다.
account.do를 하게되면 1이 빠져나가고 다른 곳으로 1이 추가되는 것을 볼 수있다. 그런데 일부러 에러를 일으키기 위해 아래처럼 세미콜론을 넣어주었다. 그결과 한군데서는 1이 빠졌는데 다른 곳에서 1이 추가되지 않았다.
위와 같은 일을 막기 위해서 transaction을 사용한다. 자 이제 transaction을 사용해보도록 하자. maven repository로 가서 spring-tx를 검색한다.
그리고 pom.xml에 dependency에 넣어준다.
datasource-context.xml에 아래 bean을 추가해주었다.
그리고 datasource-context.xml에서 namespace로 가서 tx를 추가해준다.
그다음 아래 tx:annotaion-driven을 추가해준다.
그리고 accountService에서는 아래처럼 사용해주었다.
Controller는 아래와 같다. url주소로 실행보면 된다. 그런데 수업시간에 자꾸 transaction이 작동하지 않았다.
원인을 찾아보니 아래와 같았다.
원래 이렇게 설정되어있었다. 그런데 context-param은 application 전체에서 접근이 되지만 여기에 bean을 설정하면 servletcontext에서 사용할수 없다고 한다..그래서 datasource-context.xml을 옮겨주기로한다.
아래처럼 init-param에 옮겨놓으니 transaction이 잘 실행되었다. 이렇게 사용해야 servletContext가 사용할 수 있다.
이번에 deptController에서 테스트 해보도록 하겠다. 테스트를 위해서 deptcontroller에 아래처럼 만들어주었다.
deptServiceimpl은 아래처럼 만들어주었다.
그리고 아래 datasource-context.xml에서 tx:annotation-driven 에서 proxy-target-class를 true로 해주었다. 무슨 역할을 하는지는 따로 찾아보도록 하자..
datasource-context.xml에서 tx:advice를 추가로 넣었다.
위에서 처럼 사용해주려면 datasource-context.xml의 namespace에서 아래처럼 aop를 추가해주어야한다.
이번 시간에는 RestFul에 대해서 알아보도록 하겠다. 설명은 아래와 같다.
테스트를 위해서 EmpTestRestController를 만들어주었다. 아래처럼 해서 emplist.do를 실행하면 <h1>이 그대로 출력되는 것을 볼수있다.
h1이 그대로 출력되지 않고 html로 해석되게 하기위해서 아래처럼 코드해주었다.
이번에는 객체를 반환해보도록 하겠다. 객체를 반환하게되면 restful이 알아서 json으로 만들어서 출력해준다.
Restful의 특징이 return시 json타입 그대로 출력해준다는 것이 있는데 이를 크롬에서 예쁘게 보기 위해서 웹스토어에서 아래 JSON Viewer를 설치했다.
아래처럼 예쁘게 출력해준다.
이번에는 emplist를 return하게되면 어떻게 될까?
그럼 아래처럼 모두 출력하게 된다.
아래 emplist4.do를 만들어서 실행해보았다.
결과는 아래와 같다. key로 employee_id를 값으로 emp객체를 넣으면 아래처럼 나온다.
이번에는 homecontroller에서 테스트 해보기로한다.
empservice객체를 autiwired해주었다.
homeController아래애 아래와같이 코드를해주었다. 이제 실행해보겠다.
home.jsp에 아래처럼 추가해주었다.
버튼을 누르면 emp5.do가 실행되고 emp가 json으로 넘어오는데 이때 responseData가 javascript 객체이다. 따라서 "first_name"이 key이므로 responsedata["first_name]이라고 하면 해당하는 값이 나온다.
restful이 좋은 또 다른 점은 url뒤에 ?empid=101 더이상 이런 형식으로 쓰지 않아도 된다는 점이다.
실행하면 결과가 위와같다.
끝~