Server 121

Spring - Bean은 어디에 저장되나?

스프링 공식 문서를 읽다가 Spring Bean은 어떤 자료구조에 저장되어 있고 어떤 과정으로 찾아서 의존을 주입하는 지가 궁금해졌다. 해당 부분을 찾아가면서 알게된 결과에 대해 다룬다. 아래에서 말하는 Bean은 싱글톤 빈임을 가정한다. 들어가기 전에 Spring의 경우 템플릿 메서드 패턴과 전략 패턴을 충분히 활용해서 수 많은 인터페이스에 책임을 위임하고 있고 구현체도 아주 많다. 그러다보니 자세히 다루면 양이 너무 방대해지는 문제가 있어서 어디까지 다룰 것인가에 대한 고민이 있었다. 너무 Deep한 문제는 다루지 않고 내용을 다루기에 이해가 필요한 부분까지만 다룰 것이니 겁먹지 마시고 봐주시면 좋겠다! getBean() 아래를 보면 ApplicationContext의 refresh()가 수행되면 i..

Server/Spring 2023.10.09

AOP, Proxy 이해하기! (BeanNotOfRequiredTypeException이 왜 발생할까?)

문제 상황 실무에서 QueryDsl을 사용한 Repository의 테스트 코드에서 에러가 터졌다. 문제를 이해하고 해결한 과정이 인상깊어서 소개하고자 한다. 아래 프로젝트는 소개를 위해 만든 프로젝트의 패키지 구조이다. 우리가 익히 아는 JPA + QueryDsl을 사용할 때 사용하는 패키지 구조이다. QueryDsl을 사용하는 Repository는 아래와 같다. @Repository @RequiredArgsConstructor @Transactional(readOnly = true) public class MemberRepositoryImpl implements MemberRepositoryCustom { private final JPAQueryFactory queryFactory; @Override ..

Server/Spring 2023.09.10

ApplicationContext란 무엇인가?!

ApplicationContext는 무엇일까..? 일반적으로 스프링 컨테이너라고 불리며 빈을 관리한다 정도로 알고 있다. 더 자세히 알아보자. ApplicationContext Central interface to provide configuration for an application. This is read-only while the application is running, but may be reloaded if the implementation supports this. An ApplicationContext provides: Bean factory methods for accessing application components. Inherited from ListableBeanFactory. ..

Server/Spring 2023.08.14

SpringBoot - 무중단 배포 정말 안전할까?! (+ Graceful Shutdown)

k8s, 리버스 프록시 방식 등을 통해 무중단 배포를 하게 된다. 기존 인스턴스를 종료했을 때 이미 수행중인 작업이 있는 지 어떻게 보장할 수 있을까..? Graceful Shutdown Shutdown Graceful은 '우아한 종료'라는 뜻으로 하던 작업을 모두 안전하게 처리한 후 프로세스를 종료하는 것을 말한다. Linux의 kill - 15 명령어로 Graceful Shutdown을 할 수 있다고 말하는데, 실제 Spring 애플리케이션을 보면 하던 작업들이 강제로 종료된다. SpringApplication에서 요청을 어떻게 처리하는 지 Linux에서는 알 수 없기 때문이다! SpringBoot SpringBoot 2.3 부터는 손쉽게 Graceful Shutdown을 할 수 있는 설정을 제공한다..

Server/Spring 2023.08.13

@RequestBody에서 Enum과 String 어떤 것을 사용할까?!

Controller에서 Type과 같이 특정 값에 대해서만 입력을 받아야 하는 경우가 있다. 이때 Enum을 사용하면 아래의 문제가 생길 수 있다. 각 Layer의 강결합 아래는 기존의 코드이다. @RestController @RequiredArgsConstructor public class AlarmController { private final AlarmUseCase alarmUseCase; @PostMapping @ResponseStatus(HttpStatus.NO_CONTENT) public void postAlarm(@RequestBody PostAlarmRequest request) { String content = request.getContent(); PostType type = reque..

Server/Spring 2023.08.13

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