2025/06/06 33

[졸프] Spring batch, 크롤링 트러블슈팅

상황Permalink신경쓰지 못한 부분에서 에러가 나고 있었다.실패한 레코드들을 기록하고 있었는데, 일부 기록이 되지 않았다.Copy code120,103,crawlStep,119,2025-02-19 19:53:21.213935,2025-02-19 19:53:21.217935,2025-02-19 20:08:39.572548,COMPLETED,101,100,0,32,0,0,68,68,COMPLETED,"",2025-02-19 20:08:39.575546batch step에서는 68개의 레코드 실패 기록이 남아있었는데오늘 날짜로 기록된 실패 레코드가 36개밖에 없었다.실패하며 batch에서 rollback하고, 실패 레코드도 기록되지 않으면남아있는 레코드를 계속 다시 검색하는 무한 루프에 빠지니꽤 큰 문제였..

PROJECT 2025.06.06

[Spring] Query DSL!

사용 이유사용해 보고 느낀점은쿼리를 java 코드로런타임 에러를 잡을 수 있다중복되는 쿼리를 재사용할 수 있다동적 쿼리동적 쿼리를 다뤄본 적이 없어서 몰랐는데 이번 기회로 알게 되었다.쉽게 말해 분기에 따라 쿼리가 달라지는 경우.1번과 비슷하다설정Copy codeplugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.6' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'}group = 'study'version = '0.0.1-SNAPSHOT'java { toolchain { languageVersion..

SUMMARY/Spring 2025.06.06

[졸프] 데이터 수집: 네이버 지도 크롤링 + 공공데이터 - Spring Batch 활용

Spring batch가 무엇인지 작성한 글이 아닌어떻게 활용했는지에 대한 글입니다!!상황이번 프로젝트는 AI 기반 맛집 추천 프로젝트로, 데이터 수집이 매우 중요하다.API를 사용할까 하며 이런저런 계산도 해봤지만팀원들과 여러번의 회의 끝에 결국공공데이터 + 이 정보 기반으로 검색 크롤링이 방법이 최선이라는 결론에 도달했다.그리고 방학 기간부터 개발을 시작했는데크게 문제점이 3가지 발생했다.CSV : 오류, 속도크롤링 들어가기 전부터 쉽지 않았다.첫번째로 오류가 많이 발생했다.파일마다 컬럼 이름도 다르고,정보가 들쭉날쭉 했다.중요한건 어떤 레코드가 실패했는지 알수가 없었고, 안정적으로 모든 데이터를 db에 추가하기 힘들었다.두번째로 속도가 많이 느렸다.하나의 레코드를 읽고 처리해서 쓰는데 약 0.01초..

PROJECT 2025.06.06

[알고리즘] sliding window, two pointer (python)

투포인터, 슬라이딩 원도우를 혼용해서 쓰는데 알고리즘에서는 보통 투포인터로 사용하는 것 같다헷갈렸던 문법Copy codel = Counter(['a', 'b', 'c', 'a'])compare = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']missing = 4for component in compare: missing -= l[component] print(l) print(missing)counter에는 {‘a’: 2, ‘b’: 1, ‘c’: 1}가 들어있으니당연히 missing은 반복문이 끝난 후 0이 된다.Copy codefrom collections import Counterl = Counter(['a', 'b', 'c', 'a'])c..

ALGORITHM 2025.06.06

[졸프] OAuth: 앱 버전으로 수정, 최종 정리

기존 방법 - WEBPermalink이번에 주로 다룰 부분은 OAuth 백엔드를 구현할때 App과 Web을 위한OAuth 요청 방법의 차이Refresh token의 처리 차이구현해야할 부분의 차이특히 2번에서 전부터 고민이 많았는데, 이번 계기로 정리가 조금 되었다.Copy code @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) .formLogin(AbstractHttpConfigurer::disable) .h..

PROJECT 2025.06.06

[졸프] 협업의 어려움과 방향성

과거 프로젝트, 현재과거 프로젝트에서 느낀 협업의 어려운점은서로 생각하는 방향이 다름프론트엔드 화면 구성 견해 차이 발생어떤 작업을 해야할지 모르는 순간 발생이로 인해 개발 속도가 느려짐코드 통합특히 백엔드로 django를 사용했는데, migration 파일이 충돌했을때 힘들었다코드 리뷰 후에 merge 했지만, 버그 발생누군가 다른 팀원의 작업을 기다려야 하는 상황이 발생함그래서 이번 졸업프로젝트에서는 똑같은 상황을 겪지 않기 위해 나름의 조치를 해보았다.서로 생각하는 방향이 다름-> 회의를 더 자주하고, 단기 계획을 세운다.코드 통합-> Spring 사용, CI 구축누군가 다른 팀원의 작업을 기다려야 하는 상황이 발생함-> 도메인 주도 설계주 2회 회의, Agile 문제점 해결1주일 단위로 목표를 잡..

PROJECT 2025.06.06

[DB] PostgreSQL 덤프, 복구

배경데스크 탑으로 윈도우, 로컬 postgres노트북으로 맥, 도커 postgres 사용중에성능이 좋은 데스크탑으로 90만개 레코드를 추가하고노트북으로 옮기다 환경이 달라 조금 헤매서 정리하게 되었다.덤프윈도우 환경에서는 로컬 postgres여서 어려운 점이 없었다.pg_dump -h (호스트명) -U (유저명) -p (포트번호) -d (DB이름) > (덤프파일위치+파일명)나는 백업하고 싶은 위치에서pg_dump -U postgres -d [db_name] > [백업 이름].sql필자 명령어pg_dump -U postgres -d yumst > yumst_25_1_19.sql복구로컬 postgres는 쉬울듯 하다.psql -U postgres -d [db_name] 컨테이너 내부로 복사도커를 사용중이라면..

SUMMARY 2025.06.06

[Spring Boot] 모니터링

프로덕션 준비 기능프로덕션 준비 기능이란프로덕션 환경을 위해 준비해야 하는 비 기능적 요소이다.결국 개발 하는 이유가 사용자들에게 서비스를 제공하는 것이고장애는 항상 발생한다.(라고 지난 학기 데이터베이스 수업에서 아주 여러번 들었다)그래서 현재 진행중인 졸업 프로젝트에서 구현해 보려고 알아보던 중Spring Boot에서 제공하는 actuator를 알게 되었다.Actuator시스템을 움직이거나 제어하는데 쓰이는 기계장치라는 뜻으로기계공학 전공자들이 좋아하게 생겼다엔드포인트https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#actuator.endpoints주요 엔드포인트bean : 스프링 컨테이너에 등록된 스프링 빈을 보여준다.heal..

SUMMARY/Spring 2025.06.06

[알고리즘] Greedy (python)

그리디 알고리즘글로벌 최적을 찾기 위해 로컬 최적의 선택을 하는 휴리스틱 문제해결 알고리즘잘 작동하기 위해 2가지 조건이 있다탐욕선택 속성앞의 선택이 이후 선택에 영향을 주지 않는다최적 부분 구조첫줄에 적은것과 비슷한 의미. 로컬 최적이 글로벌 최적이 되는 경우이다.휴리스틱교수님이 휴리스틱에 대해 1시간 넘게 열정적으로 설명해 주셨던 기억이 난다.. 설명하며 되게 행복해 보이셨다합리적이고 체계적인 판단이 어려울 때, 필요 없을 때 빠르게 사용할 수 있는 간편추론의 방법알고리즘에서는 최적해가 될 가능성이 없는 답들을 탐색하지 않고 답의 후보개수를 줄이는 방법이라고 한다..가지치기 기법 (pruning)담금질 기법 (simulated annealing)유전 알고리즘 (genetic algorithm)대표적으..

ALGORITHM 2025.06.06

[블록체인] Lightning Network(2) - Invocies

Alice가 Dina의 팬이어서 donation이 하고 싶다. 이건 계속해서 하는 거래가 아니라 일회성이다. 이럴때 Lightning Network을 사용할 수 있는 방법이 있다. Announcing the ChannelAlice가 Dina에게 돈을 보내기 위해 최소한 Bob, Chan의 존재를 알고 있어야 하고그러기 위해 Bob, Chan이 channel을 announce 하는 것이다.즉 Dina에게 가는 경로를 제공하고 수수료를 받는다.단, unAnnounced channel이 있을 수 있다.이러면 존재를 알고 있는 node만 이용할 수 있을 것이다.이때 announce 하는 방법으로 gossip protocol을 사용한다. (모든 node가 서로의 정보를 공유하는 방법)단, 경로는 Alice가 찾아..

CS/BlockChain 2025.06.06