Spring Framework과정 Day5 - HiroSung/Study GitHub Wiki

Day5

Ch13. AOP/트랜잭션/예외처리

  • Pointcut
    • Annotation으로 생성자,클래스,메소드 위에 항상 정의되어야 함.
    • @Pointcut("execution(public * controller.Ch13Controller.*(..))") public 메소드가 Ch13Controller에 정의된 모든 메소드와 변수가 수행될때 정의 메소드 이름은 중요하지 않고 리턴타입이 Pointcut을 사용할 메소드가 리턴하는 타입이 중요하다.
  • 설정
    • servlet-context.xml 에 namespace 선언 하고 아래항목 추가 aop:aspectj-autoproxy/
    • pom.xml에 의존성 선언. AOP는 spring f/w이 아니기 때문에 의존성 설정을 해야 함. org.springframework spring-aop ${org.springframework-version} org.aspectj aspectjweaver 1.9.1
  • AOP순서를 정의하는 방법
    • 하나의 Method에서 2개의 컷이 정의되어 있다면, 가까운 정의부터 수행하고, 넓은 범위의 정의가 수행됨
    • 포인트컷을 파일별로 작성해서 아래와 같이 @Order 로 정의하면됨
       @Component
       @Aspect
       @Order(2)
       public class Ch13Aspect2 {
      
    • Eclipse의 Editor에 돌아가는화살표 모양이 있으면 AOP aspect가 정의되어 있다는 것임.
  • Spring Transaction
    • AOP를 사용함.
    • 선언적 방법과 프로그램밍에 의한 방법 모두 지원
      • 선언적인 방법은 AOP 를 이용
      • 프로그래밍방법은 spring transaction manager에 의한 코딩
      • RuntimeException이 발생시 자동 Rollback 됨. (try-catch로 하면 안됨)
    • root-context.xml 에 정의 <tx:annotation-driven transaction-manager="transactionManager"/>
      • tx:jta-transaction-manager : 분산Tran 시 사용
  • Spring Exception Handling
    • AOP에서 최종적으로 Controller에서 예외처리함
    • 그래서, @ControllerAdvice 를 사용함
  • *.jsp
    • jsp 페이지 상단에 <%@ page isErrorPage="true" %> 정의하면 exception 처리 내용을 받을 수 있음.
    • 404 error는 WAS에서 처리 하는 것이므로, web.xml에서 정의햐야 함.

Ch14. 단위 테스트

  • 전체를 이루는 각각의 작은 단위 요소들이 의도대로 정확히 동작하는지 테스트 하는 것 UnitTest
  • JUnit 사용
    • spring 5이상은 junit 4이상이여야 한다.
    • 주입받아 사용 가능
    • spring test 모듈을 의존도 설정해야 함.
    • 외부자원에 영향을 받지 않도록 해야 하므로, WAS 설정으로 테스트 하면 안되고, Application 가지고 있는 connection pool을 사용해야 함
  • 단위테스트와 관련 어노테이션
    • @RunWith, @ContextConfiguration, @WebAppConfiguration, @Transactional, @Rollback(true)
  • 테스트 방법
    • /src/test/java에 동일하게 package를 만들고, BaseTest.java 파일을 만들고, dao 폴더에 BaseTest를 상속받은 테스트 클래스를 만듬
    • Project Explorer 에서 파일의 테스트 하고자 하는 method 선택 > 마우스 오른쪽 > Run as > JUnit Test 수행
  • MAVEN도 TEST가 있음.
    • build 까지 테스트 함

Ch15. 웹소켓

  • HTML5는 양방향 통신이 되며, flash에서 사용했던 기능을 websocket으로 구현가능함
  • echo예제
    • WebSocketSession : 연결객체. 하나가 연결되는 것이아니라 여러개라면 handler로 관리하는 객체를 만들어야 함.

    • handleTextMessage : 비동기 method. @Component public class EchoHandler extends TextWebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(EchoHandler.class);

      @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info(session.getId() + " 연결 됨"); }

      @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { logger.info(session.getId() + "로 부터 [" + message.getPayload() + "] 받음"); session.sendMessage(new TextMessage("echo: " + message.getPayload())); }

      @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { logger.info(session.getId() + " 연결 끊김"); } }

  • HTML5에서 websocket 태그는?
    • ws 프로토콜
    • websocket/echo : endpoint URL로.
<script type="text/javascript"> var ws = null; function connect() { ws = new WebSocket("ws://" + window.location.host + "/myapp/websocket/echo"); - Chat websocket : echo와 다른것은 세션을 관리한다는 것임. @Component public class ChatHandler extends TextWebSocketHandler { private static final Logger logger = LoggerFactory.getLogger(ChatHandler.class); private List list = new ArrayList(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info("afterConnectionEstablished"); list.add(session); } ## 마무리 - spring doc : https://docs.spring.io/spring/docs/5.0.8.RELEASE/javadoc-api/
⚠️ **GitHub.com Fallback** ⚠️