TIL - day24

정상화·2023년 3월 27일
0

TIL

목록 보기
19/46
post-thumbnail

크롤링

네이버에서 특정 요소를 리스트로 뽑아오는 예제

const titles = [
  ...document.querySelectorAll(
    '#NM_THEME_CONTAINER [data-page="1"].group_theme .theme_item'
  )
]
  .map((el) => el.querySelector(".title"))
  .filter((el) => el != null)
  .map((el) => el.innerText);

console.log(titles);

bash

~ : 홈 디렉토리
cd ~ : 사용자 폴더로 이동
ls : 현재 디렉토리의 모든 파일을 출력
clear : 콘솔 화면을 지움
start . : 파일탐색기 열림(Mac에서는 open .)
ll : ls -l과 같음. 파일의 상세정보 출력
touch : 파일 생성
history : 명령어 입력한 걸 출력


운영체제와 쉘

운영체제 내부에는 커널이라는 소프트웨어가 있다.
커널은 직접 접근할 수 가 없고 응용프로그램에서 시스템콜을 통해 접근가능하다.
쉘의 명령어들은 시스템콜로 이루어진 프로세스이고 이를 통해 커널에 명령을 전달할 수 있다.


쉘에서 파일 삭제

rm : 파일 삭제
mkdir : 폴더를 생성
* : 와일드카드 (모든 파일)
rmdir : 폴더삭제

폴더 안에 파일이 존재하는 경우 rmdir로 폴더를 지울 수 없다

ls -al : a파라미터를 넣으면 숨김파일도 표시된다.

숨김 파일은 rm *로 지워지지 않는다. 숨김 파일을 지우려면 rm .*


현재위치

pwd : 현재 위치를 절대경로로 출력
mkdir -p a/b/c/d: a 만들고 b 만들고 c 만들고 d 디렉토리를 만듦
cd .. : 부모 폴더로 이동


디렉토리 강제 삭제

rm -rf : -r 재귀적으로 -f강제로 삭제. 위험한 명령어


echo

echo : 파일 디스크립터가 가리키는 파일로 출력(기본 디스크립터 1, 에러는 2)
cat : 파일 디스크립터가 가리키는 파일에서 내용 받아옴(기본 0)
> : truncate
>> : append
| less : 긴 내용을 스크롤로 볼 수 있게 함


vim

a : 입력모드
esc : 메뉴모드
:wq! : 저장 후 나감

수정 중 vim 을 꺼버린 경우 다시 들어가면 비정상 종료 이력이라고 뜬다.
swp파일을 지우고 vim을 다시 들어가면 해결

u : undo
ctrl + r : 복구


페이징

스프링 데이터 JPA는 페이징을 쉽게 할 수 있는 라이브러리를 제공한다.

리포지토리에서 페이지를 반환하는 메서드 추가

Page<Question> findAll(Pageable pageable);

서비스에서 날짜순 정렬 지정

public Page<Question> getList(int page, String kw) {
        List<Sort.Order> sorts = new ArrayList<>();
        sorts.add(Sort.Order.desc("createDate"));
        Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
        return questionRepository.findAll(pageable);
    }

뷰에서 페이지 객체 이용

<tbody>
        <tr class="text-center" th:each="question, loop : ${paging}">
            <td th:text="${paging.getTotalElements - (paging.number*paging.size) - loop.index}"></td>
            <td class="text-start">
                <a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>
                <span class="text-danger small ms-2" th:if="${#lists.size(question.answerList) > 0}"
                    th:text="${#lists.size(question.answerList)}"></span>
            </td>
            <td><span th:if="${question.author != null}" th:text="${question.author.name}"></span></td>
            <td th:text="${#temporals.format(question.createDate, 'yyyy-MM-dd HH:mm')}"></td>
            <td th:text="${question.views}"></td>
        </tr>
</tbody>


<!-- 페이징 처리 시작 -->
    <div th:if="${!paging.isEmpty()}">
        <ul class="pagination justify-content-center">
            <li class="page-item" th:classappend="${!paging.hasPrevious} ? 'disabled'">
                <a class="page-link" href="javascript:void(0);" th:data-page="${paging.number-1}">
                    <span>이전</span>
                </a>
            </li>
            <li th:each="page : ${#numbers.sequence(0, paging.totalPages-1)}"
                th:if="${page>=paging.number-5 and page <= paging.number+5}"
                th:classappend="${page == paging.number} ? 'active'" class="page-item">
                <a th:text="${page}" class="page-link" href="javascript:void(0);" th:data-page="${page}"></a>
            </li>
            <li class="page-item" th:classappend="${!paging.hasNext} ? 'disabled'">
                <a class="page-link" href="javascript:void(0);" th:data-page="${paging.number+1}">
                    <span>다음</span>
                </a>
            </li>
        </ul>
    </div>
<!-- 페이징 처리 끝 -->

profile
백엔드 희망

0개의 댓글