본문 바로가기

Programming Language/Spring18

[Spring] The best way to use the Spring Transactional annotation 안녕하세요. 이번 포스팅에서는 스프링의 @Transactional 애노테이션의 적절한 사용 방법에 대해 좋은 글이 있어서 해당 글을 번역하고 추가적인 설명을 작성해보았습니다. 해당 포스팅에서 참조한 원문은 여기를 참조하실 수 있습니다. 우선 Spring에서 사용하는 @Transaction 에 대해 알아보겠습니다. @Transactional @Transactional은 스프링에서 제공하는 애노테이션으로, 트랜잭션 경계를 정의하는데 사용됩니다. 트랜잭션은 여러 데이터베이스 연산을 한 단위로 묶어, 모든 연산이 성공적으로 완료되거나 아무것도 실행되지 않도록 하는 것 (All or Nothing)을 의미합니다. 스프링은 1.0 버전부터 개발자가 트랜잭션 경계를 선언적으로 정의할 수 있도록 AOP 기반의 트랜잭션.. 2023. 8. 12.
[Spring In Action] 14. 클라우드 구성 관리 요약 스프링 클라우드 구성 서버는 중앙 집중화된 구성 데이터 소스를 마이크로서비스 기반의 더 큰 애플리케이션을 구성하는 모든 마이크로서비스에 제공한다. 구성 서버가 제공하는 속성들은 백엔드 Git이나 Vault 리퍼지터리에서 유지, 관리된다. 모든 구성 서버 클라이언트에 제공되는 전역적인 속성들에 추가하여 구성 서버는 프로파일에 특정된 속성과 애플리케이션에 특정된 속성도 제공할 수 있다. 보안에 민감한 속성들은 백엔드 Git 리퍼지터리에 암호화하여 저장하거나 Vault 백엔드의 보안 속성으로 저장하여 보안을 유지할 수 있다. 구성 서버 클라이언트는 새로운 속성으로 리프레시할 수 있다. 이때 액추에이터 엔드포인트를 통해 수동으로 리프레시하거나, 스프링 클라우드 버스와 Git 웹훅을 사용해서 자동으로 리프레.. 2023. 8. 6.
[Spring In Action] 12. 리액티브 데이터 퍼시스턴스 요약 스프링 데이터는 카산드라, 몽고DB, 카우치베이스, 레디스 데이터베이스의 리액티브 리퍼지터리를 지원한다. 스프링 데이터의 리액티브 리퍼지터리는 리액티브가 아닌 리퍼지터리와 동일한 프로그래밍 모델을 따른다. 단, Flux나 Mono와 같은 리액티브 타입을 사용한다. JPA 리퍼지터리와 같은 리액티브가 아닌 리퍼지터리는 Mono나 Flux를 사용하도록 조정할 수 있다. 그러나 데이터를 가져오거나 저장할 때 여전히 블로킹이 생긴다. 관계형이 아닌 데이터베이스를 사용하려면 해당 데이터베이스에서 데이터를 저장하는 방법에 맞게 데이터를 모델링하는 방법을 알아야 한다. 2023. 6. 5.
대용량 처리를 위한 MySQL 이해 대용량 서버를 구축하기 위해서는 어떤 것들을 알아야할까 Spring, MySQL, MongoDB, Redis, Kafka, MSA, ... 서버 개발자의 핵심은 데이터다. 대용량 시스템이 어려운 이유는 결국 많은 양의 데이터에서 시작된다. 어떻게 많은 양의 데이터를 안정적으로 삽입, 갱신, 조회할 것이냐? 정규화, 인덱스, 트랜잭션, 동시성 제어 웹의 기본 아키텍처 클라이언트 서버 데이터베이스 웹의 요구 사항이 점점 복잡해짐 클라이언트 웹 서버 웹 애플리케이션 서버 데이터베이스 웹 서버, 웹 애플리케이션 서버는 왜 나누어져 있을까? 태초에는 웹 서버만 있는 형태에서 웹의 복잡도가 증가함에 따라... 관심사의 분리 / 관측 가능한 시스템 / 효율적인 리소스 사용 대용량 시스템의 모습 왜 데이터베이스가 병목.. 2023. 5. 25.
Microservice와 Spring Cloud 소개 Cloud Native Architecture 확장 가능한 아키텍처 시스템의 수평적 확장에 유연 확장된 서버로 시스템의 부하 분산, 가용성 보장 시스템 또는 서비스 애플리케이션 단위의 패키지 (컨테이너 기반 패키지) 모니터링 탄력적 아키텍처 서비스 생성 - 통합 - 배포, 비즈니스 환경 변화에 대응 시간 단축 분할된 서비스 구조 무상태 통신 프로토콜 서비스의 추가와 삭제 자동으로 감지 변경된 서비스 요청에 따라 사용자 요청 처리 (동적 처리) 장애 격리 (Fault isolation) 특정 서비스에 오류가 발생해도 다른 서비스에 영향 주지 않음 Cloud Native Application Cloud Native Application - CI/CD 지속적인 통합 CI (Continuous Integrati.. 2023. 5. 5.
[Spring In Action] 11. 리액티브 API 개발하기 Chapter 11. REST API를 리액티브하게 사용하기 스프링 5가 RestTemplate의 리액티브 대안으로 WebClinet를 제공 WebClient는 외부 API로 요청을 할 때 리액티브 타입의 전송과 수신 모두를 한다. 리소스 얻기(GET) RestTemplate의 경우는 getForObject() Mono ingredient = WebClient.create() .get() .uri("http://localhost:8080/ingredients/{id}", ingredientId) .retrieve() .bodyToMono(Ingredient.class); ingredient.subscribe(i -> { ... }) 컬렉션에 저장된 값들을 반환하는 요청 Flux ingredients = .. 2023. 3. 24.
@Transaction(readOnly = true) 스프링 프레임워크에서 @Transaction(readOnly = true)로 트랜잭션을 읽기 전용 모드로 설정할 수 있다. @Transaction(readOnly = true)트랜잭션에 readOnly = true 옵션을 주면 스프링 프레임워크가 하이버네이트 세션 플러시 모드를 MANUAL로 설정한다. 이렇게 하면 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다. 따라서 트랜잭션을 커밋하더라도 영속성 컨텍스트가 플러시 되지 않아 엔티티의 등록, 수정, 삭제가 동작하지 않고 또한 읽기 전용으로 영속성 컨텍스트는 변경 감지를 위한 스냅샷을 보관하지 않으므로 성능이 향상된다. 즉 엔티티를 읽기 전용으로 조회하면 변경 감지를 위한 스냅샷을 유지하지 않아도 되고 영속성 컨텍스트를 플러시 하지 않아도 돼.. 2022. 11. 21.
[Spring] 스프링 트랜잭션 트랜잭션이란 트랜잭션은 완전히 성공 하거나 완전히 실패하는 일련의 논리적 작업 단위 입니다. @Transactional 애노테이션 스프링 트랜잭션은 프로그래밍 방식과 선언적 방식의 두가지 방식으로 구분할 수 있습니다. 프로그래밍 방식 TransactionTemplate 직접 PlatformTransactionManager 구현하기 트랜잭션 관리가 비즈니스 로직과 함께 사용되기 때문에 프로그래밍 방식으로는 널리 사용되지 않음 하지만 기능이 몇가지 밖에 없는 애플리케이션에서는 트랜잭션 프록시를 통한 부하가 중한 작업으로 느껴질 수 있어서 프로그래밍 방식이 사용될 수 있음 선언적 방식 (@Transactional) 메서드 혹은 구현체 클래스 상단에 @Transactional 애노테이션을 사용합니다. 클래스 수.. 2022. 9. 30.
[Spring] @Bean vs @Component @Bean과 @Component 차이 안녕하세요. 이번 시간에는 빈과 컴포넌트의 차이에 대해 알아보겠습니다. 먼저 스프링은 개발의 제어권이 스프링 컨테이너(IoC 컨테이너)에 있습니다. 그래서 이를 IoC (Inversion Of Control), 제어의 역전이라고 합니다. 스프링이 개발자 대신 객체를 제어하기 위해 객체들이 빈(Bean)으로 등록되어 있어야 합니다. 과거에는 객체를 빈으로 등록하기 위해 XML로 지정했어야 하는데 요즘은 애노테이션으로 간단하게 등록할 수 있습니다. @Bean @Bean은 메서드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록하는 애노테이션 입니다. @Configuration public class AppConfig { @Bean public .. 2022. 9. 28.
[Spring] 스프링 빈(Bean) 빈(Bean) Spring IoC 컨테이너가 관리하는 자바 객체 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아님 ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈 즉 Spring에서 빈은 ApplicationContext가 알고 있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고 있는 객체를 의미 어떻게 Spring IoC 컨테이너에 빈을 등록할까? 빈을 만드는 방법은 다양하지만 기본적으로 2가지 방법이 있음 Component Scanning 빈 설정 파일에 직접 빈을 등록 Component Scan @ComponentScan 애노테이션과 @Component 애노테이션을 사용해서 빈을 등록핟록 하는 방법 @ComponentScan 애노.. 2022. 5. 31.