2018년 4월 27일 금요일

패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 22일차(Jpa, Thymeleaf)

  • JPA
    • JPQL
      • Criteria Query, Query Dsl 이 있다.
      • @Query 어노테이션을 통해 JPQL을 이용해서 사용할 수 있다.
      • @Param 어노테이션은 org.springframework.data에 포함되어있다.
      • @Query("SELECT COUNT(b) FROM Board b WHERE b.user.name = :name")
        public Long countAllByUserName(@Param("name") String name);
        
    • 페이징 처리
      • 페이지 처리를 위해서는 Pageble 객체를 사용해야 한다. Pageble은 0이 시작이다.
      • 페이징 처리를 위한 메소드는 Page<도메인객체> 반환하도록 한다. Page에는 검색된 결과, 검색된 결과의 견수, 전체 페이지수
      • 페이지 처리를 위한 메소드는 Pageble 타입을 파라미터로 받아야 한다. 사용자가 해당 인터페이스를 구현한 객체를 파라미터로 전달해서 사용해야한다.
      • Pageable pageable = PageRequest.of(....);
        
      •  PageRequest.of 안에는 파라미터(page값(시작이 0이다), 1page에 보여줄 수, 정렬규칙(sort객체))가 들어간다.
  • JAVA API
    • API를 볼때 생성자가 Deprecated 처리 되어있으면 extends 되어있는 목록을 보고 static한 것이 있는지 봐야한다.
  • Thymeleaf 사용법
    • th:if="${not #list.isEmpty(객체명)}" : 제공 하는 메소드를 이용해서 비어있지 않을 경우 tr태그를 사용
    • th:each="board : ${list}" : list에 있는 내용을 하나씩 꺼내서 board에 대입하여 반복한다.
    • <td th:text="${board.id}"></td> : board가 가지고 있는 id프로퍼티의 값을 td태그 안의 text값으로 출력한다. 만약 이름이 kim이 라면 <td>kim</td> 와 같은 결과가 출력된다.
    • <td th:text="${#temporals.format(board.regdate, 'yyyy-MM-dd HH:mm')}"></td> ; regdate는 LocalDatetTime일때 타임 리프가 제공하는 #temporals.format()을 이용해서 적절한 포맷으로 변환할 수 있다.
    • th:classappend : 조건에 따라서 클래스를 추가하 사용한다. 여러 조건을 넣을 경우 th:classappend="(조건) + (조건)" 으로 사용한다.
    • <li th:each=" i : ${numbers.sequence( {pager.startPage}, {pager.endPage)}"></li> :
      (시작번호, 끝번호)를 이용하면 위의 for문처럼 반복할 수 있다.
    • <a th:href="@{/boards(page=${i}, searchStr=${pager.searchStr}, searchType=${pager.searchType})"> : URL주소에서 파라미터를 사용하는 방법
      @{/boards(파라미터명=값, 파라미터명=값, 파라미터명=값)} 형태로 보낸다.
  • 프로그래밍을 잘한다는건?
    • 요구사항 정의(파악,분석?)
      • UI 프로타이핑
        • 기획자
      • 업무전문가
        • 기술에 대한 내용은 적지 않는다.
        • 유스케이스(기능)다이어그램
        • 기능단위로 정리한다.
    • 기능 분배
      • 트렐로 프로그램
        • Comment 에는 깃허브 브런치를 적는다.
        • 기능을 분리하여 적는다.
        • 기간을 지정한다.
        • 라벨을 사용하여 표시한다.
      • 기능을 뽑을때는 크기가 비슷해야한다.
      • 기능단위로 정리하고 0~7, ∞ 카드를 만든다.
        • 몇명의 사람이 모여서 각자 카드를 가진다.
        • 0이 나오면 토의를 해야한다.0은 이미 오픈소스가 있거나 구현되어 있는 기능에 대해 말한다. 
        • ∞를 꺼내면 다른 회사와 협력해야하거나 구현하기 어려운 기능이다.
      • 기능에 대한 개발의 일정을 정하고 분배한다. 일수를 정리한 Todo _> doing -> done 일정목록을 정리한다. 투명하게 관리가 가능하다. (제품 백로그)
        • 일찍 작업을 끝내도 버그가 많을수가 있고 일정보다 늦게 끝나도 꼼꼼하게 하는 사람이 있을 수 있다.
        • 애자일 방법론
    • 설계
      • 설계--(순공학)--> 구현
      • 업무와 아키텍처를 정의해야한다.
      • 클래스 이름은 업무를 알아야 정할수 있다.
      • 설계를 못한다는건 업무에 대해 알지 못한다는 뜻이다
      • Interface, Class, pacakge, method, package 를 정한다.
  • 컨트롤러는 어떻게 구성해야 할까?
    • 댓글만 요청안할 수도 있지만 ajax로 댓글만 요청할수도 있다.(WEB API)
    • 컨트롤러는 관련 URL처리를 하는것이다.
    • URL중심과 REST API를 나눠서 정리한다.
      • URL 중심
        • 게시물 상세보기
        • 게시물 목록보기
        • 회원가입
      • WEB API 중심
        • 댓글 등록
        • 댓글 삭제
    • 메소드 이름을 나열해보고 관련것들을 묶는다.
    • 개발은 설계를 완성해 나가는 과정이다.
  • @OneToMany 에서 fetch 옵션
    • 1: N  관계일때 사용한다.
    • FetchType.EAGER : 엔티티를 조회할때 주 테이블과 관계맺은 테이블을 조회한다.
    • FetchType.LAZY : 실제 엔티티를 사용할때 관계맺은 테이블을 조회한다.
    • FetchType.EAGER 로 다 선언했다면 하나의 테이블을 불렀을때 관련된 테이블을 다 조회하므로 좋지않다.
    • SQL이 어떻게 조회되는지 확인하자.
    • 리스트 형태에서는 FetchType.LAZY을 사용하면 안된다.
Share:

0 개의 댓글:

댓글 쓰기