본문 바로가기

BackEnd/spring8

[Spring] redis stream 최근 회사에서 로깅 로직 때문에 성능 저하가 있었습니다.요청 -> 로그 DB 적재 형태로 되어 있다 보니 트래픽이 많이 발생하게 되면 connection pool , insert 성능 등 문제가 있었습니다. 그래서 로그를 DB에 바로 적재하는 방식이 아니라 중간에 로그를 모아서, bulk로 insert 하도록 로직을 수정하려고 했습니다.이를 위해 redis stream을 이용했습니다.  1. redis stream이란?redis에는 다양한 자료 구조가 있습니다.이중에서 이벤트 소싱처럼 쓰기 적절한 자료구조로 list, pub/sub, stream 이 있습니다. pub/sub의 경우에는 중복 없이 데이터를 동시에 처리할 수가 없습니다. 예를 들면, test_topic이라는 topic이 있고, 이를 여러 c.. 2024. 12. 17.
[Spring] @Value @SpringBootTest 없이 테스트하는 법 이번 주제는 테스트 관련입니다. 스프링에서는 @Value annotation을 통해서 application.properties에서 값을 가져와서 변수에 줄 수 있습니다. 이런 식으로 자주 이용합니다. 그렇다면 이를 테스트 하려면 어떻게 해야 할까요? 이렇게 테스트를 할 수 있습니다. 만약 @SpringBootTest가 없으면 name에 null이 들어갑니다. 하지만 서비스가 커지면, @SpringBootTest를 할 시에 테스트 실행 속도가 느려집니다. 그리고 다른 곳에서 bean을 주입할 때 에러가 생기는 등 이러한 현상이 발생하게 되면 이 테스트는 실패하게 됩니다. 단위 테스트를 하려면 어떻게 해야 할까요? 이런 식으로 할 수 있습니다. 만약 MyService에서 스프링 빈 주입 없이 단위 테스트를 .. 2024. 2. 28.
[Spring] AOP 테스트 이번에 회사에서 AOP에 관한 테스트 코드를 작성하다가 겪은 문제입니다. 로깅을 위해 AOP를 많이 이용합니다. 근데 AOP가 동작하는 지 테스트를 하려면 어떻게 해야 할까요? 이런 코드가 있고, redis에 어떤 값이 들어가거나 꺼낼 때 로깅을 하고 싶다고 가정해보겠습니다. 간단하게만 작성했습니다. AOP를 이용하면 이러한 코드가 나올 것 입니다. 근데 Redis에 관해 어떠한 설정도 없이 AOP가 작동하는 지 테스트하고 싶으면 어떻게 할까요? 저는 처음에 MockBean을 이용하려고 했습니다. 하지만 AOP의 부분은 동작하지 않았습니다. 이렇게 만든 repository가 다른 취급되는 지 궁금해서 한 번 출력해봤습니다. 이렇게 나오는데, 그러면 AOP의 Around 조건에 만족한다고 저는 생각했습니다.. 2023. 12. 21.
[Spring] 빈 주입 null pointer exception 발생 최근 개발할 때, 직접 postman으로 테스트 하는 것보다는 테스트 코드를 작성해서 돌려봅니다. 간단하게 테스트해볼 것이 있어서 통합테스트를 했었는데, 계속 null pointer exception이 발생했었습니다. 이 부분이 문제되는 코드 입니다. @Service public class SimpleService { public Integer add(Integer a, Integer b) { return a+ b; } } @RestController @RequiredArgsConstructor public class SimpleController { private SimpleService simpleService; @RequestMapping("/") public Map add(Integer a, In.. 2023. 8. 22.
[인프런] 스프링 핵심 원리 고급편(김영한) 정리 코로나 격리 기간 동안 기본편, 고급편을 다 보는 것이 목표였는데 성공했네요. 이제 복습만 해보면 될 것 같습니다(해당 포스트는 제가 복습하기 위해 정리해 둔 것 입니다.) 이번 강의는 조금 어려웠습니다. 그리고 AOP를 실제로 많이 쓰는 지 의문이 들었습니다. AOP와 프록시 객체가 중점인데 이를 실제 프로젝트에 적용해보고 싶네요. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard 로그 추적기를 만들 때, 이 강의에서는 전부 콘솔을 통해 눈으로 직접 확인함. assertThat 같은 junit의 기능을 활용하지 .. 2023. 7. 30.
[인프런] 스프링 핵심원리 기본편(김영한) 정리 이번에 코로나에 걸리면서 일주일 동안 휴가를 가지게 되었습니다. 이 기간 동안 인프런의 김영한님 강의를 전부(기본, 고급)을 볼 계획입니다. https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard 이는 기본편을 듣고 제가 보기 편하게 정리한 내용입니다. 기초(김영한) 스프링 부트 장점 애플리케이션 쉽게 생성가능. tomcat이 내장임 외부 라이브러리(3rd path) 자동 구성 SOLID OCP를 지키려면 객체를 생성하거나 그러한 것들을 해주는 무언가가 있어야 함.(스프링 DI도 가능) DIP 추상화에 의존. 구체화에 .. 2023. 7. 28.