diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/Log.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/Log.java new file mode 100644 index 00000000..0fa59255 --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/Log.java @@ -0,0 +1,24 @@ +package com.example.springtransaction.propagation; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Getter @Setter +public class Log { + + @Id @GeneratedValue + private Long id; + private String message; + + public Log() { + } + + public Log(String message) { + this.message = message; + } +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java new file mode 100644 index 00000000..1460a3b6 --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java @@ -0,0 +1,35 @@ +package com.example.springtransaction.propagation; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import java.util.Optional; + +@Slf4j +@Repository +@RequiredArgsConstructor +public class LogRepository { + + private final EntityManager em; + + @Transactional + public void save(Log logMessage) { + log.info("log 저장"); + em.persist(logMessage); + + if (logMessage.getMessage().contains("로그예외")) { + log.info("log 저장시 예외 발생"); + throw new RuntimeException("예외 발생"); + } + } + + public Optional find(String message) { + return em.createQuery("select l from Log l where l.message = :message", Log.class) + .setParameter("message", message) + .getResultList().stream().findAny(); + } + +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/Member.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/Member.java new file mode 100644 index 00000000..303df47a --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/Member.java @@ -0,0 +1,24 @@ +package com.example.springtransaction.propagation; + +import lombok.Getter; +import lombok.Setter; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +@Getter @Setter +public class Member { + + @Id @GeneratedValue + private Long id; + private String username; + + public Member() { + } + + public Member(String username) { + this.username = username; + } +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberRepository.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberRepository.java new file mode 100644 index 00000000..40c7b441 --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberRepository.java @@ -0,0 +1,29 @@ +package com.example.springtransaction.propagation; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import java.util.Optional; + +@Slf4j +@Repository +@RequiredArgsConstructor +public class MemberRepository { + + private final EntityManager em; + + @Transactional + public void save(Member member) { + log.info("member 저장"); + em.persist(member); + } + + public Optional find(String username) { + return em.createQuery("select m from Member m where m.username = :username", Member.class) + .setParameter("username", username) + .getResultList().stream().findAny(); + } +} diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java new file mode 100644 index 00000000..3854470f --- /dev/null +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java @@ -0,0 +1,44 @@ +package com.example.springtransaction.propagation; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class MemberService { + + private final MemberRepository memberRepository; + private final LogRepository logRepository; + + public void joinV1(String username) { + Member member = new Member(username); + Log logMessage = new Log(username); + + log.info("== memberRepository 호출 시작 =="); + memberRepository.save(member); + log.info("== memberRepository 호출 종료 =="); + + log.info("== logRepository 호출 시작 =="); + logRepository.save(logMessage); + log.info("== logRepository 호출 종료 =="); + } + + public void joinV2(String username) { + Member member = new Member(username); + Log logMessage = new Log(username); + + log.info("== memberRepository 호출 시작 =="); + memberRepository.save(member); + log.info("== memberRepository 호출 종료 =="); + + log.info("== logRepository 호출 시작 =="); + try { + logRepository.save(logMessage); + } catch (RuntimeException e) { + log.info("log 저장에 실패했습니다. logMessage={}", logMessage.getMessage()); + log.info("정상 흐름 반환"); } + log.info("== logRepository 호출 종료 =="); + } +}