💻 개발209 11/29 - TIL : MSA에서의 트랜잭션 모놀리식 환경에서는 일반적으로 하나의 중앙 집중식 데이터베이스를 사용하며, 이를 통해 트랜잭션 관리가 이루어진다. 하지만, MSA에서는 하나의 기능이 여러 마이크로 서비스에 걸쳐 수행된다.전체 트랜잭션이 마이크로 서비스의 물리적인 로컬 트랜잭션 여러개가 묶여서 만들어진다. 만약 일부 마이크로 서비스가 실패하면 데이터 일관성이 깨진다. 그럼 마이크로 서비스일 때는 트랜잭션을 어떻게 관리해야 할까? 마이크로 서비스일 때는 분산 트랜잭션이 필요하다. 각 서비스가 독립적인 데이터베이스를 가지고, 네트워크 지연 및 실패 가능성이 크기 때문이다. MSA 환경에서의 트랜잭션 관리 방법에는 크게 2가지가 있다. 이 2가지 방법에 대해 알아보자. | 2PC(Two-Phase Commit)2PC는 2단계에 걸쳐서 영.. 2024. 11. 29. 11/28 - TIL : 이벤트 소싱과 CQRS 이벤트 소싱과 CQRS에 대해 알아보자. 이벤트 소싱과 CQRS를 사용하면, 데이터 저장과 조회를 분리하여 시스템의 성능과 확장성을 향상시키는 데 도움을 준다고 한다. | 이벤트 소싱이벤트 소싱은 데이터 상태를 변경할 때, 변경된 최종 상태만 저장하는 것이 아니라, 변경 과정을 기록한 이벤트(Event)를 저장하는 방식이다. 데이터 상태 변화를 이벤트로 기록하고, 해당 이벤트들을 순차적으로 재생하여 현재 상태를 파악하는 방법이다. 이벤트 소싱에서는 데이터 변경 자체가 아닌 변경 이벤트(상태 변화)를 저장한다. 주문 생성: 사용자가 주문을 생성했다는 기록.결제 완료: 사용자가 결제를 완료했다는 상태 변화.주문 취소: 사용자가 주문을 취소했다는 기록. 이벤트 소싱에서 사용되는 개념들은 다음과 같다. 이벤트.. 2024. 11. 28. 11/26 - TIL : 분산 트랜잭션과 CQRS 데이터의 일관성을 유지하는 방법에는 여러가지가 있다. 그 중 분산 트랜잭션과 CQRS에 대해 알아보자. 분산 트랜잭션여러 독립적인 시스템등에서 데이터를 일관성 있게 처리하기 위해 하나의 트랜잭션처럼 동작하도록 설계된 트랜잭션이다.단일 트랜잭션이 여러 시스템에 걸쳐 발생할 때, 모든 시스템이 해당 트랜잭션을 성공적으로 완료하거나, 모든 시스템이 트랜잭션을 실패로 처리하도록 보장한다. +) 트랜잭션더보기트랜잭션은 데이터베이스의 상태를 변환하는 작업 단위, ACID를 만족해야 한다. 원자성(Atomicity) : 트랜잭션은 전부 성공하거나 전부 실패하여, 부분적인 작업 수행이 없는 것을 보장한다. 일관성(Consistency) : 트랜잭션이 완료된 후에도 데이터베이스는 모든 무결성 제약 조건을 유지한다. .. 2024. 11. 26. 11/25 - TIL : JPA와 N+1 JPA를 사용하다보면, N+1 문제는 한 번쯤 겪을 것이다. N+1 문제 : 연관관계로 매핑된 엔티티를 조회할 때, 추가적으로 N개의 쿼리가 실행되는 상황 (1번의 메인 쿼리와 N번의 추가 쿼리) 개발을 하면서 알고는 있었지만, 제대로 정리를 해본 적은 없는 것 같아 이번에 정리해보려고 한다. 예시와 함께 살펴보자.@Entitypublic class Member { @Id @GeneratedValue private Long Id; @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) private List orders = new ArrayList(); ...}@Entity@Table(name = "ORDERS.. 2024. 11. 25. 11/23 - TIL : Load Balancer와 API Gateway의 차이 Spring Cloud와 관련해서 공부를 하던 도중 Load Balancer와 API Gateway의 차이에 대해 알아보면 좋을 것 같아서 이에 대해 알아보고자 한다. 두 가지는 공통적으로 요청이 들어오면 분배하는 느낌이지만, 사실 차이점은 있다. 간단하게 요약을 해보자면, Load Balancer는 여러 서버 간의 트래픽을 균등하게 분산시켜 시스템의 안정성을 유지한다. 하지만, API 게이트웨이는 클라이언트의 요청을 적절한 내부 서비스로 라우팅을 하는 역할이다. Load Balancer우선 로드밸런서는 네트워크 트래픽을 여러 서버에 균등하게 분산시켜, 시스템의 부하를 관리한다. 이를 통해 서버 과부하를 방지하고, 서비스의 가용성과 성능을 향상시킨다. 로드 밸런서의 주요 기능은 다음과 같다. 트래픽.. 2024. 11. 23. 11/22 - TIL : 영속성 컨텍스트와 Transaction JPA를 공부하다보면 반드시 마주하게 되는 내용은 영속성 컨텍스트와 Transaction이다. ORM은 객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술이다.그리고 JPA는 ORM의 표준 인터페이스이다. JPA에서 중요한 개념으로 생각되는 영속성 컨텍스트에 대해 알아보자. 영속성 컨텍스트(Persistence Context) 영속성 컨텍스트는 엔티티의 상태를 관리하는 JPA의 핵심 개념으로, 특정 트랜잭션 범위 내에서 엔티티를 메모리에 저장하고 관리한다. 데이터베이스에서 조회되거나 저장된 엔티티 객체를 캐싱해두고, 동일한 엔티티에 대한 요청이 있을 때 데이터베이스를 다시 조회하지 않도록 최적화한다. 특징 :1차 캐시 : 동일한 영속성 컨텍스트 .. 2024. 11. 22. 11/21 - TIL : Spring Bean과 DIP, DI, Interface Spring에서 중요하다고 할 수 있는게 뭐가 있을까? 그것은.. Bean이다. Spring의 핵심 철학인 DI(Dependency Injection)과 IoC(Inversion of Control)의 중심에 있는 것이 Bean이다. Bean이 무엇이길래?! 먼저, 의존 역전 원칙(DIP : Dependency Inversion Principle), Interface, DI에 대해 우선 알아보자. DIP (Dependency Inversion Principle)DIP는 의존 역전 원칙으로 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안되며, 둘 다 추상화(인터페이스)에 의존해야 한다는 것이다. 이는 추상화된 인터페이스를 통해 상호작용해야 한다는 것이다. 상위 모듈은 인터페이스에 의존 하위 모듈은 인.. 2024. 11. 21. 11/20 - TIL : Spring Cloud와 Load Balancer Spring Cloud는 Spring Framework 기반의 클라우드 네이티브 애플리케이션을 개발하기 위한 프로젝트이다. Spring Cloud는 분산 시스템에서 필요한 기능들을 추상화하여 제공하고 있으며, 마이크로서비스 아키텍처를 구현할 때 유용하게 사용된다. 주요 기능은 다음과 같다. 서비스 등록 및 디스커버리 마이크로서비스는 동적으로 확장되거나 축소되기 때문에 고정된 IP 대신 서비스 레지스트리를 통해 위치를 관리한다. 서비스 등록 : 서비스 인스턴스는 자신의 정보를 서비스 레지스트리에 등록한다. 서비스 디스커버리 : 다른 서비스가 필요한 서비스의 위치를 동적으로 조회한다. Spring Cloud에서의 구현 : Spring Cloud Netflix의 Eureka 사용 (Eureka Server .. 2024. 11. 20. 11/19 - TIL : Query DSL이 JPQL보다 보안이 우수하다? 오늘은 이제까지 진행한 개발물에 대한 미니 발표회가 있었던 날이다. 다른 팀의 발표를 듣던 도중 알아보면 좋을 만한 주제가 있었다. 다른 팀 중에 Query DSL에 대해 알아보던 중 JPQL보다 Query DSL의 보안이 좋아서 사용했다라는 말이 있었다. Query DSL이 SQL Injection에 안전하다라고 하셨다. 이제까지 나는 Query DSL을 동적 쿼리를 처리하기 위해 사용했었다. Query DSL이 Type Safety가 있어서 런타임 시점이 아닌 컴파일 시점에 오류를 잡아준다는 점을 알고 있었지만, 보안이 더 뛰어나다라는 점에 대해서는 잘 알지 못해서 이점에 대해 알아보고자 한다. 우선 Query DSL은 정적 타입을 사용해 SQL 같은 쿼리를 생성할 수 있도록 하는 오픈소스 프레.. 2024. 11. 19. 11/18 - TIL : 1차 프로젝트 마무리 오늘 1차 프로젝트인 주문 플랫폼 개발을 마무리하였다. 약 일주일 동안 [요구사항 파악] - [프로젝트 설계] - [개발] - [서비스 배포] 의 과정을 거쳤다. 프로젝트를 회고하면서 그래도 일주일이라는 시간 동안에 꽤 많은 것을 했다는 것을 알 수 있었고, 나는 이 프로젝트에서 어느 정도 기여를 했는가에 대해 많이 생각해볼 수 있었다. (그래도 나름 많이 했다고 생각!)Query DSL 적용, Cursor 기반 페이징, 단위 테스트 및 통합 테스트 작성, 클라우드 서비스 배포... 등등 오랜만에 프로젝트를 진행하며 팀원들과 의견을 주고 받으면서 다른 분들의 코드를 보면서 코드 리뷰도 하며 내 개발 습관과 프로젝트 설계방식을 돌아보게되었다. 무엇보다도 가장 좋았던 것은 다른 사람들과 의견 공유를 하.. 2024. 11. 18. 11/17 - TIL : Builder 패턴 개발을 하다가 생성자를 오버로딩하는 방식으로 생성을 하게 되는 경우가 많았다. 하지만, 이런 경우 생성자를 여러 개 생성하게 되면 매번 생성자의 파라미터들을 확인해야 하는 번거로움이 있어 다른 생성은 어떤지 알아보고자 한다. 객체를 생성하는 방법에는 여러가지가 있다. 그리고 그 중 하나가 빌더 패턴이다. 빌더 패턴이 뭘까? 빌더 패턴에 대해서 알아보자. Builder 패턴 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴이다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식 유연하게 다양한 타입의 인스턴스를 생성할 수 있다. (선택적 매개변수가 많은 상황에서 사용) 위처럼 유연하게 다양한 타입의 인스턴스.. 2024. 11. 17. 11/16 - TIL : 좋은 테스트 코드 상품 관련 API와 리뷰 관련 API의 테스트 코드를 작성하며, 테스트 코드를 작성하는 이유와 좋은 테스트 코드란 무엇인지에 대해 고민하게 되었다. 🧐 테스트 코드 왜 작성할까? 디버깅 비용 절감(문제가 되는 코드를 빠르게 파악하여 수정 가능하다.)회귀 버그(이전에 제대로 동작하던 기능에 문제가 생김)에 대한 관리와 대처 코드에 대한 이해 (담당 개발자뿐만 아니라, 동료들의 이해를 도울 수 있다.)좋은 코드인지에 대한 고민과 검증 (좋은 코드는 테스트하기도 좋다고 한다.) 내가 생각하는 테스트 코드를 작성하는 이유는 위의 이유라고 생각한다. 테스트 코드를 직접 작성하면서 특히 네 번째 이유에 깊이 공감하게 되었다. 테스트 코드를 작성하는 과정에서 내 코드의 결합도가 높은가? 유연하게 대응할 수 있는 .. 2024. 11. 16. 이전 1 2 3 4 5 ··· 18 다음