외부에서 AWS ElastiCache Redis 접근하기 (SSH 터널 방식)

들어가며 현재 서비스중인 앱의 세션 상태가 불안정한 이유로, 캐시서버로 토큰관리 전략을 하고있기에 운영중인 AWS ElasticCache RedisOSS에 접근하여 확인해보기로 했다. 먼저 여느때와 다름없이 외부에서 접근하기 위해 인바운드 규칙을 추가하여 레디스 인사이트에서 접근해보니 연결이 안되는 것이다. Public Subnet에 있는 일반적인 RDBMS나 SSH로 서버접근 등은 인바운드 규칙을 추가하는 것만으로도 가능한데, AWS ElastiCache(OSS Redis)는 기본적으로 VPC(Virtual Private Cloud) 내부 전용 서비스이기때문에, 퍼블릭 IP 자체가 존재하지 않는다. 이 때문에 단순한 외부접근이 불가능하다. 외부(로컬 PC 등)에서 직접 붙을 수 없으므로, Bastion EC2 를 경유해 SSH 터널링으로 접근해야한다. ...

2025년 10월 28일 AM10:39 · PolarBear

gradle jib 플러그인으로 이미지 빌드할 때 발생한 에러

문제상황 jib으로 프로젝트 이미지 빌드도중 발생한 에러입니다. 에러의 내용은 다음과 같습니다. > Task :jib Containerizing application to seunggison/msa-currency-exchange-app:0.0.1-SNAPSHOT... Base image 'openjdk:21' does not use a specific image digest - build may not be reproducible The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The base image requires auth. Trying again for openjdk:21... The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory Using base image with digest: sha256:af9de795d1f8d3b6172f6c55ca9ba1c5768baa11bb2dc8af7045c7db9d4c33ac Executing tasks: Executing tasks: [=========== ] 35.4% complete > pushing blob sha256:96791907cbb3a871c6611df3b... > pushing blob sha256:f8a02f907a1ab530de20915a2... > pushing blob sha256:fd4dae8efc3d04714f85e9343... > checking base image layer sha256:5262579e8e45... > checking base image layer sha256:0eab4e2287a5... > checking base image layer sha256:7c002e8f6062... > launching layer pushers > scheduling building manifests > scheduling pushing container configurations > Task :jib FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':jib'. > com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException: Build image failed, perhaps you should make sure your credentials for 'registry-1.docker.io/seunggison/msa-currency-exchange-app' are set up correctly. See https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-unauthorized for help * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. BUILD FAILED in 7s 3 actionable tasks: 1 executed, 2 up-to-date Caused by: Cannot run program "docker-credential-desktop": error=2, No such file or directory The system does not have docker-credential-desktop CLI <- 해당 오류는 도커허브 자격증명 문제때문에 발생하는 오류입니다. ...

2024년 10월 11일 PM03:07 · PolarBear

마이크로 서비스 간 분산추적 with Zipkin

MSA 분산 추적 위 같이 마이크로서비스가 여러개 있을 경우, 각 서비스들간에 호출 체인이 일어납니다. 간단한 예로 이전 포스팅에서 통화 변환 서비스가 환율정보를 받아오기 위해서 환율 서비스의 API를 호출 했었죠. 마이크로 서비스들이 많아지면 많아질수록 이런 호출체인은 더 복잡해지겠죠. 그럼 상황에서 문제가 발생하기 마련입니다. 이렇게 발생하는 문제를 추적하고 분석할 수 있어야하는데 이를 위해 분산 추적을 사용합니다. 이미지와 같이 모든 마이크로서비스의 모든 정보를 분산 추적 서버로 보냅니다. 그리고 분산 추적 서버는 각 서비스에서 전송된 트레이스 데이터를 수집하고 이를 DB에 저장합니다. 이 데이터는 서비스 간 호출 정보, 요청의 시작 시간과 종료 시간, 응답 시간, 서비스 간의 관계, 그리고 각 단계에서 발생한 메타데이터(i.g. HTTP 상태 코드, 에러 등) 를 포함하고 있으며, 이를 기반으로 트랜잭션의 흐름이나 성능 병목 지점 등을 분석할 수 있습니다. ...

2024년 10월 8일 PM01:01 · PolarBear

Spring Cloud로 MSA 환경 구축해보기

본 포스팅을 하게 된 이유 현재 많은 기업에서 MSA를 사용하고 있습니다. 그렇기에 신입으로 취업하게 되면 막연하게 회사에 들어가서 학습하는 것보다는, “미리 공부를 하고 실무에 뛰어들면 업무에 원활하지 않을까?” 라는 생각이었고, 이를 위해 조만간 진행할 개인 프로젝트에서 MSA를 적용하여 구축해보자는 마음에 공부하게 되었습니다. MSA **MSA(Microservice Architecture)**는 애플리케이션을 여러 개의 독립적인 마이크로서비스로 나누어 개발하고 배포하는 아키텍처 스타일입니다. 각 마이크로서비스는 하나의 기능에 집중하고, 다른 서비스들과 독립적으로 동작하며 독립적으로 배포될 수 있습니다. 마이크로서비스들은 서로 API나 메시지 큐를 통해 통신하며 각각의 서비스는 자신만의 데이터 저장소와 로직을 관리합니다. ...

2024년 9월 30일 PM08:42 · PolarBear

N+1 문제 및 MultipleBagFetchException 해결하기

배경 예전에 했었던 팀 프로젝트 코드를 복기하기 위해 로컬에서 프로젝트를 돌려봤습니다. 먼저 서버를 구동시키고 포스트맨으로 회원가입, 로그인부터 시작해서 일정 생성, 조회 등등을 해봤습니다. 그런데 일정 한 건을 조회하는 api를 포스트맨으로 돌려보고 서버 로그를 보니 무려 5번의 쿼리가 작동 했습니다. 해당 api는 팀 프로젝트 당시 제가 맡은 구현파트가 아니라 다른 팀원분께서 구현을 하셨었습니다. 일정 한 건을 조회하는데 5개의 쿼리가 작동하는 것을 개선할 수 있지 않을까 생각하여 팀원분이 작성하신 코드를 보며 리팩토링을 해보기로 결심했습니다. ...

2024년 9월 20일 PM09:01 · PolarBear

Spring에서 OAuth Client로 네이버 로그인 구현하기

OAuth 2.0 OAuth 2.0은 표준화된 규칙과 절차를 정의한 프로토콜입니다. 애플리케이션 간의 인증 및 권한 부여를 위한 상호 작용을 명확하게 규정하고 클라이언트(사용자가 이용하는 서비스 애플리케이션)가 자원 소유자(사용자)의 자원에 접근할 수 있도록 허용하는 방법을 정의합니다. 주로 간편 로그인을 할 때 사용됩니다.(ex. 카카오 로그인, 네이버 로그인 등) 역할 Resource Owner - 자원을 소유하고 있는 사람입니다. 서비스 애플리케이션을 사용하는 실제 사용자입니다. Client - 서비스 애플리케이션 서버입니다. 리소스 서버(구글, 네이버 등)로 Resource Owner의 인증 인가를 요청 하기때문에 리소스 서버의 입장에서 보는 관점으로 클라이언트입니다. Resource Server & Authorization Server - 인증 서버 및 리소스 서버입니다. 인증 서버는 인증 및 인가에 대하여 처리하고 리소스 서버는 저장되어 있는 리소스 오너의 정보를 응답해줍니다. 내부 동작 A. 사용자가 네이버 소셜 로그인을 시도 ...

2024년 9월 3일 PM07:31 · PolarBear

API Versioining을 하는 여러가지 방법

API Versioning 의 필요성 하위 호환성 유지 API를 사용하는 사용자는 특정 API 인터페이스에 의존하게 됩니다. 만약 API가 변경되거나 새로운 기능이 추가되면서 기존의 인터페이스가 변경된다면 하위 호환성을 유지하지 않으면 기존 클라이언트에서 오류가 발생할 수 있습니다. 버전 관리를 통해 이전 버전의 API를 유지하면서 새로운 기능을 추가한 버전을 제공할 수 있습니다. 점진적인 기능 개선 API는 시간이 지남에 따라 개선되고 확장됩니다. 새로운 기능을 추가하거나 성능을 개선하거나 보안을 강화하는 등의 작업이 필요할 때 버전 관리를 통해 단계적으로 새로운 버전을 릴리스할 수 있습니다. 이를 통해 클라이언트는 자신에게 필요한 시점에 새 버전을 선택적으로 사용할 수 있습니다. 기존 클라이언트 지원 다양한 사용자가 API를 사용하고 있으며 이들 중 일부는 최신 버전으로 쉽게 업그레이드할 수 없는 경우가 많습니다. API 버전 관리를 통해 기존 클라이언트가 계속해서 안정적으로 동작할 수 있도록 지원할 수 있습니다. API 수명 주기 관리 모든 API는 수명 주기가 있으며, 버전 관리를 통해 API의 수명 주기를 체계적으로 관리할 수 있습니다. 이는 API의 기능이 오래된 경우 폐기하고, 새로운 기능으로 전환할 수 있도록 도와줍니다. 비즈니스 요구사항 반영 비즈니스 환경이 변화하면서 새로운 요구사항이 발생할 수 있습니다. API 버전 관리를 통해 이러한 요구사항을 반영한 새로운 버전을 릴리스하면서도 기존 비즈니스 논리를 보호할 수 있습니다. API Versioning 종류와 그 방법 API 버저닝 방법에는 API URL을 활용하거나 params, 요청 헤더, accept 헤더 4가지 방법이 있습니다. ...

2024년 9월 2일 PM05:47 · PolarBear

JUnit5 유효성 검증 테스트 중 오류

개인 프로젝트를 진행중, 유저의 전화번호 필드 검증 테스트를 하는데 오류가 발생했다. @Import(ValidationConfig.class) class UserRepositoryTest extends TestcontainersConfiguration { @Autowired private UserRepository userRepository; @Autowired Validator validator; @BeforeEach void setUp() { userRepository.deleteAll(); } @Test @DisplayName("DB에 유저 save 실패 - 전화번호 기입 시 \"-\" 기호 미기입") void saveFailByWrongTel() { // given User user = User.builder() .nickname("sonny") .tel("01011112222") // 하이픈 미기입 .pw("1234") .email("asdfas142@naver.com") .visibility(VisibilityStatus.FRIENDS_ONLY) .build(); // when Set<ConstraintViolation<User>> violations = validator.validate(user); // then assertThat(violations).isNotEmpty(); assertThat(violations).anyMatch(violation -> violation.getMessage().equals("전화번호 형식은 XXX-XXXX-XXXX이어야 합니다.")); } } 위와 같은 테스트코드인데, User 엔티티의 tel(전화번호) 필드에 ...

2024년 7월 26일 AM09:39 · PolarBear