- 뤼튼 캐릭터 크롤링31514오늘은 뤼튼 홈페이지에서 캐릭터 데이터를 크롤링하면서 부딪혔던 문제들에 대해 글을 쓰려고 합니다. 기능 요구사항위 이미지처럼 뤼튼에는 여러 캐릭터가 있습니다.여기서 이름, 썸네일 이미지, 설명, 만든 사람을 추출합니다. 그리고 캐릭터를 클릭하면 볼 수 있는 첫 메시지 또한 가져오고 이를 MySQL에 저장하는 간단한 기능입니다. 사용한 기술언어 : Python크롤링 도구 : Playwright오케스트레이션 툴 : Docker패키징 : pyproject참고 사항뤼튼은 캐릭터를 가상 스크롤링 기술을 사용하여, 동적으로 렌더링합니다.크롤링보다 더 좋은 방법은 뤼튼이 웹 사이트에 데이터를 전달하는 API의 패턴을 찾아보는 것이 더 좋습니다.뤼튼은 next_cursor를 사용하여 캐릭터 정보를 담고 있는 API를 ..
- 2024-10-13 23:06:46
- 10장 - 인덱스 사용31514RDB에서 사용하는 인덱스는 구조에 따라 다음과 같이 세 가지로 분류할 수 있다.B-tree 인덱스비트맵 인덱스해시 인덱스B-tree 인덱스데이터를 트리 구조로 저장하는 형태의 인덱스이다.균형잡힌 뛰어난 범용성을 인정받아 가장 많이 사용된다. 사실 대부분의 데이터베이스는 트리의 리프 노드에만 키 값을 저장하는 B+tree를 채택한다.B+tree는 B-tree에 비해 검색을 보다 효율적으로 만든 알고리즘이다. 하지만 본질적인 특징은 B-tree와 B+tree가 다르지 않다. 기타 인덱스비트맵 인덱스는 데이터를 비트 플래그로 변환해서 저장하는 형태의 인덱스로, 카디널리티가 낮은 필드에 대해 효과를 발휘한다.하지만 갱신할 때 오버헤드가 너무 크기 때문에 BI/DWH 용도로 사용된다. 해시 인덱스는 키를 해시 ..
- 2024-10-04 13:05:28
- [MySQL] DELETE & UPDATE31514MySQL은 데이터의 무결성과 잠재적인 충돌을 방지하기 위해 UPDATE나 DELETE 작업을 수행할 때, 해당 테이블에 잠금을 설정한다. delete from personwhere id not in ( select min(id) from person group by email) with cte as( select min(id) id from person group by email)delete from personwhere id not in (select id from cte) DELETE p1FROM person p1LEFT JOIN ( SELECT MIN(id) AS min_id FROM person GROUP BY email) p2 ON p1.id ..
- 2024-10-04 11:20:59
- 멀티 프로세싱 & 멀티 스레딩 & 비동기 처리31514이 글은 파이썬에서 멀티 프로세싱, 멀티 스레딩, 비동기 처리를 적재적소에 사용하기 위해 각각의 개념과 적합한 경우를 알아보는 글이다. 멀티 스레딩멀티 스레딩은 하나의 프로세스 안에서 여러 개의 스레드를 동시에 실행하는 방식이다.스레드는 동일한 메모리 공간을 공유하지만, 독립적으로 실행될 수 있다. 멀티 스레딩은 주로 I/O 바운드 작업에 적합하다.I/O 바운드 작업은 네트워크 요청, 파일 읽기/쓰기 등을 말한다. 파이썬에서 멀티 스레딩이 CPU 바운드 작업이 적합하지 않은 이유는 GIL(Global Interpreter Lock) 때문이다.파이썬은 모든 것이 객체로 동작하고, 각 객체는 참조 횟수(Reference Count)를 저장하기 위한 필드를 가지고 있다.파이썬의 객체는 어디서 참조되느냐에 따..
- 2024-10-02 13:22:27
- 9장 - 갱신과 데이터 모델31514NULL 값 다루기만약 테이블에 존재하는 NULL 값이 특정 규칙을 갖는다면, 반복계를 사용하여 NULL 값을 채우는 것보다 집합계를 사용하는 것이 더 좋다.다중 필드 사용하기update ScoreCols set score_en = (select score from ScoreRows SR where SR.student_id = ScoreCols.student_id and subject = '영어'), score_nl = (select score from ScoreRows SR where SR.student_id = ScoreCols.stud..
- 2024-09-30 17:24:34
- 하둡 기초 개념31514대용량 분산 서비스가 필요한 이유대용량 데이터를 손실 없이 보관하기 위해SQL과 같이 구조적 데이터 뿐 아니라, 비구조화/반구조화 데이터를 처리하기 위해순차적 처리보다는 병렬 처리가 더 빠르니까대용량 분산 서비스의 필요 조건분산 파일 시스템과 분산 컴퓨팅 시스템몇 대의 노드(서버)가 고장나도 신뢰성을 유지할 수 있는 Fault Tolerance용이한 확장하둡 1.0HDFS(분산 파일 시스템)과 MapReduce(분산 컴퓨팅 시스템)으로 구성하지만 MapReduce가 너무 저수준이라 사용자들이 어려움 호소MapReduce 위에 고수준의 프레임워크 Pig, Hive, Presto 등 출현하둡 2.0MapReduce 대신 YARNYARN은 고수준 프레임워크를 사용하는 사용자들을 위해 조금 더 범용적인 자원 관..
- 2024-09-30 12:46:41
- 8장 - SQL의 순서31514프로그래밍을 할 때, 특정 순서를 가진 데이터를 다루는 일이 자주 있다.그런데 SQL은 전통적으로 순번을 다루기 위한 기능을 가지고 있지 않다.하지만 실제로는 레코드에 적당한 순번을 붙여야 하는 경우가 많은데, 최근 SQL은 순서와 순번을 다루기 위한 기능들을 추가하고 있다.결과적으로 현대의 SQL은 전통적인 집합 지향적 성향에 절차 지향적 생각이 섞인, 하이브리드 언어로 변화하고 있다.레코드에 순번 붙히기레코드에 순번을 붙이는 방법은 크게 두 가지가 있다.윈도우 함수를 사용하는 방법과 상관 서브쿼리를 사용하는 방법인데, 보통 윈도우 함수의 성능이 더 좋고 가독성도 뛰어나기 때문에 여기서는 윈도우 함수 예시만 보여준다.select student_id, row_number() over (orde..
- 2024-09-27 16:18:27
- 새로운 웹 크롤링 도구 Playwright31514최근 셀레니움을 사용해서 웹 페이지를 크롤링하던 중, 아래와 같은 문제에 부딪혔다.StaleElementReferenceException 오류로 인한 신뢰성 감소크롬 드라이버가 멈춰 무한루프에 빠지는 문제문제를 해결하기 위해 다음과 같은 과정을 수행했다.특정 요소가 로딩되는 시간을 명시적으로 지정하기time.sleep()을 사용하여 충분한 대기 시간 보장하기StaleElementReferenceException 오류가 발생하면 잠깐의 대기 시간을 갖고 재시도하기그럼에도 불구하고 코드의 실행 시간만 증가할 뿐 문제는 해결되지 않았다.계속해서 고민하던 중 "내가 너무 하나의 도구에만 의존하고 있는 건 아닐까?"라는 생각이 들었다.그 결과 도입한 도구는 Playwright이다. Playwright이란?Play..
- 2024-09-27 13:40:28
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)