springboot 21

[Spring Boot] Spring Batch의 실행 흐름을 내부 메타 테이블로 추적해보기

📍 개요Spring Batch를 도입하고 스키마를 보면 아래와 같이 다양한 table이 추가로 생성되어 있는 것을 볼 수 있다.자동으로 생성되는 이 9개의 테이블은 각각 언제 생성되고 하는 역할이 무엇일까? 📍 왜 생길까?이 테이블들은 Spring Batch의 핵심 기능인 “이력 관리, 실행 추적”을 위한 저장소다.Batch는 단순히 데이터를 처리하는 데서 그치지 않고,언제 실행됐는지어떤 Job 파라미터로 실행됐는지성공했는지 실패했는지실패했으면 왜 실패했는지를 모두 DB에 기록하고 관리한다.이 역할을 하는 것이 바로 위의 9개 테이블인 것. 📍 언제 생성되는 걸까?스프링 부트에서는 보통 아래 설정을 통해 이 테이블들을 자동으로 생성할 수 있다.spring: batch: jdbc: ..

springboot 2025.07.28

[Spring Boot] CSV 기반 공공데이터 적재 자동화: 성능과 정확성을 모두 잡는 방법

📍 개요공공데이터를 활용한 데이터 적재 파이프라인을 구축하는 초기 단계에서는 비교적 단순한 구조로 시스템을 설계했다.CSV 파일은 공공기관에서 주기적으로 제공되었고, 수집된 파일은 Python(Pandas)을 활용해 구조 정제, 이상값 보정 등 전처리 과정을 거쳤다.또한, placeId를 기준으로 Google Maps API 및 S3를 활용해 관련 이미지도 함께 수집·저장하는 구조였다.전처리된 데이터는 Spring Boot 기반의 애플리케이션에서 수동 또는 반자동으로 데이터베이스에 적재되었다.하지만 기존 로직은 새로운 CSV 파일이 들어올 때마다 전체 데이터를 다시 적재하는 방식이었기 때문에, 이미 존재하는 데이터도 중복 저장되는 문제가 발생했다.공공데이터는 자주 갱신되며, 제공되는 CSV 파일 역시 ..

springboot 2025.07.26

[SpringBoot] Spring Batch로 csv파일을 db에 저장해보자

📍개요https://inhooo00.tistory.com/entry/SpringBoot-Google-Places-API-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0 [SpringBoot] Google Places API 사용해보기📍개요프론트에게 좌표를 전달하기 위해서, 구글 API를 사용해서 주소값을 좌표값으로 변환하는 로직을 구현하고자 한다.코드로 구현하기 전 Places API를 호출해보겠다.  📍API 키 만들기https://dinhooo00.tistory.com 이전 글에서 Google places API를 통해 특정 장소의 다양한 정보들을 받아올 수 있었다.이를 파이썬 코드를 이용해서 추출한 뒤 (이 방법은 추후에..),맛집 리스트를 공공 데이터 포털에..

springboot 2025.03.08

[SpringBoot] Google Places API 사용해보기

📍개요프론트에게 좌표를 전달하기 위해서, 구글 API를 사용해서 주소값을 좌표값으로 변환하는 로직을 구현하고자 한다.코드로 구현하기 전 Places API를 호출해보겠다.  📍API 키 만들기https://developers.google.com/maps/documentation/places/web-service/overview?hl=ko 개요  |  Places API  |  Google for Developers사용자가 입력할 때 비즈니스, 주소 및 관심 장소와 같은 장소를 반환하여 텍스트 기반 지역 검색에 관한 예상 검색어 예상 검색어를 제공합니다.developers.google.comGoogle Maps Platform에 들어가서 "시작하기"를 누르면 api 키를 얻을 수 있다. 만약 복사하지 ..

springboot 2025.03.06

[SpringBoot] Discord WebHook 연동해보기

📍개요이번에 진행하는 프로젝트에서 신고하는 로직이 있습니다.이 로직을 서버에서 빠르게 인지하기 위해서 많이 사용하는 Discord와 연결해보고자 합니다.   📍디스코드 설정먼저 디스코드 알림을 위한 채널을 생성합니다.그 후 연동 -> 웹후크 -> 새 웹후크로 웹후크를 생성한 후, 웹후크 URL을 복사해줍니다.이제 이 URL를 사용해서 연결해주기만하면 끝!   📍코드로 구현하기package shop.babsim.babsim_betta.global.discord.dto;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;public record DiscordWebhookMessage( String content)..

springboot 2025.03.04

[SpringBoot] JPA, Hibernate, 그리고 Spring Data JPA 톺아보기

📍개요여러 프로젝트를 경험하면서 JPA로만 구현했었다. 구현하면서 듣는 말인 JPA와 Spring Data JPA의 차이점, 로그에는 뜨지만 무엇인지 정확히 모르는 Hibernate 등등.. 확실히 깊게 이해하고 있지는 않는 느낌이 들었다. 이번 기회에 Spring Boot에서 DB에 접근하기 위해 사용하는 JPA 기술을 톺아보려고 한다.   📍JPA란?JPA는 Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.여기서 중요히 봐야할 부분은 JPA는 인터페이스라는 것이다.스프링의 PSA에 의해서(POJO를 사용하면서 특정 기술을 사용하기 위해서)표준 인터페이스를 정해두었는데, 그중 orm을 사용하기 위해 만든 인터페이스가 바..

springboot 2025.02.19

[SpringBoot] @Transactional을 정확하게 알아보자

📍Transaction이란?필자는 단순하게 transaction을 데이터베이스에서 진행되는 하나의 단위라고만 알고 있었다. 이 transaction을 좀 더 자세하게 알아보자.transaction은 여러 작업을 하나의 논리적 단위로 묶어서 실행한다. 즉 1번부터 4번까지의 작업(여러 작업)을 하나로 묶어 문제없이 모두 성공하면 commit을, 중간에 문제가 발생했을 때 모든 작업을 롤백(rollback)한다.이렇게 하면 모든 작업이 수행되거나 or 모두 수행되지 않기 때문에 데이터 일관성을 유지할 수 있다.   📍프록시란?transaction과 함께 나오는 개념 중에 프록시란 개념이 있다.실제 객체에 대한 대리 객체를 생성하여, 호출을 가로채고 추가 작업(로깅, 트랜잭션 등)을 수행한 후 실제 객체에..

springboot 2025.01.15

[SpringBoot] N+1 문제와 해결 방법

📍N+1이 뭐지?조회 시 1개의 쿼리를 생각하고 설계를 했으나 나오지 않아도 되는 조회의 쿼리가 N개가 더 발생하는 문제. JPA의 경우에는 객체에 대해서 조회한다고 해도 다양한 연관관계들의 매핑에 의해서 관계가 맺어진 다른 객체가 함께 조회되는 경우에 N+1이 발생하게 된다. 예를 들어 jpql문으로 findById를 사용할 때에는 하나의 entity만 조회하기 때문에 문제가 없어 보인다.하지만 findByAll을 요청하는 것이라면 가져오는 entity마다 연관관계로 정의된 객체를 검색하게 된다. (즉시로딩 상황) 즉, 모든 User에 대해서 검색하고 싶어서 select 쿼리를 하나 날렸지만(1), 즉시로딩이 걸려있기 때문에 각각의 User가 가진 entity을 모두 검색한다(N)라는 N+1 문제가 ..

springboot 2025.01.10

[SpringBoot] 영속성 컨텍스트, 그리고 EntityManager

📍영속성 컨텍스트와 EntityManager? 왜 공부해야하지?영속성 컨텍스트와 EntityManager은 JPA의 핵심 개념이다.이 둘을 모른다면 JPA가 주는 이점을 100% 누릴 수 없다.(SQL을 사용하는 것보다 못한 상황이 일어난다)   📍영속성 컨텍스트(PersistenceContext)Entity를 영구 저장하는 환경이라는 뜻눈에 보이지 않는 논리적 개념애플리케이션과 DB 사이 객체를 보관하는 가상의 DB로 생각하기EntityManager를 통해 Entity를 영속성 컨텍스트에 보관, 관리   📍EntityManagerEntityManager를 통해 영속성 컨텍스트에 접근하고 관리EntityManager를 생성하면 그 안에 영속성 컨텍스트 있음EntityManagerFactory통해 요..

springboot 2025.01.09

[SpringBoot] 끄적끄적 프로젝트 쿼리 성능 개선을 해보자

📍성능 개선을 하게된 계기이 당시 기능 구현에만 집중해서 코드를 구현했기 때문에 성능을 고려하지 못했다.지인의 블로그를 읽는 중, 성능 관련 테스트 방법이 보이길래 나도 진행해 보게 되었다.처참하게 많이 발생하는 쿼리 수를 보고 쿼리 개선을 해야겠다는 생각과 함께 성능 개선 시작..(K6 툴 사용)-> 지인 블로그https://velog.io/@hyeok_1212/%EC%A1%B0%ED%9A%8C%EC%88%98-%EC%A0%95%ED%95%A9%EC%84%B1 조회수 기능 구현 (동시성 이슈)조회수는 사용자가 콘텐츠에 대한 관심을 가장 직관적으로 확인할 수 있는 지표에요. 서비스의 품질과 사용자 경험에 긍정적인 영향을 주는 기능이지만, 단순한 구현은 신뢰도를 떨어뜨릴 위험velog.io   📍기존 ..

springboot 2025.01.06