Saga 패턴은 ACID 대신 BASE 원칙을 따르는 대표적인 기법 BASE는 Basically Available, Soft state, Eventual consistency의 약자야. 하나씩 간단하게 볼게!Basically Available(기본적인 가용성)시스템이 항상 완전한 일관성을 보장하지 않더라도, 항상 응답은 가능한 상태를 유지해. 일부 데이터가 최신이 아니더라도 서비스는 계속 동작하는 거지.Soft state(유연한 상태)데이터의 상태가 즉시 일관적이지 않아도 괜찮음. 각 서비스가 독립적으로 데이터를 관리하니까, 시스템 전체의 상태가 시간이 지나면서 변할 수 있어.Eventual consistency(최종적인 일관성)즉시 일관성을 포기하는 대신, 일정 시간이 지나면 결국 데이터가 일관된 상태..
카프카는 어떤것일까 내가 알기로는 카프카는 대규모 트래픽 환경에서 사용한다고 한다.생각해야 할것이 진짜 카프카가 대규모 트래픽 환경에서 좋은걸까? 좋다면 왜 좋은지 알고 있어야 한다고 생각한다.사가패턴이며, 이벤트 소싱이며 이런거 보다 진짜 중요한건 카프카가 왜 필요한지 여부에 대해 공부를 해야 한다고 생각한다.모든 기술이 그렇듯 다 탄생 배경이 있다. 그렇다는건 어긋난 방식으로 사용한다면 오히려 성능이 떨어질 수 도 있다는 뜻이 된다.이 글에서 어떻게 사용하는지에 대해는 자세하게 다루지 않을 수 도 있다. 이것도 보다 중요한건 왜 쓰고 언제 쓰는지가 훨씬더 중요하다 생각한다. 이제 본격적으로 시작해보자.카프카의 탄생 배경대규모 데이터 처리 필요성: 대규모 분산 시스템에서의 로그 처리와 실시간 데이터 스..
스프링 시큐리티 (Spring Security)는 스프링 기반 어플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크.보안과 관련해서 체계적으로 많은 옵션들을 제공해주기 때문에 개발자의 입장에서는 하나하나 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.특징과 구조보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있음Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작어노테이션을 통한 간단한 설정Spring Security는 기본적으로 세션 & 쿠키 방식으로 인증인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리인증 관리자는 UserNamePasswor..
스프링 이벤트(Spring Events)는 애플리케이션 내에서 컴포넌트 간의 느슨한 결합(loose coupling)을 유지하면서 비동기적 또는 동기적으로 메시지를 전달하는 메커니즘입니다.스프링의 Observer 패턴 기반으로 동작하며, 특정 이벤트가 발생했을 때 이를 감지하고, 이에 대한 처리를 수행하는 구조입니다.1. 스프링 이벤트의 구조Event (이벤트): 발생한 상황을 나타내는 객체. ApplicationEvent를 상속하거나 일반 POJO로도 이벤트를 정의 가능.Publisher (발행자): 이벤트를 발생시키는 주체. ApplicationEventPublisher를 사용해 이벤트를 발행.Listener (리스너): 이벤트를 구독하고 처리하는 주체. @EventListener 어노테이션으로 구현..
오늘 어제 학습한 DDD를 복습을 했다.DDD에는 중요한 개념이 2개가 나오는데다음과 같다.바운디드 컨텍스트: 컨텍스트의 경계를 나눈다?이름에서 부터 알수 있듯이 경계를 나눈것이다. 보통 컨텍스트는 문맥이라고 한다.그렇다면 DDD가 말하는 문맥이란 무엇일까에 대해 고민을 해보았다.어떤걸 경계로 나눈것이 좋을까?그래서 생각한것이 도메인이다. 도메인에 대한 영토, 분야, 영역, 범위를 뜻하는 단어라 한다고 한다.결국 바운디드 컨텍스트는 도메인별로 나눈것을 말한다는 것을 알 수 있다.그러면 어그리게이트는 어떤걸까?얘가 어떤 뜻을 내포하는지는 정확히 모르겠으나 내가 생각할때는 트랜잭션의 범위로 나눈것을 말하는 것같다.튜터님께 크로스 체크를 해서 내가 이해한게 맞는지 확인해보니 맞다고 하셨다.결국 바운디드 컨텍스..
오늘 특강으로 DDD를 학습하였다.많은 내용을 배웠지만 아직 정리가 덜된거 같다.강의에서 모놀로식에서 DDD로 전향하는 이유에 대해 다음과 같다고 하셨다.모놀리식을 MSA로 전환하고 싶은욕구ERD 설계 이외의 다른 설계 방식이 있지 않을까?아직은 정확하게 이해하기는 어렵지만바운디드 컨텍스트와 에그리거트 루트에 대한 용어를 학습하였다.바운디드 컨텍스트는 비즈니스 적으로 해결이 된다고 하셨구에그리거트 루트 같은 경우는 논리적인 단위로 묶어주는거라고 하셨다.아직 공부전이라 DDD를 이해하기는 어렵지만 조금씩 학습하면 되지 않을까 싶다.
첫 번째 프로젝트가 종료되었다.프로젝트에 힘을 많이 쓰지 않았음에도 생각보다 배운게 많은 시간이었던거 같다.짧지만 짧은 시간이었지만 그 시간동안 팀장으로써 최선을 다했다.초반에 스터디를 한다고 프로젝트를 냉팽겨치고 나왔던게 아직도 생각이 난다.스터디가 종료후에 erd나 api명세서를 확인했고 생각보다 잘 되어있어서 놀랬다.하지만 내가 팀장인데 이런식으로 빠지는건 좀 아니라는 생각을 했고 스터디원들에게 말해서 스터디를 종료하게 되었다.이 선택이 잘한선택인지는 잘모르겠지만 적어도 팀에 방해가 되고 싶지 않았다.그래서 팀원들이 질문을 하면 항상 내가 대답을 해주곤 한거 같다.근데 이 프로젝트가 많이 아쉬운거 같다.요구사항에 맞게 개발한건 좋은데 프로젝트를 한계를 둬서 개발을 한게 아닌가 하는 생각이 문득들었다..
git에 application.yml을 올리려고 하니 문제가 발생하였다.그건 바로 application.yml에 민감한 내용의 정보를 올렸다는 점이다.원래 같으면 ${}로 감싸서 환경변수로 사용했을텐데 그러지 않았다.요런식으로 사용하게 되면 환경변수를 세팅할 수 있다. 근데 배포는 jar파일로 말아서 배포가 되어진다.그니까 저렇게 사용할거면 jar파일로 말때 강제로 넣어줘야 한다는 뜻이다.근데 나는 java -jar xxx.java이렇게 사용하고 싶었다. 그러니까 jar파일을 실행시킬때 환경변수를 세팅하고 싶지 않았다.그래서 방법을 찾아보니.env파일을 만들라고 했다.찾아보니 루트에 만들라고 했다.그리고 env파일에 저 위내용을 집어넣고 돌려봤다.후..db가 자꾸안된다고 했다. 몇번의 시도를 해봤지만 결..
팀원중 한분이 레디스를 사용해야 된다고 하셨다.프로젝트가 한참지난 후였는데 이런 요청을 하신거 보니 가능할까 의심이 들어 여쭤보았다.어제 팀원들과 테스트를 마치고 다시 물어봤을때 일정상 문제가 없다고 하셨다.그래서 레디스를 넣기로 했다.이제 aws를 이용해서 레디스를 사용하기 위해 어떻게 하면 좋을지 고민해봤다.찾아보니 레디스는 aws자체에서 제공받을 수 있지만 ec2내에서 설치할 수 있다고 했다.생각해보니 ec2가 컴퓨터인데 설치가 안되는게 이상하긴했다.아무튼 ec2에 레디스를 설치하고 로컬로 레디스에 접근을 해보았다.되지 않았다.확인을 해보니 아웃바운드를 내가 설정하지 않아서 발생했던게 그 이유였다.암튼 이렇게 설정하고 다시 실행해봤는데 역시나 되지 않았다.무슨 문제인지 찾아보니ec2내에서 레디스를 ..
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)의 탄생 배경은 OOP(Object-Oriented Programming)의 한계를 보완하기 위한 필요성에서 출발했습니다.OOP는 객체 단위로 코드의 모듈화와 재사용성을 높였지만, 프로그램의 다양한 부분에서 공통적으로 필요하지만 특정 객체에 속하지 않는 기능을 처리하는 데 한계를 보였습니다.이러한 공통적인 기능을 "횡단 관심사(Cross-Cutting Concerns)"라고 합니다. 대표적인 예로는 로그 처리, 트랜잭션 관리, 보안, 예외 처리, 성능 모니터링 같은 것들이 있습니다. 이런 기능들은 여러 클래스와 메서드에서 반복적으로 등장하며, 중복 코드와 유지보수의 어려움을 초래합니다.AOP는 바로 이 횡단 관심사를 핵심 비..
개발 진척도는 다 된거 같아테스트를 하기위해 rds를 aws로 띄웠다. 하지만 이상하게도 잘 되지 않았다.확인해보니 내가 보안그룹을 설정하지 않았던것이 그 이유였다.암튼 그것을 설정을 마무리하고 RDS를 띄운후 테스트를 진행하였다.테스트 해보니 버그가 생각보다 많이 나왔다.테스트해보길 잘 했다라는 생각이 들었고어떤걸 수정할지 체크해봤다.그러다 고민이 생겼다.내가 주문파트인데 요런 시나리오를 생각해봤다.가게가 오픈되었기 때문에 주문을 했는데배달 도중에 가게가 문을 닫았다면...이때 배달은 완료가 되어야 하나??라는것이 고민이었다. 이걸 논의해보고 멘토님께 여쭤보니까 고건 가게 탓으로 돌려도 된다고 하셨다.생각해보니 그런거 같다.이 구현에 저런거 까지 신경쓸 필요는 없을거 같다는 생각이 들었다.이제 슬슬 전..
음... 공부할 시간은 없고 프로젝트는 진행하는데그래도 조금씩 프로젝트가 조금씩 완료가 되는거 같아 다행이다.내가 백준으로 문제를 풀고 있었는데https://www.acmicpc.net/problem/3273요 문제를 풀었다. 처음에 이 문제를 어떻게 접근할수 있을지 고민해봤다.처음에는 답이 안오다가 빼기를 이용하면 되지 않을까 라는 생각을했다.그래서 아무생각없이 arrayList로 데이터를 저장하고 2로 나눴기때문에 정렬을 진행해줬다.처음 코드는import java.util.*;public class Main { public static void main(String[] args) { List arr = new ArrayList(); Scanner sc = new Scan..