Spring Boot

    [My-Storage 개선하기] Ceph에 파일 저장하기

    이전에 간단하게 ceph 클러스터를 구성했으니 spring 서버를 통해 파일을 업로드해 보자.build.gradleimplementation platform('software.amazon.awssdk:bom:2.20.56')implementation 'software.amazon.awssdk:s3' // 필요한 모듈만 추가awssdk를 사용했다. s3 API를 사용하여 RGW에 요청을 보낼 것이기 때문에 s3도 추가했다.RgwConfigurationpackage com.woowacamp.storage.global.config;import java.net.URI;import org.springframework.beans.factory.annotation.Value;import org.springframew..

    [My-Storage 개선하기] 데드락 해결, DB lock 사용 줄이기(2) - 테스트

    테스트 환경 설정DB, Redis, Spring 모두 별도의 환경에서 테스트를 하고자 했다. 개선 전의 서버와 비교를 하려면 동일한 환경을 보장하는 것이 중요하다고 생각했기 때문이다. 서버를 살 돈은 없었기에 로컬에서 도커를 사용해서 컨테이너 환경에서 cpu와 메모리를 제한했다.Dockerfile# 1. 빌드 단계: Gradle 이미지 사용FROM gradle:7.6-jdk17 AS build# 2. 작업 디렉토리 설정WORKDIR /app# 3. 필요한 파일 복사COPY --chown=gradle:gradle . .# 4. Gradle을 사용해 JAR 파일 빌드RUN gradle clean build --no-daemon --stacktrace || (echo "Build failed. Check bu..

    [My-Storage 개선하기] 데드락 해결, DB lock 사용 줄이기(1)

    현재 프로젝트의 문제점현재 폴더의 이동이나 삭제 시 하위 폴더와 상위 폴더를 탐색하여 전부 락을 건 후에 작업을 진행한다.삭제의 경우 하위 폴더와 파일까지 모두 탐색하여 일관성 있게 제거하기 위함이고, 위로 거는 락은 이동과 삭제 시 용량 계산을 일관성 있게 하기 위함이다. 위 방법의 가장 큰 문제는 수정을 위해 Read Lock을 사용하면서 읽기 작업에도 영향을 미치게 된다는 점이다. 또한 전부 탐색을 진행한 후에 작업을 처리하기 때문에 커넥션을 길게 소유하게 되고, 동일한 DB를 사용하는 다른 서비스에도 영향을 미칠 수 있다. 또 다른 문제로는 락을 획득하는 과정이 한 방향이 아니라 위, 아래 두 방향으로 데드락이 발생하는 문제도 있었다. 고민그래서 이 모든 문제의 원인인 락을 사용하지 않고 일관성을..

    Github Action CommunicationsException: Communications link failure, profile 설정과 @SpringBootTest 동작 방식 이해로 해결하기 - MiniPay(2)

    문제 로컬 환경에서 테스트하고 빌드까지 잘 되는 것을 확인했지만, github action을 사용한 build에서 데이터베이스와 연결이 안 된다는 에러가 발생했다. 해결 과정 1. Github Actino에서 MySQL을 사용하기 Github Action 환경이 어떻게 되어 있는지 간단하게 살펴 보았다. 이벤트를 발생시키면 Runner에서 동작하는 원리였는데 얘가 컨테이너 내부에서 작업을 실행한다. 해당 컨테이너 환경에 MySQL이 없어서 발생하는 에러였고, MySQL을 사용할 수 있는 설정을 포함해서 해결할 수는 있었다. 하지만 그러면 전체 작업 수행 시간이 늘어나는 문제가 있어서 다른 방법을 고민해 보았다. 만약 이 방법을 사용할 것이라면 아래처럼 작업을 추가해 주면 된다 services: mysql..

    프로젝트 설계, 이체 시 동시성과 DB Isolation Level 고민 및 적용 - MiniPay(1)

    프로젝트 소개 최근 좋은 기회를 얻어서 작은 스터디를 시작하게 됐다. 스터디 운영하시는 분께서 너무 감사하게도 평소 프로젝트를 할 땐 신경 쓰지 않았던 부분들을 고민할 수 있는 주제로 프로젝트 아이디어를 제공해 주셨다.(동시성 문제, 성능 문제 등) 최근 CS의 중요성을 깨닫고 이걸 프로젝트에 어떻게 적용할지 고민이 많았는데 제공해준 프로젝트를 진행하면서 이런 고민을 해결할 수 있었다. 4개의 주제 중 페이 서비스를 만드는 것이 마음에 들었다. 평소 CRUD만 했던 DB를 Isolation Level과 락을 어떻게 걸지 고민하며 적용해 보는 것이 좋은 경험이 될 것이라고 생각했다. 또한 트랜잭션을 학습할 때 항상 이체를 예시로 들었는데 공부할 땐 예시만 보고 그렇구나~ 했던 것을 어떻게 해결할 것인지 고..

    Spring Security + JWT 적용하기(2) - 게시판 만들기(11)

    Spring Security에 JWT를 붙이기 전에 JWT를 먼저 발급해 보겠다. 로그인 시 JWT 발급하기 먼저 JWT에 대한 작업을 할 클래스를 하나 생성한다. Security와 같은 모듈에서 utils 패키지를 만들어 관리를 할 것이다. 그러기 전에 먼저 의존성을 추가해 준다. build.gradle (common-authentication 모듈) dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' //Spring Security implementation 'io.jsonwebtoken:jjwt:0.9.1' } jjwt 가 java json web. token이라고 한다. utils/JwtUtil ..

    Spring Security + JWT 적용하기(1) - 게시판 만들기(10)

    코드를 작성하기 전에 Spring Security가 무엇이고 왜 사용해야 하는지 알아보았다. Spring Security란? Spring 기반으로 어플리케이션 보안(인증, 권한, 인가 등) 기능을 제공하는 스프링 하위 프레임워크. Spring Security는 인증과 권한에 대한 부분을 Filter 흐름에 따라 처리한다. 이 Filter는 Dispatcher Servlet으로 가기 전에 적용되기 때문에 가장 먼저 URL의 요청을 받는다. Interceptor와는 다른 점이 Interceptor는 Dispatcher Servlet과 Controller 사이에 위치하기 때문에 적용되는 시점이 다른 차이가 있다. Spring Security는 보안과 관련하여 쳬계적으로 많은 옵션을 제공하기 때문에 개발자의 입..

    Entity 모듈 분리(멀티 모듈 프로젝트) - 게시판 만들기(9)

    본격적으로 시작하기에 앞서 도메인 별로 모듈을 분리를 한다면 그에 따라 Entity도 각자 가지고 있을 것이고 만약 이 Entity들이 다른 도메인에서도 사용된다면(연관 관계 등에 의해서) 공통 모듈로 분리하는 것이 좋다고 생각이 되었다. 우선 로그인 기능을 붙이고 싶었다. 로그인, 회원 가입 등이 발생하는 Auth-API와 사용자들 관련 Member-API 두 가지를 만드려 하니 두 곳 모두 Member라는 Entity가 공통으로 사용될 것 같다고 생각이 되었다. 그래서 Entity를 분리하기로 했고 Member와 MemberInfo로 나누어서 관계 설정하여 모듈화 시켜보겠다. Auth-API , Entity 모듈 생성 이전의 멀티 모듈 프로젝트 생성 과정에서 본 것과 같이 auth-api , enti..