공부/Spring

공부/Spring

재시도를 위한 Spring Retry @Retryable

Spring RetryDB, 네트워크 문제, 동시성 등 일시적인 수행 실패로 인해 재수행 처리를 해야 하는 경우가 있다.이 때 try catch문과 반복문을 사용해서 직접 재시도 로직을 구현할 수도 있겠지만, 비즈니스 로직과의 관심사 분리가 어렵게 될 것이다.그런 문제는 AOP로 구현하면 해결되겠지만.. 귀찮을 것이다이러한 재처리 로직을 AOP를 통해 쉽게 적용할 수 있는 Spring 라이브러리가 있다는 것을 최근 업무 중 알게 되었다.Spring Retry 라이브러리는 Spring 어플리케이션에서의 재시도 기능을 제공한다.선언적으로도, 명령형으로도 설정할 수 있다.https://github.com/spring-projects/spring-retry GitHub - spring-projects/sprin..

공부/Spring

Spring은 어떻게 이벤트를 발행하고 구독하게 할까? (Spring 이벤트 동작 원리)

Spring Event Spring’s eventing mechanism is designed for simple communication between Spring beans within the same application context. However, for more sophisticated enterprise integration needs, the separately maintained Spring Integration project provides complete support for building lightweight, pattern-oriented, event-driven architectures that build upon the well-known Spring programming ..

공부/Spring

Jpa 이벤트를 사용해 일관성 있는 시간 정보 관리하기

현재 진행하고 있는 팀 프로젝트 서비스에서는, 최근에 업데이트된 지도를 메인 화면에 보여주고 있다. 우리 도메인에서 지도에는 사람들이 '핀'을 꽂을 수 있는데, 기존에 관리되는 지도의 '업데이트 일시'는 지도의 생성, 정보 수정 시에만 업데이트되고 있었다. 그래서 오래 전에 만들어진 지도이지만, 방금 핀이 추가되어도 이 지도를 메인 화면에서 빠르게 확인할 수 없었다. 지도 내 핀이 추가되거나, 핀을 수정했을 때에도 지도의 업데이트 일시에 반영될 필요가 있었다. 기존 지도의 updatedAt 외에, 사용자에게 보여줄 정보인 lastPinUpdatedAt 이라는 정보를 추가로 관리하기로 했다. PR 링크로 확인하기 컬럼의 추가 방법으로는 무엇이 있을까? 1. 지도를 조회할 때, 지도가 가진 핀들을 가져와 가..

공부/Spring

성능 향상을 위한 Hikari Connection Pool 설정 for MySQL (1)

Hikari Connection Pool DataSource 쪽 디버깅을 하다 보면 자주 접했던 이름이지만, 정확히 뭔지는 몰랐다. 2.0 버전부터, Spring Boot의 기본 DataSource로 사용되고 있는 Connection Pool 프레임워크이다. 더 정확히 말하자면, spring-boot-starter-jdbc 또는 spring-boot-starter-data-jpa "starters"를 사용하는 경우 자동적으로 Hikari CP에 대한 의존성 설정이 된다고 한다. DataSource? Connection Pool을 사용하면 미리 정해진 수만큼의 커넥션을 Pool에 만들어두고, 필요할 때마다 이를 꺼내 쓰고 반환한다. 커넥션은 생성 비용이 크기 때문에, 이와 같은 방식으로 연결 비용을 줄여,..

공부/Spring

Spring Boot의 로깅, 로깅을 왜 할까?

레벨2 미션에서 예외 처리를 할 때, 예측하지 못한 서버 오류가 발생할 경우에는 로그를 남겨주는 방식으로 처리하고 있었다. 하지만 '로그를 남긴다'는 게 어떤 행위인지, 또 어떤 도구를 사용해 할 수 있는지 잘 알지 못하고 있다는 것을 깨달았다. 그래서 이번 기회에 간단히라도 정리해보려고 한다. Log와 Logging 로그(log)는 컴퓨터의 처리 내용이나, 이용 상황을 시간의 흐름에 따라 기록한 것을 말한다. 어플리케이션에서의 로그는 실행 중 발생하는 다양한 이벤트에 대한 기록이라고 할 수 있다. Logging은 위와 같이 로그를 남기는 행위를 말한다. System.out.println()과 Logger의 차이 System.out.println()은 성능이 떨어진다. System.out.println(..

공부/Spring

[문제 해결] @AutoConfigureTestDatabase 설정으로 @JdbcTest에서 원하는 DB 사용하기

전제 장바구니 미션에서, H2 데이터베이스를 사용하고 있는데 리뷰어님이 알려주신 unsigned를 테이블의 id값에 붙여주기로 했다. (DDL에서 정수 타입에 unsigned를 붙이면, 음수 값을 허용하지 않고 양수값의 범위를 더 넓혀준다) 하지만 H2 SQL은 unsigned를 지원하지 않아서, MySQL 문법으로 동작하도록 applicaition.properties 파일에서 아래와 같이 H2의 Mode를 설정했다. spring.datasource.url=jdbc:h2:mem:shopping-cart-test;MODE=MYSQL 문제 상황 그런데 이를 설정한 뒤 테스트를 돌리니, @JdbcTest에서 예외가 발생했다. 잘못된 문법이어서 SQL문을 실행하지 못했고, 그로 인해 dataSource의 초기화..

공부/Spring

@RequestBody 사용을 위한 DTO의 조건을 정리해보자

학습 과정에서 작성한 글로, 잘못된 내용이 있을 수 있음을 미리 밝힙니다. 피드백은 항상 환영합니다.  Spring에서 HTTP 요청의 body를 그대로 자바 객체로 변환하고 싶을 때, 핸들러 메서드의 매개변수에 @RequestBody 어노테이션을 붙여준다. 이 때 변환하고자 하는 자바 객체의 타입(클래스)을 매개변수로 둔다. 이 클래스를 DTO라고 했을 때, @RequestBody를 사용할 수 있는 DTO의 조건이 어떻게 되는지 정리해보려고 한다. 요청 파라미터 또는 Form-Data(이 역시 최종적으로는 key=value 요청 파라미터로 붙어서 나간다)로 요청할 때에는 body에 값을 담지 않으므로 이 어노테이션을 사용하지 않는다. 주로 XML 또는 json 형식의 content-type으로 요청해..

공부/Spring

@Service, @Repository 사용 이유에 대한 고찰 + PSA

학습 과정에서 작성한 글로, 잘못된 내용에 대한 지적 또는 피드백 환영합니다! @Controller, @Service, @Repository Spring 프레임워크에서 제공하는 어노테이션 중 @Controller, @Service, @Repository 는 @Component를 상속하는, 웹MVC 계층을 명시하기 위한 어노테이션이다. @Controller 어노테이션은, 다른 어노테이션과 함께 사용하여 요청과 메서드를 매핑할 수 있다. 이는 직접 사용해보면서 금방 알 수 있었다. 그런데 나머지 두 어노테이션은? @Component와 다를 바 없지만 그저 명시만을 위해 다른 이름을 가지는 것인지, 다른 특별한 기능이 있는지 궁금했다. @Repository 어노테이션이 지원하는 기능 @Repository 어노..

d02
'공부/Spring' 카테고리의 글 목록