백엔드/Spring

[Spring] 이미지를 파일로 저장하지 않고 업로드 하기

목적 이미지 업로드 시 이미지를 디스크에 저장하지 않기 위함 목차 서론 구현 방법 이미지 다운로드 이미지 업로드 1. 서론 회사에서 외부 상품을 크롤링하여 내부 상품으로 변환하는 프로세스를 개발중이었다. 배치 어플리케이션을 통해 외부 상품의 이미지를 회사 이미지 서버에 올리고, 회사 이미지 서버의 url을 DB에 저장해야 했다. 배치 어플리케이션이기 때문에 메모리 관리가 크게 중요하지 않았고, (쿠버네티스의 새로운 Pod에 어플리케이션이 뜨고 죽기 때문, 새로운 배치 어플리케이션은 새로운 Pod에서 시작) 굳이 디스크에 저장하고 싶지 않았다.(그냥 메모리에서 처리하고 싶었다.) 2. 구현 방법 이미지 url에 접근하여 이미지의 정보를 ByteArray형태로 가져온다. ByteArray타입의 데이터를 By..

2023.03.20 게시됨

어드민 페이지 노출 프로세스 개선 포스팅 썸네일 이미지

Problem Solving

어드민 페이지 노출 프로세스 개선

상황 신규 서비스를 개발하며 새로운 상품이 추가되었다. 기존에 사용되던 상품의 타입과 같은 타입을 사용하지만, 실제론 다른 상품이었다. 하지만 같은 타입을 사용하기 때문에 기존에 사용되던 상품 진열 프로세스를 공유하게 되었다. 문제 새롭게 생긴 상품은 고객의 결정이 있기까지 어떤 프로세스도 진행되면 안되었다. 하지만 상품 타입을 같이 사용하게 되다보니 운영팀에서 해당 상품을 처리한 후 24시간 뒤에 특정 어드민 페이지에 자동으로 노출이 되어버리는 현상이 발생할 수 있었다. 이 페이지에 노출되면 아직 고객의 결정이 없는 상태이지만 상품의 판매가 진행될 수 있었고, 이는 고객 만족도를 떨어뜨리고 데이터 보정을 위해 불필요한 리소스를 낭비할 가능성이 있었다. 해결방법 우선 레거시를 분석해보았다. 어드민 페이지..

2023.03.16 게시됨

[Github] merge, squash, rebase 포스팅 썸네일 이미지

Git

[Github] merge, squash, rebase

목적 협업 시 github의 커밋내역을 효과적으로 관리하기 위함 목차 merge squash rebase 1. merge 한 브랜치를 다른 브랜치와 합치는 방법이다. master브랜치가 원본 브랜치이고, feature/test브랜치가 master에서 파생된 브랜치라고 가정해보자. 이때 master브랜치에 merge를 하게 되면 기존 master브랜치의 커밋내역(m0, m1, m2, m3)에 추가적으로 feature/test에서 작업했던 커밋내역(ft1, ft2, ft3)가 합쳐진다. master브랜치의 커밋내역에 feature/test의 커밋내역이 더해져 총 커밋 내역은 m0, m1, m2, m3, ft1, ft2, ft3 와 같이 생성된다. 2. squash 한 브랜치와 다른 브랜치는 합치는 방법인 것..

2022.02.01 게시됨

CI/CD

[CI/CD] Springboot와 Github Actions를 사용한 컨테이너 자동 배포

목적 코드의 푸시부터 빌드, 컨테이너 이미지 생성, 배포까지의 단계를 자동화 하기 위함 목차 구성 Github Actions 스크립트 실행 과정 1. 구성 Springboot 2.3+ Github Actions https://emgc.tistory.com/149 Springboot에서 bootBuildImage를 사용하여 도커 허브로 push하는 부분은 윗글을 참조하면 되겠다. 2. Github Actions 스크립트 name: Java CI with Gradle on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 11 uses: actions/..

2021.12.24 게시됨

[Spring] bootBuildImage와 "No compatible attachment provider is available" 포스팅 썸네일 이미지

백엔드/Spring

[Spring] bootBuildImage와 "No compatible attachment provider is available"

목적 bootBuildImage로 만든 스프링부트 이미지 실행 시 No compatible attachment provider is available 에러가 발생하는 것을 해결하기 위함 목차 bootBuildImage로 이미지 빌드 에러 해결하기 1. bootBuildImage로 이미지 빌드 bootBuildImage를 사용하여 빌드한 이미지를 쿠버네티스에서 Pod의 형태로 만들어 실행하였다. 하지만 No compatible attachment provider is available 라는 에러와 함께 Pod가 실행되지 않았다. 상태가 CrashLoopBackOff로 초기화 컨테이너가 반복적으로 실행에 실패하였다. 2. 에러 해결하기 https://github.com/alibaba/arthas/issues..

2021.12.01 게시됨

[Gradle] bootBuildImage를 사용한 스프링부트 컨테이너 이미지 빌드 포스팅 썸네일 이미지

백엔드/Gradle

[Gradle] bootBuildImage를 사용한 스프링부트 컨테이너 이미지 빌드

목적 멀티 프로젝트 환경에서 간단하게 docker 이미지를 만들고 docker hub에 푸시하기 위함 목차 Dockerfile을 이용하는 방법 bootBuildImage를 사용하는 방법 사용 예시 1. Dockerfile을 이용하는 방법 기존에 컨테이너 이미지를 만들기 위해선 Dockerfile을 생성하고 필요한 속성들을 정의해야 했다. FROM openjdk:11 EXPOSE 8080 ADD ./build/libs/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] 도커 이미지는 여러 레이어를 갖고 있어서 변경되지 않는 부분은 그대로 사용하고 변경되는 부분만 바꾸어 효율적인 사용이 가능했다. 하지만 별다른 설정 없이 Dockfile을 사용하는 방법은 이미지를 단..

2021.11.24 게시됨

백엔드/Spring

[Spring] JWT 로그인 구현하기 2

목적 기존에 구현한 JWT로그인을 보완하고자 함 목차 기존의 흐름 새로 구현한 JWT로그인의 흐름 코드 설명 기존의 흐름 https://emgc.tistory.com/133 기존에 작성한 JWT로그인이며 흐름은 아래와 같다. 필터 로그인 시 쿠키에 있는 토큰을 확인하고 유효한 토큰이라면 인증객체를 생성하고 요청을 넘긴다 컨트롤러 인증객체의 확인 없이 클라이언트가 입력한 아이디와 비밀번호를 통해 사용자를 인증하고 인증된 사용자의 정보로 토큰을 발급한다. 하지만 아래와 같은 문제점이 있어서 새로운 JWT로그인이 필요했다. 토큰을 갖고 있어도 매번 아이디 비밀번호를 입력해야 로그인 가능 토큰 자체의 만료시간이 짧기 때문에 만료될때마다 아이디 비밀번호를 입력 새로 구현한 JWT로그인의 흐름 토큰을 access ..

2021.10.25 게시됨

Kubernetes

[kubernetes] Volume

목적 Volume에 대해 알고자함 목차 Volume이란? Volume의 종류 및 양식 1. Volume이란? 파드의 컨테이너에서 접근 가능한 데이터를 포함하고 있는 디렉터리 쿠버네티스에서 파드가 접근하여 데이터를 read/write할 수 있는 저장공간이다. 실제 볼륨은 쿠버네티스 클러스터와 분리되어 관리된다. 2. Volume의 종류 및 양식 emptyDir 파드가 노드에 할당될 때 처음 생성되며, 해당 노드에서 파드가 실행되는 동안에만 존재한다. 최초에 비어있기 때문에 emptyDir이라고 이름이 붙여졌다. yml apiVersion: v1 kind: Pod metadata: name: pod1 spec: containers: - name: first image: test/example volumeMo..

2021.10.14 게시됨