카카오 로그인 API 사용 방법 - 2025 ver (Java, Spring)
·
Spring
이 글은 과거(2023년 10월) 작성했던 글을 현재(2025년 12월)을 기준으로 리뉴얼 한 글이다.과거와 비교했을 때 달라진 점은 크게 없고, kakao에서 마이그레이션을 잘 해줘서 문제없지만, 사소하게 달라진 점들이 있다.예를들면 당시에는 사용자 email, 연령 등의 정보를 쉽게 얻을 수 있었는데, 지금은 비즈니스앱인증을 받아야 되는 등... 이런것들이 바뀌었다.2023.10.14 - [Spring] - [Spring] 카카오 로그인 API 사용 방법kakao developershttps://developers.kakao.com/ Kakao Developers카카오 API를 활용하여 다양한 어플리케이션을 개발해 보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다..
[Spring] ehcache 설정, 코드 기반 configuration
·
Spring
EH cache웹 애플리케이션에서 성능을 확보하기 위해 가장 먼저, 쉽게 도입할 수 있는 기술 중 하나가 캐싱(Cache)이다. 캐시는 반복적으로 조회되는 데이터를 메모리에 보관해 DB 부하를 줄이고, 응답속도를 빠르게 만드는 도구이다. 보통 Redis부터 떠오르는데, Caffeine, EhCache와 같은 로컬 캐싱 방법도 있다. 그 중 EhCache는 안정적이고, JVM에 최적화된 로컬 캐시로 널리 사용된다.외부 인프라(Redis 등)을 도입하지 않고, 간단하게 Spring Boot 설정만으로 캐싱을 도입할 수 있다는 장점이 있다. EhCache란?JVM 힙/오프힙 메모리 기반 캐싱디스크 저장 가능(옵션)JSR-108(JCache) 표준 지원Spring Cache 추상화(@Cacheable)와 통합되..
[Spring] 메모리 Queue + @Scheduling 배치 처리 - 부하 분산
·
Spring
대량으로 발생하는 사용자 행동 로그를 그때그때 DB insert 하게 되면 애플리케이션과 DB에 둘 다 부담이 커진다.로그가 초당 수십-수백건 씩 쌓이면 DB connection pool 고갈, 애플리케이션 성능 저하 등이 발생한다.일반적으로는 kafka, RabbitMQ 등 이벤트 / 메시지 기반 인프라를 이용하여 처리할 수 있지만 상황에 따라 애플리케이션 레벨에서 해결해야했다. 이 글에서는 다른 인프라를 추가하지 않고, 애플리케이션 레벨에서 로그를 모아뒀다가 Batch insert 하는 방법을 다룬다. 설계 과정문제 상황유저 행동 로그(일단은 페이지 이동, 클릭 등 이벤트)를 수집해야 하는 상황로그가 초당 수십-수백건 수집되면 DB 부하가 심해지고, 애플리케이션 부담이 커질 수 있음추가 인프라 도입(..
[Spring] @Transactional 전파수준 정리 - Propagation 예제코드로 테스트해보기
·
Spring
@Transactional 전파 수준이란?Spring에서는 @Transactional을 통해 트랜잭션을 선언적으로 쉽게 관리한다.대부분의 경우 기본 전파 수준인 REQUIRED만으로도 충분하지만, 하나의 서비스 메서드에서 또 다른 트랜잭션 메서드를 호출할 때, 전파 전략을 명확히 이해하고 설정하지 않으면 원치 않는 rollback 또는 commit이 발생할 수 있다. 트랜잭션 전파 수준은 “이미 존재하는 트랜잭션이 있는 상황에서 이 메서드를 새 트랜잭션으로 실행할 것인가, 아니면 기존 트랜잭션에 참여할 것인가”를 결정하는 설정하는 것이다. 트랜잭션 전파가 중요한 상황들주문 entity 저장 진행 중, 로그테이블에 기록해야 됨. -> 로그 저장 중 에러 발생한다고 비즈니스 로직을 롤백하면 안 됨서비스 내의..
[Spring] @RequestBody JSON 바인딩 원리와 Jackson 직렬화/역직렬화 과정 (MappingJackson2HttpMessageConverter)
·
Spring
@RequestBody Json 데이터 바인딩Frontend에서 Http Body에 Json 데이터를 담아서 보내면, Spring Boot Controller의 @RequestBody로 객체로 바인딩된다. 결론부터 말하자면 아래의 방법 중 하나로 바인딩 한다.기본 생성자 + Setter전체 필드 생성자 + @JsonCreator필드 직접 접근HttpMessageConverterSpring은 @RequestBody가 붙은 파라미터를 처리할 때 내부적으로 HttpMessageConverter를 사용한다.HandlerMethodArgumentResolver → RequestResponseBodyMethodProcessor → HttpMessageConverter 순으로 요청을 처리한다.JSON String은 ..
[JPA] fetchJoin시 MultipleBagFetchException 발생(카르테시안 곱)
·
Spring
카르케시안 곱(Cartesian Product) 란?Cartesian 곱은 2개의 테이블을 Join 할 때 모든 조합의 데이터를 생성하는 곱집합을 말한다.예를 들면 User를 참조하고 있는 Order 3개, Payment 5개가 있을 때, 총 15개의 결과가 나온다.아래(더 보기)는 카르테시안 곱을 처음 보는 분들을 위한 쿼리 예제입니다.더보기app_userSELECT * FROM app_user uwhere id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';ordersSELECT * FROM orderswhere user_id = '4a421c1c-8df2-4ef2-845d-07d9a216c114';paymentSELECT * FROM paymentwhere user_id ..
[Spring/Redis] Spring @Cacheable과 Redis를 이용한 메서드 레벨 캐싱
·
Spring
Spring의 Cache 추상화개발을 하다 보면, 동적으로 변하진 않는데, 자주 필요한 데이터들을 조회하는 API를 호출할 일이 종종 있다. 간단한 예시로 아래와 같은 상황이 있을 수 있다.Frontend에서 select-box의 값을 채우기 위한 data List 조회외부 API에서 특정 데이터를 조회하는데, 외부 API에서 제공하는 데이터의 갱신 주기가 길 때자주 호출되는 데이터이지만, 실시간으로 변하는 값이 아닐 때Spring은 자주 호출되는 메서드의 실행 결과를 캐시에 저장하고, 이후 동일한 요청이 들어오면 캐시 된 값을 반환하여 응답 속도를 높이고 시스템 부하를 줄일 수 있도록 캐싱 기능을 추상화하여 제공한다.캐시 구현체와 무관하게 사용할 수 있도록 @Cacheable, @CacheEvict, ..
[JPA] JPA 복합키 Entity Mapping @IdClass / @EmbeddedId
·
Spring
복합키(Composite key)관계형 데이터베이스에서 복합키(Composite Key)란, 두 개 이상의 컬럼을 조합하여 하나의 기본 키(Primary Key)로 사용하는 것을 의미한다. 단일 컬럼만으로는 데이터의 고유성을 보장할 수 없을 때, 여러 컬럼을 묶어 하나의 키로 사용하는 방식이다. 아래 테이블처럼, 주문번호와 상품번호 두개를 묶어야 하나의 고유한 key가 되는 경우를 말한다.이런 경우에 JPA에서 단일키를 사용할 때보다 복잡하고, 귀찮은 작업이 필요하다. 복합키가 꼭 필요하지 않다면, 단일키 전략을 사용하는 것이 낫다고 생각하지만,이미 존재하는 테이블을 엔티티 매핑 해야할 때가 있을것이다.복합키 매핑 시 특징key class에 Serializable을 구현해야된다.key class에 equ..