스프링 347

4. 로그추적기 V1 프로토타입

이런 식으로 나오게 할 생각 인 듯 @Slf4j public class TraceId { private String id; private int level; public TraceId(){ this.id = createId(); this.level = 0; } private String createId(){ return UUID.randomUUID().toString().substring(0,8); } private TraceId(String id, int level){ this.id = id; this.level = level; } public TraceId createNextId(){ return new TraceId(id, level + 1); } public TraceId createPreviou..

3. 요구사항 분석

로그 추적기 시나리오 기존에 있던 거대한 프로젝트의 로그 추적기를 만드는 것 이다. 운영에 필요한 로그 추적기를 만드는 것이다. - 최근 병목이 발생하는 상황 - 어떤 부분에서 병목이 발생하는지, 어디서 예외가 발생하는 지 기존엔 개발자가 발생한 부분을 어렵게 찾아서 로그를 하나하나 직접 만들어 남겼다. 로그를 미리 남겨둔 다면 손쉽게 찾을 것. 이 부분을 개선하고 자동화. 요구사항 모든 public 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션 흐름을 변경하면 안됨 (예를 들어 로그남기는 로직에서 예외가 발생해도 비즈니스 로직은 정상동작 해야 함) 메소드 소요 시간 정상 흐름과 예외 흐름 구분 (로그를 약간 다르게 출력) 메서드 호출의 깊이를 표현 함. (컨트롤러 -> 서비스 --> 리포지토리 ..

2. 예제 만들기

@Repository @RequiredArgsConstructor public class OrderRepositoryV0 { public void save(String itemId){ if(itemId.equals("ex")){ throw new IllegalStateException("예외 발생!!"); } sleep(1000); } private void sleep(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { throw new RuntimeException(e); } } } 단지 예시이다. 실용 코드로썬 의미가 없고, ex시에 예외를 뿜게 하는거고, 그 외엔 1초 기다렸다가 정상적으로 저장되었다는 일종의 가상..

1. 강의 소개

스프링의 깊이 있게 이해 하려면, 3가지 개념을 알아야 한다. 스프링 핵심 디자인 패턴 동시성 문제와 쓰레드 로컬 스프링 AOP 스프링 기술들은 대부분 다음의 패턴들로 만들어 짐 템플릿 메서드 패턴 전략 패턴 템플릿 콜백 패턴 프록시 패턴 데코레이터 패턴 동시성 문제와 쓰레드 로컬 웹서버는, 동시에 여러 클라이언트에서 요청을 받을 수 있다. 이 동시 요청을 처리하기 위해 멀티쓰레드를 사용한다. 스프링은, 쓰레드 로컬이라는 개념으로 동시성 문제를 해결함. 스프링 AOP https://qwefdg3.tistory.com/89 21강. AOP Aspect Oriented Programming 측면 지향 프로그래밍 공통관심사항과 핵심관심사항 분리 뭔가 좀 함수마다 공통사항? 예를들어 모든 함수의 실행시간을 측정..

AWS 스프링

일단, 잘 모름. 먼저 ec2 만들고 이거는 그냥 따라하다 보면 쉽게 할 수 있음. https://velog.io/@jonghyun3668/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-EC2-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0 SpringBoot 프로젝트 EC2 배포하기 깃헙에 있는 프로젝트를 AWS EC2에 git clone을 통해 내려받아 jar 파일 빌드를 해보겠습니다.(EC2 인스턴스는 우분투로 진행합니다. 또한 따로 배포 시스템을 구축하지 않고 수동으로 배포하는것만 velog.io 인스턴스 생성하고, 빌드하는 것 까진 이거 따라하셈. 그 다음 https로 해야 하는데, 나는 도메인을 사게 됐음.

스프링 2023.12.11

redis

redis는 우선, 깔려 있어야 쓸 수 있다. 아마도 배포할 때 그 환경에도 깔아야 할 것이다. spring: data: redis: host: localhost port: 6379 설정은 이렇게 @Configuration public class RedisConfig { @Value("${spring.data.redis.host}") private String host; @Value("${spring.data.redis.port}") private int port; @Bean public RedisConnectionFactory redisConnectionFactory(){ return new LettuceConnectionFactory(host, port); } @Bean public RedisTemp..

스프링 2023.12.11

60. 트랜잭션 전파 활용 7

저번에 만약 try catch로 복구를 시도하려 한다면 여러 고려를 했어야 했다. 근데 사실 간단한 것이 있다. REQUIRES_NEW 하면 그냥 저 트랜잭션만 분리시킬 수 있기 때문에, 다른 트랜잭션에 영향이 안간다. @Slf4j @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; @Transactional public void save(Member member){ log.info("member 저장"); em.persist(member); } public Optional findByUsername(String username){ return em.createQuery("se..

59. 트랜잭션 전파 활용 6

그럼 만약, 위의 상황에서 MemberService에서 try catch로 에러를 잡아서 복구시키려 한다면? 우선 트랜잭션에 대한 rollbackOnly를 풀어야 할 듯? 뭐 쓰레드로컬로 접근해서 가져오는 거니, 따로 생성하는게 아니라 static? 그런 것에 접근할 듯? 일단 비즈니스에 예를 들면, 회원가입을 하는 데 만약 로그남기는 것에서 오류가 발생해서 회원가입을 못하게 하면.. 정말 비즈니스 적으로 비효율적이다. 이럴경우, LogRepository에서 예외를 일으켜 rollback을 해도, 저녀석만 rollback하고 나머지는 제대로 Member 등록이 되도록 하는 게 좋다. 근데 일단, 그냥 LogRepository의 save의 트랜잭션 옵션을 REQUIRES_NEW로 하면 된다. 그럼 트랜잭션..