Server/Spring 51

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

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

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

Spring - Kafka Producer, Consumer 설계하기!

아래는 이벤트 처리를 위해 Kafka Producer, Consumer를 설계하고 적용한 내용을 정리한 것이다. Kafka 자체에 대한 내용은 이전 포스팅을 참고하자. 참고: https://jaehoney.tistory.com/197 비즈니스 설명 필요한 비즈니스는 아래와 같이 표현할 수 있다. 메일 API가 사용자에게 요청을 받아서 발송 서버로 요청을 한다. 발송 서버는 메일을 발송한 후 비동기 이벤트를 통해 Kafka로 메시지를 전파한다. Consumer는 해당 메일 정보를 받아서 사용자 설정(Archive 설정)에 따라 메일을 영구히 보관한다. Kafka 설정 Kafka에서 Producer, Topic, Consumer에는 수 많은 설정이 있다. 해당 설정들은 성능, 가용성에 엄청난 차이를 불러온다..

Server/Spring 2023.04.17

Spring - @Component가 동작하지 않는 이슈?! (Bean과 Component 차이)

어느날 AOP를 활용한 샤딩 라이브러리를 개발하던 중에 버그가 발생했다.아래는 개발한 라이브러리의 일부이다.@Component@Aspectpublic class ShardAspect { private final DataSourceFactory dataSourceFactory; @Before("@within(org.springframework.transaction.annotation.Transactional)") public void setDataSources(JoinPoint joinPoint) throws SQLException { // 구현 }}문제는 해당 라이브러리가 API 모듈에서는 동작했는데, 컨슈머 모듈에서는 동작하지 않았다.디버깅을 했는데 생성자 쪽 브레이크..

Server/Spring 2023.04.17

SpringBoot - zip 압축 및 다운로드 구현하기!

Spring 프로젝트에서 zip 다운로드를 구현한 내용을 공유한다. 요구사항은 아래와 같았다. 사용자로부터 GET 요청을 받으면 파일 시스템 내의 특정 폴더의 파일들을 zip 형태로 내려준다. Content-Type / Accept 스펙 설계 API를 설계하면서 Content-Type과 수용 가능한 Accept 설계가 필요하다. 아래의 두 가지 중 선택에 고민이 있었다. application/zip application/octet-stream 아래 부분 참고했을 때 application/zip이 IANA에 공식적으로 등록된 MIME 표준이라서 가장 적합한 솔루션이라고 한다. 참고 - stackoverflow 추가로 아래의 이유가 있어서 application/zip을 선택했다. zip 이외의 다운로드가 추..

Server/Spring 2023.03.10

Spring - 멀티 모듈을 적용하면서 (+ CQRS, 이벤트 기반 아키텍처 적용)

최근 사이드 프로젝트에서 멀티모듈을 적용하면서 생긴 문제점들과 해결 과정을 공유하고자 한다. 기존의 싱글 모듈 프로젝트를 아래 네 개의 모듈로 분리할 수 있었다. 멀티 모듈을 적용한 부분과 이벤트 기반 아키텍처를 적용한 부분에 대해 다룬다. 멀티 모듈 아래는 멀티 모듈을 적용해보게 된 이유에 대해 설명한다. 1. Write Back (주기 반영) 조회가 1회 발생할 때마다 조회 수를 매번 Update문으로 갱신하면 DB에 부하가 매우 커질 것이라고 판단했다. 쓰기 락으로 인해 처리량 감소 -> DB 커넥션 쌓임 TPS 저하 및 DB 서버 부하 상승 그래서 Write Back을 해서 일정 주기로 DB에 반영할 수 있도록 작업이 필요했다. 즉, Scheduler가 필요했다. API에 Scheduler를 추가..

Server/Spring 2023.01.25