본문 바로가기
반응형

IT/Java318

@Transactional 사용시 주의 사항4 (propagation(전파속성) 에 대해) 이전 포스팅에서 Transactional annotation 설명 시 propagation에 대해 다룬적이 있다. 간단히 언급만 되었어서 자세하게 하나하나 설명이 들어갈 포스팅이다. 사용법은 아래와 같다. @Transactional(propagation = 아래 속성) 속성 설명 비고 Propagation.REQUIRED 따로 지정을 해주지 않으면 default 부모 트랜잭션 내에서 실행하며 부모가 없으면 새롭게 생성을 하여 자신이 부모가 된다. 예외발생시 예외가 전파되며 상위로 올린다. Propagation.REQUIRES_NEW 실행할때 새롭게 Transactional 을 생성한다. 기존에 부모 Transactional 로 묶여있더라도 별개로 작동하여 부모와는 무관하게 돌아간다. 예외 발생해도 상위 .. 2023. 11. 14.
@TransactionalEventListener 란? 이전에 포스팅에서 Transactional 에 대한 포스팅과 EventListener 에 대해 다룬 포스팅이 있다. 먼저 읽고 오는것을 추천한다. 아래 참고 포스팅 참고바란다. EventListener 부분을 확장해서 Transactional 을 입혔다고 생각하면 된다. 아래 예시코드에서 설명하면. private final ApplicationEventPublisher eventPublisher; private final EventRepository repository; @Transactional public void transactionalListener() { InsertTableEntity entt = new InsertTableEntity(); entt.setId("2"); entt.setName.. 2023. 11. 13.
@EventListener 란? (ApplicationEventPublisher, publishEvent) 현재는 다른 좋은 방법들이 많아서 잘 사용되지 않지만 개념에 대해서 알고 가고자 포스팅을 남긴다. 기존에 아래 사진과 같은 비지니스가 있다고 하면 하나의 비지니스가 너무 길고 간단하게 봐야 이정도지 서로 물리고 엮여있는게 많다면 그 비지니스 하나는 엄청나게 커지고 유지보수 측면에서도 어렵고 복잡할 것이다. 그래서 요즘엔 MSA 로도 많이 나오지만 비지니스 관점에서 보면 아래 그림과 같이 바뀌고 있다. event 발생 여부에 따라 어떤 메서드를 동작 시킬지에 대해 이런 방식으로 흘러간다. 요즘엔 AOP로 설정을 해두거나 Kafka, MQ 등으로 설정을 하곤 한다.(참고 포스팅 참고) 그럼 자바에서는 이 이벤트를 구현하기 위해서는 ApplicationEventPublisher @EventListener 이 .. 2023. 11. 12.
equals 함수 (equalsIgnoreCase) 자바에서 equals 함수는 String 을 비교하는데 사용이 된다. 예를들어 System.out.println("A".equals("A")); //true System.out.println("A".equals("B")); //false 이렇게 출력이 된다. 사용하면서 몇가지 주의점과 팁을 적어보려고 한다. 주의점 - NullpointException 발생 회피 만약 아래와 같은 코드가 있다고 하면 String text = null; System.out.println(text.equals("A")); 이 경우는 null을 어떤것과 비교하려고 하기에 에러가 발생한다. 그래서 우회 하려면 System.out.println("A".equals(text)); 이렇게 해주면 nullpoint exception 을.. 2023. 11. 9.
if/else 동작 방식 개발을 할때 중요한 요소 중 하나는 퍼포먼스이다. 동일한 input 과 동일한 output이 나오는 로직이지만 개발 방식에 따라 결과가 빠르거나 늦을수도 있다. 비지니스 로직을 개발하며 많이 사용하는것 중 하나가 바로 if / else if / else 인데 이에 대해서 적어보려고 한다. if else 순서 조회 아래와 같은 코드가 있다고 해보자. if (transactionA()) { a=1; }else if (transactionB()) { a=2; }else { a=3; } 로직 설명은 패스하고 만약 TransactionA -> 100 sec. TransactionB -> 50 sec. TransactionC -> 10 sec. 가 각각 걸린다고 하면 else까지 오기에는 150초 이상이 걸리게 된.. 2023. 11. 8.
[error] Method has too many Body parameters (multiple RequestBody) openfeign 사용시 이와같은 에러가 발생하였다. Method has too many Body parameters 일단 하나의 Request 에서 여러개의 RequestBody를 받을수 없다. 하나의 RequestBody + 여러개의 RequestParam으로 하거나 하나의 RequestBody 내부에 여러개를 받게 하여 RequestBody는 하나로만 해줘야한다. openfeign 뿐 아니라 일반적인 restapi에서도 마찬가지 이니 주의하도록 하자. 2023. 11. 7.
Openfeign 에서 fallback 동작 안할때 이전 포스팅에서 Openfeign 관련해서 간단 설명과 예제를 작성한 적이 있다. 자세한 내용은 아래 참고 포스팅 참고 바란다. 정상적으로 fallback이 이루어지지 않아서 추가 포스팅을 작성한다. 일단 fallback 개념은 아래 참고 포스팅 참고 바란다. 그리고 장애 처리에 대한 circuitbreaker 에 대해서도 한번 확인하는것이 좋다. 결국 fallback 역시 장애 처리에 대한 내용이기 때문이다. circuitbreaker 는 아래 참고 포스팅을 참고 바란다. 기존 포스팅대로 작성을 했는데 openfeign 이 정상 동작을 안한다면 application.yml 파일에 값을 추가해야한다. feign.circuitbreak.enabled = true 가 이루어져야하고 만약 사용하는 openfe.. 2023. 11. 6.
@Transactional 사용시 주의 사항3 (Proxy 관련 // private 금지, 트랜잭션 분리) 이전 포스팅에서 Transactional 에 대한 설명도 다룬적이 있고 주의사항에 대해서 다룬 글이 있다. 자세한 내용은 참고 포스팅 참고 바란다. 이번 포스팅에서 다룰 내용은 Transactional annotation을 선언할때 주의할 점이다. 1. private 로 선언된 메서드에 transactional 금지 Transactional 은 CGLIB 이 Proxy를 생성하여 호출을 하게 된다. CGLIB이 Transactional 이 걸려있는 메서드를 잡기 위해서는 외부에서 접근이 가능해야한다. 그리하여 private 로 선언 하면 해당 메서드에 접근을 못하여 transactional이 적용이 안된다. 2. 동일 Bean안에서(class) 여러 트랜잭션 금지 Transactional 은 AOP 기반.. 2023. 11. 4.
접근 제어자(public, protected, private, default) 자바에서는 접근제어자 라는 개념이 있다. 간단하게 설명하면 외부에서 해당 클래스, 해당 변수 등을 접근할수 있는지를 제어하는 것이다. 예를 들어 변수를 선언할때 String name = "name"; 이런식으로도 사용하지만 앞에 접근제어자를 추가하여 private String name = "name"; 이렇게 사용이 가능하다. 앞에 붙일수 있는 접근제어자는 총 3개이고 안붙이는 경우까지 포함하면 총 4가지의 경우가 생긴다. 각 경우에 따라 접근이 가능한 범위는 아래와 같다. public는 '공개'를 나타내며, 모든 클래스에서 접근이 가능 (패키지와 상관없음) private는 '비공개'를 나타내며, 같은 클래스안에 있는 멤버들만 접근이 가능 protected는 같은 패키지안의 모든 클래스와, 다른 패키지의.. 2023. 10. 30.
반응형