[Spring Boot] JPA에서의 엔티티의 생명주기와 detach에 대한 개인적인 고찰
·
Java
JPA를 공부하다가 JPA에서는 영속화가 어떻게 작동하는가에 대해 의문이 들었다. 영속화에 대한 디테일한 내용들(1차 캐시 등등..)은 내가 의문이 들었던 내용보다는 더 깊숙한 이론들이라 간단하게만 설명하고 넘어가겠다. 엔티티의 생명주기는 크게 4단계로 구별된다.비영속(Transient)Member member = new Member();DB와 관계가 없고 단순히 생성된 객체를 의미한다.영속(Persistent)em.persist(member);영속화되어 JPA에서 관리되는 상태이다.이때부터 변경 감지가 가능하다.준영속(Detached)em.detach(member);영속화되어있는 특정 객체의 영속성을 끊는다.clear() 메서드를 사용하면 1차 캐시에 들어있는 모든 데이터를 준영속 상태로 바꾸게 된다...
[SpringBoot] Redis를 활용한 이메일 인증 회원가입 구현하기
·
Java
현재 진행중인 프로젝트에서 Redis를 활용해서 이메일 인증 회원가입을 구현한 내용을 회고해볼 것이다. 기존에는 단순 프로젝트를 진행하고, 외부에 배포하여 사용자 유치를 받아보지 않았기에, 단순 로직을 통해 회원가입 기능을 구현해왔다. 이번에는 실제 배포를 목적으로 프로젝트를 진행중이기 때문에, 이메일 인증을 통해 회원가입을 구현했다. 이메일 인증을 하는 방식은 두 가지 방식이 있다. 첫 번째는 인증 링크를 통해 하는 것이고, 두 번째는 인증 번호를 통해 하는 것이다.나는 인증 번호를 통해 구현했다.플로우개발에 앞서서 회원가입 로직 흐름을 정리했다.[사용자] → 이메일 입력 → [서버] 인증 코드 발송[사용자] → 인증 코드 입력 → [서버] 코드 검증 → Redis에 저장[사용자] → 회원가입 요청(e..
[Java] Google Gmail SMTP 초기 세팅하기
·
Java
이번 프로젝트에 이메일 인증을 통한 회원가입을 구현하면서, Google Gmail SMTP를 사용하게 되었다.따라서 이를 사용하기 위한 초기 설정을 알아볼 것이다. Google SMTP구글이 제공하는 SMTP 서버 주소는 고정되어 있다.SMTP 서버 주소smtp.gmail.com포트 (TLS/STARTTLS)587포트 (SSL)465인증 필요 여부필요 (아이디/비밀번호 or 앱 비밀번호)암호화 방식SSL 또는 STARTTLS 즉, Gmail 계정과 암호화된 연결을 통해 메일을 전송한다. Gmail 보안 설정Gmail 계정을 SMTP로 사용하기 위해서는 추가 보안 설정이 필요하다. Google 로그인 -> Google 계정 관리 -> 보안 탭에 들어온 후 상단에 검색창을 통해 앱 비밀번호를 검색한다. 나의..
[Java] SpringBoot에서 비동기 처리하기 (3): CompletableFuture 사용하기
·
Java
@Async 방식의 한계 SpringBoot에서는 @Async 방식을 통해 간단하게 메서드를 비동기 처리가 가능했다.하지만 기존 방식에는 문제가 있다. @Async 방식으로 선언한 메서드에서 일반적으로 사용되는 반환 타입인 void or Future는 다음과 같은 한계를 가진다. void 타입은 리턴 값이 없다는 말이다. 즉 사용자는 결과가 뭔지, 성공인지 실패인지 알 수 없다. Future란 미래에 받을 수 있는 결과를 의미한다. 하지만 Future 타입의 결과를 받기 위해 future.get() 메서드를 사용해야 하는데 이 과정이 blocking(동기 구조)이다. 즉, 비동기로 실행되긴 했지만, 결과를 얻기 위해서는 다시 동기적인 방식으로 기다려야 하는 구조다. 본론으로 돌아가보자. @Async..
[Java] SpringBoot에서 비동기 처리하기 (2): @Async로 비동기 처리하기
·
Java
SpringBoot에서 비동기를 처리하는 방법 중 하나인 @Async에 대해 알아보자.@Async 메서드 사용하기@Servicepublic class MailService { @Async public void sendMail(String email) { System.out.println("Sending email to " + email); }}@Async 메서드는 스프링부트에서 사용할 수 있는 가장 간단한 비동기 처리 방법이다. 사용법 또한 간단하다. 내가 비동기 처리하고자 하는 메서드에 @Async 어노테이션을 붙이면, 해당 메서드는 호출이 되자마자 바로 결과를 반환하고 실제 작업은 Spring에서 관리하는 스레드 풀에서 진행하게 된다. @Async 작동 흐름메서드가 호출되..
[Java] SpringBoot에서 비동기 처리하기 (1): 동기(Sync) VS 비동기(Async)
·
Java
동기와 비동기 어느정도 개발에 대해 공부를 하다보면 동기, 비동기에 대한 문제에 직면하게 된다. 예시를 들어보자. 어느 사용자 A가 게시글을 등록하려고 한다. 그 때 서버에서는 다음과 같은 작업들을 처리해야 한다.DB에 데이터 저장이메일 발송관리자에게 알림 발송위 작업들을 전부 순차적으로 처리하게 되면, 응답이 매우 느릴 것이고, 사용자는 불편함을 겪게 된다.이처럼 필요한 작업들을 순차적으로 처리하는 방식을 동기 처리한다고 한다. 하지만 비동기 방식으로 한다면 어떻게 될까?사용자 A가 게시글을 작성한다.서버에 DB에 게시글을 저장한 후 사용자에게 작성 완료 메세지를 즉시 반환한다.나머지 이메일 발송, 관리자에게 알림 발송 등의 작업은 백그라운드에서 처리된다.사용자는 기존 2,3,4번 작업이 처리되지 않았..