[Spring] Docker-Compose를 활용한 CI / CD 구축
·
Back-end/Spring
현재 상황캡스톤 프로젝트를 진행하면서 다음과 같은 디렉터리 구조를 가지고 있는 상황이다. Repo- .github- frontend- backend- gpt... 현재 EC2 내에는 Spring Boot Jar file과 Docker Container에서 Redis Image를 pull 받아와야 하는 상황이다. 일일이 Docker 명령어를 입력하여 container image를 pull 받아오는 것보다 docker-compose를 통해 한 번에 Docker Container에서 이미지를 pull 받아오고자 해당 방법을 진행했다. DB는 RDS를 활용하여 구축했기에, Docker-compose에는 담지 않았다.하지만, EC2 내 로컬 DB를 활용한다면 docker-compose.yml에 DB 관련 코드를 ..
[Spring] com.auth0 vs jsonwebtoken.jjwt
·
Back-end/Spring
지금까지 프로젝트를 했던 것들을 짚어봤을 때 JWT 토큰을 사용하기 위해 com.auth0.java-jwt 라이브러리를 사용하거나 io.jsonwebtoken (jjwt) 라이브러리를 사용하는 경우가 있었다. com.auth0가 더 좋다, jjwt가 더 좋다 이런 말들이 많아서 직접 조사해보고 정리해보았다.  1. com.auth0:java-jwt💡 장점가볍고 간결한 API코드가 직관적이며, JWT의 생성 및 검증 과정이 상대적으로 간단함.빌더 패턴을 활용한 사용성 향상JWT 생성 시 JWT.create() 메서드를 사용하여 체인 방식으로 쉽게 설정 가능.JDK 내장 라이브러리만 사용별도의 외부 의존성이 거의 없음. (java.security 및 java.util 기반)토큰 검증 시 Claim을 쉽게 ..
[Spring] JPA 벌크 연산이란?
·
Back-end/Spring
만약, DB에 Member Table이 있고, Salary라는 컬럼이 존재한다고 가정해보자. 연봉 3000 미만의 member들의 Salary를 수정한다고 가정했을 때, JPA 관점에서는 다음과 같은 순서로 진행될 것이다.  em.find() OR select 쿼리를 날려 영속성 컨텍스트에 엔티티 저장 후 반환반환 받은 엔티티의 값을 변경한다. -> 영속성 컨텍스트에 반영된다.Commit 시점에 변경 감지(Dirty Checking)가 일어나며 Update 쿼리를 날려 DB에 반영한다. 만약, salary를 변경할 member가 80만명이라면? 80만번의 더티 체킹이 일어나고, 80만번의 UPDATE 쿼리가 날아갈 것이다... 이를 해결할 수 있는 방안이 바로 벌크 연산이다.  Bulk 연산이란? 벌크 ..
[Spring] Spring Batch를 활용한 배치 프로세싱
·
Back-end/Spring
💡 Spring Batch이란?Spring Batch는 대량의 데이터를 처리하기 위한 경량화된 프레임워크로, 반복적인 작업을 수행하는 일괄 처리(Batch Processing) 작업을 효율적으로 처리할 수 있는 기능을 제공해준다. 기본적으로 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 작업 건너뛰기, 리소스 관리 등 대용량 데이터를 처리하는데 필수적인 기능을 제공해준다. 또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 배치 작업을 가능하게 하는 고급 기술 서비스를 제공해주기도 한다. 배치 프로세싱이란?여러 개의 데이터베이스 쿼리나 트랜잭션을 그룹화하여 한 번에 처리하는 기술즉, 사용자에게 빠른 응답이 필요하지 않은 서비스에 적용할 수 있다.    ✈️ Spring Batch의 장..
[Spring] Private 메서드에 @Transactional 선언 시 트랜잭션이 동작하는가?
·
Back-end/Spring
매일메일을 통한하루하루 CS 공부하기  기본적으로 @Transactional, @Cacheable, @Async 등의 AOP 어노테이션은 런타임에 동작하는 Spring AOP를 기반으로 동작한다. Spring AOP가 제공하는 JDK Dynamic Proxy, CGLIB 방식 모두 타깃이 구현하는 인터페이스나 구체 클래스를 대상으로 프록시를 만들어서 타깃 클래스의 메서드 수행 전후에 횡단 관심사에 대한 처리를 할 수 있다. Spring은 빈 생성시, 해당 빈에 AOP 애너테이션이 있는지 검사하고, 있다면 프록시 객체를 생성하여 빈을 대체한다. AOP 적용 대상인 클래스의 경우, 즉, @Transactional과 같은 AOP 애너테이션이 하나라도 선언된 클래스는 프록시로 감싸진다. JDK Dynamic P..
[Spring] Spring Data JPA에서 새로운 Entity인지 판단하는 방법?
·
Back-end/Spring
요즘 백엔드 관련한 내용을 매일마다 질문해주는 Maeil-Mail이라는 서비스를 사용하여 하루하루 지식을 체크중이다. (이거 생각보다 재밌을지도?) 오늘의 주제는 바로 Spring Data JPA이다. 항상 인터페이스처럼 편하게 JPQL을 사용하게 해주는 녀석... 하지만 EntityManager를 사용한 영속성 컨텍스트 관리를 한다는 것 말고는 제대로 동작 방식을 알고 있었을까? 위 질문(제목에 게시)에 뭐 영속성 컨텍스트가 새로운 엔티티를 판별하겠지? 만 생각이 들고 정확한 동작 관리를 알지 못했다.  ... 아직 갈 길이 멀다. Spring Data JPA 뜯어보기. 바로 시작해보도록 하자 Spring Data JPA란? 우선 JPA란 무엇일까?JPA란 Java Persistentce API의 약자..
[Spring] AWS SageMaker 엔드포인트 연결 시도하기
·
Back-end/Spring
문제 상황기존 방식대로 Spring WebFlux 에서 HTTP Client로 사용되는 비동기적으로 작동하는 모듈인 WebClient를 활용하여 SageMaker 엔드포인트에 POST 요청을 시도했다. 그런데 CloudWatch에서 요청 시도에 대한 로깅은 찍히는데, 웹서버로 리턴이 들어오지 않는 상황이었다. 알고 보니, AWS SageMaker는 사용하는 IAM에 대한 정보를 바탕으로 AWS Signature를 Header에 담아 전송해야하는 것이었다. 이를 해결하기 위해 Spring에서는 aws sagemaker-runner 라이브러리를 사용해야 한다. 해결 1. build.gradle에 다음과 같은 라이브러리를 추가한다.implementation 'io.awspring.cloud:spring-clo..
[Spring] self-hosted Runner를 통한 CI/CD 배포
·
Back-end/Spring
문제 상황CI / CD 워크플로우에서 직접적으로 EC2 IAM을 활용하여 접속하려고 했는데 CD 과정이 진행되지 않는 상황이 발생했다. workflow.yml 코드는 다음과 같다.- name: Deploy to EC2 uses: appleboy/ssh-action@master with: key: ${{ secrets.EC2_PRIVATE_KEY }} # pem key host: ${{ secrets.EC2_HOST }} # ec2 ip username: ${{ secrets.EC2_USER }} # ec2에서 whoami 명령어로 확인 script: | sudo docker stop $(sudo docker ps -q) sudo docker pull ${{ se..