Server 121

Unit Test - 리팩토링 내성이란 무엇인가?!

최근에 진행중인 대부분 프로젝트에서 Coverage 100%를 지향하면서 단위 테스트(Unit test)도 많아졌다. 해당 포스팅에서는 단위 테스트(Unit test)를 짜면서 얻게된 지식을 일부 공유한다. 리팩토링 내성 리팩토링 내성이란 테스트를 바꾸지 않고 프로덕트 코드를 리팩토링할 수 있어야 함을 의미한다. 쉽게 설명하면 리팩토링 과정에서 거짓 양성이 발생하지 않아야 한다. 거짓 양성: 기능은 잘 동작하는데 테스트가 깨지는 경우 테스트가 구현과 결합도가 높은 경우 발생한다. 단위 테스트를 신뢰할 수 없게 만든다. 프로덕트 코드를 유연하지 못하게 만든다. 구현에 의존하는 경우 최근에 외부 모듈을 사용한 코드에서 모듈 버전을 변경하면서 테스트가 다량 실패하는 현상이 발생했다. POJO 객체만 그대로 사..

Server/JUnit, Spock 2023.08.06

Reactive Programming(리액티브 프로그래밍)이란 무엇인가?!

보통 증권이나, 대량의 트래픽이 발생하는 거래소, 뱅킹 시스템에서 필요로 하는 기술 스택 중에 아래의 것이 있다. Reactive Programming, Parallel Programming, Webflux, Netty,, … 리액티브 프로그래밍에 대해 알아보자. Reactive Programming(리액티브 프로그래밍) Reactive의 정의는 "reacting to events or situations rather than acting first to change or prevent something" 이다. 이를 직역하면 "무언가를 바꾸거나 예방하기 위해 먼저 행동하기 보다는 사건이나 상황에 반응하는"이다. Reactive Programming은 데이터 스트림과 변경 사항 전파를 중심으로 하는 비동..

Spring Legacy의 실행 순서!

Spring Legacy 프레임워크가 실행되는 순서는 다음과 같다. 위 동작을 단계별로 정리해보자. 1. Tomcat(WAS)에 의해 web.xml 로드 web.xml은 WAS가 최초 구동될 때 사용하는 웹 애플리케이션 설정 파일이다. contextConfigLocation /WEB-INF/spring/root-context.xml org.springframework.web.context.ContextLoaderListener appServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/appServlet/servlet-context.xml 1 appServlet *.do 각 태그는 크게 ..

Server/Spring 2023.07.16

Spring Test - ContextCustomizerFactory란 무엇인가?!

지난 번 Spring-kafka 라이브러리에서 ContextCustomizerFactory의 구현체인 EmbeddedKafkaContextCustomizerFactory를 수정했었다. https://jaehoney.tistory.com/347 ContextCustomizerFactory에 대해 알아보자. ContextCustomizerFactory ContextCustomizerFactory는 ContextCustomizer를 생성하는 클래스이다. 해당 클래스는 Spring-test 라이브러리 안에서 관리되며, ConfigurableApplicationContext(ApplictionContext를 상속하는 인터페이스)가 Refresh 되기 전에 Context를 커스터마이징 하기 위해 사용한다. 일반적으..

Server/Spring 2023.07.15

스프링 배치 Scope, Context 이해하기!

아래는 Spring Quartz + Spring Batch를 사용하여 만든 주식 1분봉 수집 서버 코드 일부이다. https://github.com/violetbeach/kis-trading-server/blob/master/boot/data-processing-server/src/main/java/com/violetbeach/kistradingserver/boot/processing/adapter/in/batch/job/DataProcessingStepConfiguration.java 코드를 요약하면 아래와 같다. Batch Job이 @Bean으로 등록되어 있다. 여기서 보면 Step에서 SpEL을 사용해서 stepExecutionContext에 접근하고 있다. 이게 내부적으로 어떻게 동작하는 것인지 ..

Server/Spring batch 2023.07.15

SpringApplication.run()을 호출하면 일어나는 일들!

요즘 들어서 Spring의 동작 원리에 대해 많이 부족하다고 느낀다. 2년차인데.. 부끄럽다! 다시 초심으로 돌아가자 ㅠ 보통 스프링부트로 개발하면 main() 메서드를 통해 SpringApplication.run() 메서드를 호출한다. SpringApplication.run()을 호출하면 일어나는 일에 대해 알아보자. SpringApplication.run() 가장 먼저 알아야할 것은 해당 코드는 SpringApplication 클래스는 SpringBoot에서만 사용한다는 점이다. 그러면 일반 Spring Legacy 에서는 어떻게 사용할까? Spring Legacy는 SpringApplication을 직접 실행하지 않는다. 빌드를 한 후에 WAS에 war를 내장시켜서 돌리는 방식이다. 코드 publi..

Server/Spring 2023.07.11

Hibernate - QueryPlanCache Memory Leak 해결하기!

오늘 OOM이 터졌다는 요청이 왔다. 그래서 해당 API를 새로 배포한 후, 원인을 찾기로 했다. HeapSize 확인 첫 번째로 살펴본 부분은 HeapSize였다. java -server -Xms256m -Xmx256m 놀랍게도 HeapSize가 256m 이었다. 일단 Size가 너무 적었기 때문에 누수가 아니라, 트래픽 급증 등이 원인일 수도 있겠다고 생각을 했다. 문제가 되는 부분 해당 배치가 돌아간 시간을 확인해보니 아래 쿼리가 문제가 되었음을 확인했다. public interface CommentRepository extends JpaRepository { @Query("select m from Comment m where m.userId in (:userIds)") List findAllByU..

Server/Spring JPA 2023.06.29

Spring - Environment 동작원리 이해하기!

기존 자바 애프리케이션의 경우 커맨드 라인 인수, 자바 시스템 속성 인수, OS 환경변수 등을 꺼내는 방법이 달랐다. OS 환경 변수: System.getEnv(key) 자바 시스템 속성: System.getProperty(key) … 스프링은 이를 추상화해서 PropertySource라는 추상 클래스를 만들고, 그것을 구현하는 XXXPropertySource라는 구현체를 만들었다. 그래서 내부적으로 스프링 컨테이너 로딩 시점에 PropertySource들을 생성하고, Environment에서 사용할 수 있게 연결해둔다. Environment에서 PropertySource를 하나씩 접근해서 찾으면서 속성을 찾으면 반환하는 방식 스프링에서 내부적으로 우선순위를 정하고 있다. https://docs.spri..

Server/Spring 2023.06.27

Spring-Boot의 동작원리 이해하기 (+ 자동구성, 라이브러리 잘 사용하기!)

최근에 Spring-Kafka에서 기여하고, 사내에서 라이브러리를 많이 만들면서 공통 라이브러리에 대해 관심이 많아졌고, Spring-boot에 대해서 이해도가 많이 부족하다고 느꼈다. 해당 포스팅에서는 SpringBoot의 동작 원리에 대해 간략히 다룬다. 기존 방식 vs 스프링 부트 웹 애플리케이션을 개발하고 배포하려면 WAR 방식으로 배포를 했어야 했다. 톰캣을 별도로 설치하고 설정을 구성해야 한다. 애플리케이션 코드를 WAR로 빌드해야 한다. 빌드한 WAR 파일을 WAS에 배포해야 한다. 이러한 방식은 아래의 단점이 있었다. WAS를 별도로 설치해야 함 개발 환경이 복잡 배포 과정도 복잡 톰캣의 버전을 변경하려면 톰캣을 다시 설치하고 서버를 다시 구성해야 함 그래서 Spring Mvc 방식 + 내..

Server/Spring 2023.06.22

EmbeddedKafka가 Nested와 사용이 안되는 이슈 해결 (+ Spring-Kafka에 기여)

개발 중에 EmbeddedKafka를 적용하니 일부 테스트가 깨지는 현상이 발생했다. 딱히 잘못한 부분도 없는 데 깨진 것 같아서 의아했다. 아래는 해당 부분에 대해 해결하고 Spring-kafka에 기여하게 된 내용에 대해 다룬다! 최초 확인 확인해보니까 @Nested 어노테이션이 달린 클래스의 테스트들만 깨지고 있었다. 왜 그럴까..? WireMock 서버가 이미 떠 있다는 경고로 깨지고 있었다. WireMock을 제거하니 MockMvc에서 에러가 나고 있었다. 복잡한 원인을 확인하려니까 어려워서 새로운 Repository에서 재현을 해보기로 했다. Repository: https://github.com/violetbeach/embedded-kafka-nested 1. WireMock 문제 아래는 실..

Server/Spring 2023.06.10