전체 글 (197) 썸네일형 리스트형 [Spring] 스프링에서 생성된 LocalDateTime과 DB 시간이 다르다 생성된 QR 코드의 만료 시간을 설정하고 DB에 저장하고자 하였다. 그러나.... 둘 간의 시간 오차가 발생했다. 분명 스프링에서는 2024-04-24T16:05:24.911197 로 생성이 되는데, DB에서는 2024-04-24 07:05:24.911197 로 저장되는 문제가 있었다. 그 이유는 간단했다. DB의 serverTimezone=UTC 로 설정되어 있었기 때문이다. 스프링은 당연히 KST 기준으로 시간을 설정하기 때문에 UTC와 오차가 발생한다. 따라서 기존의 serverTimezone을 수정한다.수정 전spring: datasource: url: jdbc:mysql://localhost:3306/qr_code?serverTimezone=UTC&characterEn.. [Spring] AWS 자격증명 정보를 사용하는 2가지 방법 EC2 IAM에 등록된 자격 증명 사용하기패키지 정보 확인하기import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import software.amazon.awssdk.auth.crede.. [Spring] AWS SES를 사용하여 메일을 보내기 진행 중인 프로젝트에서 사용자가 관리자에게 문의 메시지를 보낼 수 있는 기능이 있습니다. 문의를 전송하게 되면 서버에 등록된 관리자 메일로 사용자의 문의 사항이 전송됩니다. 단순하게 사용자 -> 관리자로 메일 전송 기능이 필요로 했고, AWS SES를 사용하여 관리할 수 있도록 하였습니다.AWS SESAWS SES(Simple Email Service)를 사용하면 SMTP(Simple Mail Transfer Protocol) 이메일 서버를 온프레미스에 유지하지 않고도 고객과 메일을 전달받을 수 있습니다. 즉, 사용자의 이메일 주소와 도메인을 사용하여 이메일을 주고 받기 위해 사용됩니다. 스프링 부트에서 AWS SES를 사용하는 방법에 대해서 알아보겠습니다.1. 자격 증명 생성이메일을 관리.. [Spring] Profile 적용 방법 및 우선 순위 환경변수 분리애플리케이션을 배포하게 되면 환경변수를 분리하게 됩니다. 왜 분리를 해야 할까요? 다양한 이유가 있겠지만 가장 와닿는 이유로는 DB 연결정보가 다르기 때문입니다. 로컬에서 작업을 하는 것과 서버로 배포된 application이 사용하는 DB 정보가 다르기 때문입니다. 예를 들어, local에서는 docker로 띄운 DB를 사용하지만, prod 환경에서는 AWS RDS에 띄운 DB를 사용해야하므로 연결 정보를 다르게 해야 합니다. 현재 진행하고 있는 프로젝트의 경우 2개의 profile을 사용하고 있습니다.local(로컬)prod(운영)기존에는 application.yml 1개에 설정 정보를 모두 넣고 사용하였습니다. 그러나 개발이 완료된 서버를 배포하게 되면서 작업 환경을 분리.. [JPA] OSIV(Open Session In View) 정리 OSIV(Open Session In View)란? JPA 하면 떠오르는 것이 영속성 컨텍스트입니다. 영속성 컨텍스트란 DB로부터 조회한 엔티티를 관리하는 저장소라고 생각하면 됩니다. 트랜잭션이 시작되어 조회된 엔티티는 영속성 컨텍스트(1차 캐시)에 저장하여 트랜잭션이 종료될 때까지 사용됩니다. 스프링을 사용한다면 기본적으로 OSIV가 켜진 상태로 사용됩니다. OSIV는 영속성 컨텍스트와 관련이 있는데 이에 대해서 알아보겠습니다. OSIV = true 먼저 사용자의 요청이 들어오면 이것을 처리하기 위해서 트랜잭션이 시작됩니다. 각 트랜잭션마다 영속성 컨텍스트가 생성되고, 트랜잭션이 살아있는 동안 영속성 컨텍스트가 살아있다는 의미가 됩니다. 영속성 컨텍스트가 살아있다면 엔티티의 조회 및 수정을 진행할 수.. [JPA] 다른 Transaction에서 조회한 엔티티 비교 Entity 조회 Service 레이어에서 DB에 접근할 때 Transaction 단위로 수행됩니다. 예를 들어, Member 테이블에 id 값이 1인 엔티티가 존재합니다. 해당 엔티티를 조회하기 위해서는 Transaction 단위로 조회해야 합니다. DB에서 엔티티를 조회하기 위해 MemberService를 정의합니다. MemberRepository를 의존성 주입을 받아 사용합니다. @Service public class MemberService { @Autowired MemberRepository memberRepository; @Transactional(readOnly = true) public Member findMember(Long id) { return memberRepository.findB.. [Spring] GitHub Actions의 CI 문제, 그리고 AWS Secrets Manager AWS Secrets Manager를 사용하게 된 계기 현재 진행 중인 프로젝트에서 커밋 한 코드를 깃헙에 PR 올렸을 때 발생하는 CI(Continuous Integration) 문제 해결법에 대해서 알아보겠다. 우리 프로젝트의 경우 PR에 올라간 커밋한 내용들에 빌드가 정상적으로 수행되는지 GitHub Actions에서 검사한다. 분명 로컬에서 작업했을 때 빌드에 문제도 없었고, 테스트 코드 또한 정상적으로 모두 수행되었다. 그래서 당연히 PR 올렸을 때도 문제가 없을 줄 알았다. 그러나 아래를 보면 X 표시가 보일 것이다. X의 의미는 내가 올린 코드가 빌드에 문제가 생겼다는 의미이다. 왜 문제가 발생했을까? 이유는 간단하다. .gitignore에 추가된 파일이 깃헙에 올라가지 않기 때문이다. Gi.. [JPA] Spring Data JPA Repository -> 사용자 정의 Repository Spring Data JPA 기존에 Spring Data JPA가 제공하는 JpaRepository를 상속받았고, 그곳에 사용자 요청을 처리하는 코드들이 담겨있었다. 기존 코드들을 확인해 보자. Service JPAQueryFactory를 의존받아 사용하고 있다. Querydsl로 작성한 쿼리문이 service 레이어에 포함되어 있다. 참고로 select() 절에 QGetSectionResponseDto는 @QueryProjection을 통해 dto로 변환하여 클라이언트로 전달하고자 사용하였다. 서비스 레이어에 쿼리문이 포함되어 있으니 코드 가독성이 좋지 않아 보인다. @Service @RequiredArgsConstructor public class SectionService { private fina.. 이전 1 ··· 12 13 14 15 16 17 18 ··· 25 다음