Spring
Transactional REQUIRES_NEW에 대한 오해
Transactional REQUIRES_NEW에 대한 오해
2021.12.21서론예전에 함께 스터디를 했던 스터디원이 트랜잭션에 관한 블로그 글을 공유하면서, 흥미로운 내용이라고 소개했다.해당 글에서는 기존에 내가 알고있던 사실이 틀리다라고 얘기하는 내용이었다. 내가 잘못알고 있었던 건가??! 생각들때쯤 해당 코드에서 옥에 티 발견했다. 간단한 내용일 수도 있지만 개념을 확실하게 잡지 않으면 충분히 헷갈릴 수 있을 거 같다. 덕분에 나도 이번 기회에 다시 학습해보고 명확하게 정리를 해보는 시간을 갖게 되었다. 본문 글의 내용은 이런 것이었다.@Transactional을 사용할 때 전파 속성을 "REQUIRES_NEW"로 지정해도, 부모 트랜잭션이랑 독립된 트랜잭션으로 실행되지 않는다 라는 내용이었다. 이 주장의 근거로 "자식 트랜잭션에서 예외가 발생하..
Log4j 보안 이슈와 스프링 부트와의 상관 관계
Log4j 보안 이슈와 스프링 부트와의 상관 관계
2021.12.11사내에 갑자기 기사 내용을 공유하면서, log4j2에 대한 보안 이슈가 있다며, 모든 프로젝트에 대한 버전업을 진행해야 된다라는 메시지를 봤다. 기사 내용에는 log4j2를 사용하면 제로데이 공격 가능성이 있다라는 내용이었다. (기사 내용) 하지만 우리는 스프링 부트를 이용해서 프로젝트를 만들고있다. spring-boot-start-logging은 slf4j라는 로깅 인터페이스를 이용해서 로그를 찍는데, 구현체인 log4j2랑 logback을 라이브러리로 다운받는다. 그리고 구현체는 기본적으로 Logback을 이용한다. 스프링 공식 문서에도 해당 내용은 언급되어있다. By default, if you use the “Starters”, Logback is used for logging. Appropri..
@Async는 어떤식으로 실행될까?
@Async는 어떤식으로 실행될까?
2021.08.23예제 코드 @Slf4j @Service @RequiredArgsConstructor public class Producer { private final EmailService emailService; public void doSomething() { emailService.send(); log.info(">>> doSomething"); } } @Slf4j @Service public class EmailService { @Async public void send() { log.info(">>> 이메일 전송 시작"); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } log.info(">>> ..
Spring AOP self-invocation이 발생하는 이유와 @Transaction 사용시 주의사항
Spring AOP self-invocation이 발생하는 이유와 @Transaction 사용시 주의사항
2021.08.11최근 Spring AOP를 학습하는 도중 self-invocaion이라는 문제를 발견했습니다. 이 문제를 해결하면서 정리한 내용을 공유해보고자 합니다. public interface Pojo { void foo(); void bar(); } @Slf4j public class SimplePojo implements Pojo { @Override public void foo() { log.info("### foo"); bar(); // this.bar() } @Override public void bar() { log.info("### bar"); } } SimplePojo 클래스는 Pojo인터페이스를 구현한 클래스입니다. foo()는 bar()를 호출하고있는 모습입니다. 테스트 케이스 Pojo refer..
EventLister를 활용한 느슨한 결합 및 이벤트 처리.
EventLister를 활용한 느슨한 결합 및 이벤트 처리.
2021.07.21서론 사내에서 새로운 도메인 작업을 담당하면서 특정 로직을 실행한 뒤 후처리를 해야되는 상황에서 사용했던 방법에 대해서 공유하고자합니다. 가상 시나리오 회원 가입 -> 포인트 적립 및 이메일 발송 예제를 명시적으로 보이기위해 SignUp~, Update~Service 기능을 나타내는 네이밍을 사용했습니다. - Before: 결합도가 강하고 좋지 않은 설계 @Getter public class User { private Long id; private String email; public User(final Long id, final String email) { this.id = id; this.email = email; } } @Repository public class MemoryUserReposito..
ResponseEntity는 왜 사용하는 것이며 @RestControllerAdvice는 무엇일까.
ResponseEntity는 왜 사용하는 것이며 @RestControllerAdvice는 무엇일까.
2021.05.02스프링 3.2부터 @ControllerAdvice를 이용해서 편리하게 전역으로 exception handling을 할 수 있습니다. 저도 개인적으로 전역으로 예외를 처리 설정할 때 유용하게 쓰고 있었습니다. 그런데 우연치 않게 @RestControllerAdvice라는 어노테이션을 발견해서 해당 어노테이션을 확인해 보았습니다. 확인해본 결과 @ResponseBody + @ControllerAdvice가 합쳐진 어노테이션이었습니다. 참고로 @ReponseBody는 HttpMessageConverter를 통해서 응답 값을 자동으로 json으로 직렬화 한 뒤 응답해주는 역할을 합니다. (대표적으로 많이 사용되는 @RestController는 @Controller + @ReponseBody입니다) 순간 아차 싶..
@ConfigurationProperties를 immutable하게 설계하기
@ConfigurationProperties를 immutable하게 설계하기
2021.04.15스프링부트 2.2부터 @ConstructorBinding을 이용해서 @ConfigurationProperties를 immutable하게 설계할 수 있습니다. - @ConfigurationProperties이란 prefix에 매핑되는 외부 설정 값을 객체로 바인딩 시킬 수 있는 기능입니다. (자세한 건 문서를 참고하시면 좋을 거 같습니다) 기존 사용 방식 @Getter @Setter @ConfigurationProperties(prefix = "member") public class MemberProperties { private String firstName; private String address; private int age; } application.yml # application.yml memb..
[Spring, OOP] 생성자 주입이 좋은 이유와 스프링을 이용한 다양한 DI
[Spring, OOP] 생성자 주입이 좋은 이유와 스프링을 이용한 다양한 DI
2021.02.10GOAL 다양한 의존성 주입 방법을 알 수 있습니다. 각 의존성 주입의 장단점을 비교할 수 있습니다. 생성자 주입이 권장되는 이유를 알 수 있습니다. 실험을 위한 클래스 의존관계 우선 의존관계 주입은 크게 3가지 방법으로 나눌 수 있습니다. 수정자 주입(setter 주입) 필드 주입 생성자 주입 메소드 주입 방법은 수정자 주입과 비슷하니까 설명은 따로 생략했습니다. 수정자 주입(Setter) @Service public class OrderService { private DiscountPolicy discountPolicy; @Autowired public void setDiscountPolicy(DiscountPolicy discountPolicy) { this.discountPolicy = disco..