본문 바로가기
  • 개발하는 곰돌이

Development61

[토이프로젝트] KBO 경기 일정 수집하기(3) - 멀티 스레드 기반의 경기 정보 병렬 수집 목차/pages/KBO-경기-일정-수집하기-시리즈병렬 프로세스 생각한 계기KBO 공식 사이트 경기 일정 페이지의 특성 상 한 번에 1개의 시리즈의 한달치 경기 일정만 조회할 수 있습니다. 즉, 1년 전체 일정을 수집하려면 시범경기, 정규시즌, 포스트시즌 각각 1월부터 12월까지 총 36번의 요청이 필요한 것이죠. 이 요청을 동기 방식으로 처리한다면 이전 요청이 끝나야 다음 요청이 실행되기 때문에 36번의 요청을 모두 처리하기 까지 시간이 꽤 많이 걸립니다. 그렇다보니 비동기 요청으로 요청 시간을 줄이면 어떨까 하는 생각이 든거죠. 물론 시범경기는 보통 3월 한달만 진행되고 포스트시즌은 정규시즌이 끝난 후 약 한달 정도만 진행되는 만큼 엄격히 따지면 요청 횟수를 줄일 수 있긴 합니다. 그래도 우선은 코드 .. 2025. 12. 9.
[토이프로젝트] KBO 경기 일정 수집하기(2) - Upsert를 통한 중복 데이터 처리 목차/pages/KBO-경기-일정-수집하기-시리즈Upsert의 필요성1편에서 경기 정보를 수집하고 DB에 저장했지만 경기 정보는 매일매일 바뀌게됩니다. 시즌 초에 전체 일정이 나오지만 매일 경기를 진행하면서 경기 정보는 수시로 바뀝니다. 게다가 날씨에 따라 취소 경기가 발생하여 더블헤더 경기가 편성되거나 추후 잔여경기 일정으로 편성될 수도 있죠. 따라서 수집된 경기 목록 중에서 DB에 저장된 경기는 업데이트하고 새로운 경기만 저장하는 Upsert 전략이 필요합니다.Upsert 전략을 구성하자!우선 어떻게 Upsert 전략을 구성할지 생각해봤습니다. KBO 웹사이트에서 경기 정보를 수집하여 파싱하면 경기 정보 엔티티 객체가 모인 리스트가 생성됩니다. 이 경기 정보 객체들과 중복되는 레코드가 DB에 저장되어.. 2025. 12. 1.
[토이프로젝트] KBO 경기 일정 수집하기(1) - 데이터 크롤링과 파싱(With 스프링부트 + Playwright) 목차/pages/KBO-경기-일정-수집하기-시리즈계기평소에 야구를 좋아하다 보니 경기 일정이나 결과를 데이터로 뭔가 해보면 어떨까 하는 생각이 들었습니다. 당장 데이터로 뭘 할지는 생각해보지 않았지만 그래도 일단 데이터를 수집해두면 뭐라도 하지 않을까 싶어 내친김에 시도해봤습니다. 처음에는 개발자 센터 같은곳에서 제공하는 API가 있나 찾아봤는데 아무래도 KBO는 개발자 센터나 오픈 API를 제공하지 않는 모양이더라구요. 그래서 KBO 공식 사이트를 크롤링하여 데이터를 수집해봐겠다는 생각을 하게 됐습니다.robots.txt 정책 확인 하기특정 웹사이트를 크롤링하려면 먼저 해당 사이트의 robots.txt 파일을 확인해서 크롤링을 허용하거나 허용하지 않는 경로를 확인해야 한다고 합니다. 물론 robots... 2025. 11. 25.
[IntelliJ] 인텔리제이 2025.2 이후 Gradle 콘솔로 실행되는 문제 인텔리제이를 2025.2 버전으로 업데이트한 이후로 Gradle 프로젝트의 main()을 실행할 때 Gradle 콘솔로 실행되는 문제가 발생했습니다.기존에는 이렇게 실행되던게 이렇게 바뀌어버린 것이죠. 반면에 스프링부트 프로젝트는 빌드 도구가 Gradle이라도 여전히 인텔리제이 콘솔로 실행되는 것을 확인할 수 있었습니다. 개인적으로 Gradle 콘솔은 소스코드 실행 결과를 보기엔 굉장히 불친절한 콘솔이라고 생각해서 기존 방식을 사용할 수 없는지 YouTrack에서 관련 정보를 찾아보니, 일부 사용자들이 자바/코틀린 프로젝트가 Gradle을 사용하는지 아닌지 구분하기 어렵다는 의견이 있어서 변경되었다는 내용을 찾을 수 있었습니다.이에 대해 기존 방식을 사용하고 싶은 사용자들은 설정이 가능하다고 합니다. [.. 2025. 8. 28.
[REST] 실무에서의 PUT과 PATCH에 대한 개인적인 생각 정리 목차들어가기 전에REST 아키텍처에 대해 처음 공부할 때, 리소스의 수정을 나타내는 HTTP 메소드로 PUT과 PATCH가 언급됩니다. 흔히 PUT은 리소스의 전체 속성을 요청으로 보내진 데이터로 대체하고, 요청으로 전달되지 않은 속성은 null로 대체한다고 합니다. PATCH는 요청으로 전달된 속성만 수정한다고 이야기하죠. 하지만 막상 실무에 들어가보면 실제로 리소스의 일부 속성을 수정하는 API라도 PATCH로 호출하는 모습을 찾아보기 매우 어렵습니다. 오히려 리소스의 일부 속성만 수정하는 API라도 PUT으로 호출하는 경우가 많죠. 실무에서의 PUT과 PATCH에 대해 개인적인 생각을 정리해보려고 합니다.어느 관점에서 볼 것인가?PUT과 PATCH는 사실 관점의 차이로 볼 수 있지 않을까 싶습니다... 2025. 5. 23.
[Spring] String을 반환할 때 ResponseBodyAdvice로 공통 응답 포맷을 적용하면 발생하는 문제 해결해보기 목차들어가기 전에이전 글에서 String 타입을 반환하는 컨트롤러 메소드는 응답 본문을 작성할 때 StringHttpMessageConverter를 사용하기 때문에 ResponseBodyAdvice를 사용해서 공통 응답 포맷을 적용하기 어렵다는 내용을 다뤘습니다. 그래서 String 타입을 반환하는 컨트롤러 메소드는 공통 응답 적용 대상에서 제외하는 식으로 처리했죠. 잠깐 언급하고 넘어간 것처럼 String 타입을 반환하는 메소드에 공통 응답 포맷을 적용하는 방법이 있긴 합니다. 다만, 이 방법은 HTTP 응답이 작성되기 전에 컨트롤러 메소드의 반환값을 조작해야 하기 때문에 과정이 조금 복잡하죠. 이번에는 ResponseBodyAdvice를 사용해서 공통 응답 포맷을 적용할 때 String 타입을 반환하.. 2025. 4. 11.
[Spring] ResponseBodyAdvice를 사용해서 API에 공통 응답 포맷 적용하기 목차들어가기 전에프로젝트를 시작하게 되면 클라이언트가 서버에서 받은 응답을 원활하게 처리하도록 하기 위해 공통 응답으로 사용할 JSON 포맷을 정해서 봉투 패턴을 사용하는 경우가 많습니다.공통 응답 포맷을 적용하기 위해 컨트롤러 메소드의 반환 타입을 모두 공통 응답 DTO로 작성하게 됩니다. 문제는 컨트롤러 메소드를 작성할 때마다 매번 반환 객체를 공통 응답 DTO로 감싸줘야 해서 귀찮기도 하고, 실수로 누락할 수도 있다는 거죠. 그러다보니 자연스럽게 전역적으로 처리할 수 있을지 고민하게 됩니다. 이럴 때 사용할 수 있는 ResponseBodyAdvice에 대해 알아봅시다. 본문의 내용에서 다루는 코드는 Github 레포지토리에서 확인하실 수 있습니다.ResponseBodyAdviceResponseBod.. 2025. 2. 25.
[IntelliJ] Remote JVM Debug를 사용해서 서버를 원격으로 디버깅 하기 목차들어가기 전에프로젝트를 개발하다보면 테스트 코드로 검증을 했다고 하더라도 로컬 환경이나 서버가 배포될 환경에서 애플리케이션을 실행했을 때 의도대로 동작하지 않는 경우가 발생합니다. 로컬 환경이라면 그냥 IDE의 디버그 모드를 사용해서 수정이 가능하지만 여러가지 이유로 로컬에서 테스트가 불가능한 로직은 개발 서버 등의 환경에 배포를 하고 테스트를 진행하다보니 일반적인 디버그가 어렵습니다. 이 때 IDE의 Remote JVM Debug 기능을 사용하면 서버에 배포된 애플리케이션이라도 로컬 환경에서 디버그 하듯이 디버그를 진행할 수 있습니다.Remote JVM Debug의 동작 원리자바의 디버거는 실행중인 애플리케이션에 디버거가 접속하여 동작합니다. IDE를 사용하여 디버깅을 하는 경우 위 그림에서 deb.. 2024. 10. 2.