springboot 19

[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

[SpringBoot] QueryDSL 그게 뭔데 다들 쓰는거지?

📍Query DSL ?DSL:특정 도메인에서 발생하는 문제를 효과적으로 해결하기 위해 설계된 언어. Query DSL : DSL 언어를 제공해주는 라이브러리.즉,  쿼리를 타입 안전하게 자바 문법으로 작성, 메서드 체이닝으로 가독성 상향, 단순하고 간결함을 위해서 사용한다.   📍타입이 왜 안전할까?@Entity가 붙은 클래스에 맞춰서 QClass가 컴파일 타임에 자동으로 생성된다.@Entitypublic class User { @Id private Long id; private String name; private Integer age;}public class QUser extends EntityPathBase { public final StringPath name = c..

springboot 2024.12.28

[SpringBoot] 웹소켓으로 채팅하고 채팅방 관리하기

📍HTTP VS WebSocket일반적인 서버와의 통신인 HTTP는 요청이 오면 응답을 반환하는 구조입니다.즉 채팅같이 실시간적으로 변하는 로직에는 쉴새없이 HTTP로 API를 호출해야하는 상황입니다.이를 위해 연결지향을 이용한 2가지 해결책이 존재합니다.- Server-Sent Evnet- WebSocket저희는 둘 중 웹소켓을 이용해볼 예정입니다.   📍WebSocket?웹소켓은 쉽게 말해 연결을 유지한다고 생각하면 됩니다.처음 핸드셰이크를 통해 연결을 생성하면 이후에 필요한 메세지만 주고받기에 주고받는 데이터의 양에서 차이가 많이 납니다.   📍SpringBoot로 Websocket 구현해보기1️⃣ WebSocketConfig@Configuration@EnableWebSocket@Require..

springboot 2024.11.23