개요AWS RDS Proxy은 "DB Connection Pool Management" 또는 "Automatic Failover를 위한 Proxy" 기능을 제공합니다. 결국, AWS RDS Proxy를 사용하는 이유는 HA(High Availability)를 구현하기 위함입니다. Solution을 사용하기 앞서서, HA(High Availability)를 위한 Multi-AZ(Multi Availability Zone) 개념을 시작으로 이야기를 풀어가보겠습니다. RDS는 HA(High Availability)를 위해서 Multi-AZ(Multi Availability Zone)를 권장합니다. Downtime 없는 DB Instance를 사용하기 위함입니다. Multi-AZ를 통한 DB 구성과 Applic..
이야기에 앞서서... Spring Framework에서 제공하는 @Autowired나 @Qualifier를 이용해서 객체를 찾아서 DI(Dependency Injection)해왔습니다. 물론 Java에서도 @Inject, @Resource를 제공해주어서 DI(Dependency Injection)를 할 수 있었습니다. 우선, DI는 IoC(Inversion of Control)의 핵심 원리를 구현하는 개념이라고 할 수 있습니다. 간단하게 IoC(Inversion of Control)란? : IoC의 핵심은 기존의 Programing code 안에 들어가 있던 객체의 생성/관리를 Spring Container에게 위임하여 객체의 생명주기를 관리하게 하는 것입니다. 관리하는 객체의 단위를 Bean이라고 명명..
애플리케이션을 개발하다 보면, 보통 @Transactional을 사용해서 Transaction을 사용합니다. 관습적으로 사용하다 보니, 내부적으로 어떻게 돌아가는지 원리에 대해서만 관심을 가졌습니다. 하지만 여기에서는 조금 더 들어가서 살펴보려고 합니다. Transaction은 두 가지 형태로 구현할 수 있습니다. Programmatic Transaction 방식 : 직접 코드에서 Transaction을 구현하는 방식 Declarative Transaction 방식 : 원하는 Scope에서 Annotation을 선언하는 방식 여기서 이야기하려고 하는 주제는 2.Declarative Transaction방식입니다. 여기서 다시 "2.Declarative Transaction"의 종류는 다음 두 가지로 나뉩..
스프링을 사용하면서 많은 서비스들이 트랜잭션을 단위로 하는 비즈니스 로직을 구현합니다. 저는 비즈니스 로직을 구현하는 과정에서 많이들 놓치는 Exception이 발생 상황에 대해서 살펴보려고 합니다. 가장 중요한 것은 Exception 타입에 따라서 어떻게 비즈니스 로직이 진행될지 판단하고, 처리하는 것입니다. 쿠팡 사용자 회원가입 기능을 예로 들겠습니다. 가입 시에 사용자에게 쿠폰을 발급하는 경우가 존재할 수 있습니다. 사용자가 가입하는 도중에 원인 모를 상황이 발생할 수 있습니다. 시스템이 셧다운 되거나, 메모리를 초과할 수도 있고, 또는 개발 단계에서 잘못된 구현으로 트랜잭션이 완료되지 못할 수 있습니다. 여기서 우리가 구분해야 하는 부분이 있습니다. Error와 Exception의 구분입니다. -..
JPA(Java Persistence API)를 사용하면서 더티 체킹과 트랜잭션의 관계에 대해서 알고 있지 않으면, 비즈니스 로직에서 다루는 엔티티 데이터가 꼬이는 경우가 발생합니다. 데이터가 꼬이는 경우를 방지하려면, 더티 체킹(Dirty Checking)이 어떤 상황에 사용이 되는지 알고 있어야 합니다. 여기서는 더티 체킹이 어떤 상황에서 발생하는지 확인해보려고 합니다. 더티 체킹(Dirty Checking)이란? JPA는 엔티티 매니저가 엔티티를 저장/조회/수정/삭제를 합니다. 그런데 엔티티 매니저의 메서드를 찾아보면, 저장(persist)/조회(find)/수정(?)/삭제(delete)로 수정에 해당하는 메서드가 없습니다. 대신에 수정(?)에 해당하는 더티 체킹(Dirty Checking)을 지원합..
개요 CLI에 대해서 익숙하시지 않은 분들은 보통 인터넷에서 인코딩 디코딩 웹툴을 이용하게 됩니다. 그런데 인코딩이나 디코딩 해야하는 파일이 웹에 올리면 안되는 경우에, 결국 로컬에서 인코딩을 진행해야합니다. 그래서 로컬 CLI로 Base64 인코딩, 디코딩을 하는 방법에 대해서 설명하겠습니다. ex) 인코딩 A.jpeg파일 => output.b64파일 디코딩 output.b64파일 => A.jpeg파일 Linux 환경에서 Base64인코딩 1) 파일인코딩: A.jpeg파일 => output.b64파일 $ base64 A.jpeg > output.b64 2) 문자열인코딩: 문자열 => Base64문자 $ echo 'hello world' | base64 ex) aGVsbG8gd29ybGQK Base64디..
보통 레거시 서비스를 마이그레이션 하면서 세 가지가 가장 큰 숙제라고 봅니다. New DB에 Legacy DB를 마이그레이션 기존의 비즈니스 로직를 새로운 DB나 연관된 API 등에 맞게 마이그레이션 이미지 서비스(커머스, SNS 등) 하는 경우, AWS 새로운 계정의 S3 Bucket으로 Object 마이그레이션 여기서는 AWS 새로운 계정의 S3 Bucket으로 Object를 옮기는 과정을 6단계로 설명하겠습니다. S3 Objects를 옮기게 될 Destination Account의 Account Id를 가져옵니다. Source Account의 S3 Bucket에 Bucket Policy를 셋팅합니다. Destination Account의 S3 Bucket을 생성합니다. Destination Acco..
간략하게 SHA-2 란? SHA-2(Secure Hash Algorithm 2)는 해시 알고리즘입니다. 여기서 해시 알고리즘은 값를 입력받아, 고정된 길이의 해시값을 출력하는 알고리즘입니다. 암호 알고리즘에는 키가 사용되지만, 해시 알고리즘 함수는 키를 사용하지 않습니다. 그래서 같은 입력에 대해 항상 같은 출력이 나오게 됩니다. 해시 알고리즘 함수를 사용하는 이유는 동일한 값인지 살피거나, 변조를 탐지할 수 있는 무결성을 갖기 위함입니다. 해시함수가 출력하는 압축된 문장을 다이제스트(Digest) 라고 합니다. SHA-2가 생성하는 Digest 출력 길이는 224, 256, 384, 512bit입니다. SHA-2의 256bit 버전을 SHA-256로, SHA-2의 512bit 버전을 SHA-512로 줄..