2018년 4월 13일 금요일

패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 15일차(web.xml , HTTP, Junit, Trancation, jdbc, GitHub)

  • Tomcat
    • conf - Web.xml 설정
      • path 가 '/' 이면 모든 요청을 처리한다는 뜻이다.
      • / -> DefaultServlet이 처리 (모든 요청이 이미 예약되어있다. 정적인 파일을 처리하는 로직이 있다.) 
      • x.jsp, x.jspx -> JSPSerlvet이 처리
  • 프로젝트
    • Web.xml 설정
      • path를 '/' 으로 설정하면 설정이 오버라이딩 되어 DispatcherServlet가 모든요청을 처리한다.
        • @Controller, @RestController(@RequestMapping)을 처리
      • 요청이 오면 DispatcherServlet이 요청받은 path를 찾고나서 없으면 Tomcat의 DefaultServlet한테 넘기고 없으면 404에러가 나온다.
      • 동적인 파일은 DispatcherServlet 에서 처리하고 정적인 파일은 DefaultServlet에서 처리한다.
      • DispatcherServlet에서 요청온 path를 찾고 없으면 DefaultServlet을 사용한다는 설정
      • 
        @Configuration
        @EnableWebMvc
        @ComponentScan(basePackages = { "com.test.controller" })
        public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
        
            // default servlet handler를 사용하게 합니다. 
            @Override
            public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
                configurer.enable();
            }
        }
  • Spring 과 HTTP Protocol
    • 브라우저에서는 get, post만 사용할 수 있다.(@GetMapping, @PostMapping)
      하지만 hidden 태그와 Spring HiddenHttpMethodFilter를 통해 @PutMapping, @DeleteMapping 을 사용할수 있다.
    • GET(@GetMapping)
      • GET 방식은 HTTP 헤더에 값을 담아서 보낸다. 그래서 용량이 제한이 있다.
    • POST(@PostMapping)
      • POST방식은 HTTP body에 담아서 보낸다.
      • 등록할때 사용한다.
    • PUT(@PutMapping)
      • 수정할때 사용한다. HTTP body에 담아서 보낸다.
      • post방식으로 input hidden을 만들고 put 값을 넣은후 요청한다.
      • 
        <form method="post" action="update">
            name : <input type="text" name="name">
            <input type="hidden" name="_method" value="put">
            <input type="submit">
        </form>
        
        
        <filter>
            <filter-name>httpMethodFilter</filter-name>
            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
          </filter>
          <filter-mapping>
            <filter-name>httpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>
          </filter-mapping>
        
    • DELTE(@DeleteMapping)
      • 삭제할때 사용한다. HTTP body에 담아서 보낸다.
      • post방식으로 input hidden을 만들고  delete 값을 넣은후 요청한다.
      • 
        <form method="post" action="delete">
            name : <input type="text" name="name">
            <input type="hidden" name="_method" value="put">
            <input type="submit">
        </form>
        
        
        <filter>
            <filter-name>httpMethodFilter</filter-name>
            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
          </filter>
          <filter-mapping>
            <filter-name>httpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>
          </filter-mapping>

  • GitHub 코드리뷰 방법
    • Feature로 로컬에서 Commit를 실행하다가 Push한다. (Merge를 하지 않는다!!!)
    • Pull Request를 눌러서 기본 브랜치를 develop로 선언하고 pull request를 만든다.
    • 댓글 및 의견 수렴후 close pull request를 한다.
    • 코드 Merge 가능한 상태면 Merge pull request 버튼을 누르고 Confirm Merge 를 한다.
    • 깃허브에서 작성한 Feature 브랜치를 제거한다.
    • 로컬에서도 Feature 브랜치를 제거한다.
    • 오픈소스를 Fork를 하면 내 저장소로 복사가 된다.
      • Clone을 받고 수정후 push하고
      • 오픈소스 저장소에 Pull request를 작성하며 내용을 적는다.
  • Spring Jdbc
    • 아래와 같은 반복적이고 바뀌는 코드로 인하여 Spring Jdbc가 등장하였다.
    • java datasoure방식으로 0건 or 1건 Select 할때
      1. 접속
      2. SQL문 문자열 준비( select ......... where id = ? )
      3. DB에 준비(Prepared Statement)
      4. ?에 값을 설정(바인딩)
      5. SQL실행(ResultSet)
      6. ResultSet의 next() : 1건의 Recod(다수의 컬럼으로 구성)
      7. 1개의 Record에서 컬럼별로 값을 읽는다. getInt(1), getString(2)
  • Junit
    • system out println는 테스트코드에서 쓰지 않는다.
    • @Junit을 선언하고 @Transactional을 선언하면 Rollback이 된다.
    • 테스트 코드는 Given - When - Then 형식으로 작성한다.
  • Trancation
    • @Trancational
    • 트랜잭션 레벨을 알아두자.
    • 읽기만 할때는 @Transactional(readOnly = true) 을 사용
    • 어노테이션이 적용된 메소드 안에서는 트랜잭션 처리된다.
    • transactionManger
      • DataSource에 의존적이다.
      • transactionManger가 AOP를 통해 트랜잭션을 제어한다.
      • AutoCommit이 fasle상태다.
      • transactionManger의 Bean이 등록되어 있고 @Trancational어노테이션이 되어있으면 메소드가 실행될때 트랜잭션이 실행되고 완료후 Commit을 해준다.
      • runtimeException이 발생되면 rollBack 된다.
  • Test
    • Service 단계에서 Mockito을 통해 테스트하자.
    • Service 단계에서 Mockito를 사용하지 않고 테스트 하는 경우는 dao가 완벽한 경우이다.(db도연결해야한다.)
Share:

0 개의 댓글:

댓글 쓰기