Server 121

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

Gradle - DependencyManagement 이해하기!

멀티 모듈 프로젝트에서 외부 라이브러리를 사용할 때 고민이 있었다. A 프로젝트와 B 프로젝트와 C 프로젝트에서 모두 동일한 버전의 라이브러리를 사용해야 하는 상황 각 프로젝트의 build.gradle에서 라이브러리 의존성 버전을 일일이 동기화해줘야 한다. 이러한 문제를 잘 해결할 수 없을까..? dependency-management-plugin Gradle의 의존성 관리 플러그인(Dependency-management-plugin)을 사용하면 이를 해결할 수 있다. 의존성 관리 플러그인은 Maven과 같은 의속성의 관리 및 제외를 제공하는 Gradle Plugin이다. Gradle 6.8 이상 Java 8 버전 이상에서 지원된다. 사용하기 전에 DependencyManagement는 Gradle 플러..

Server/Gradle 2023.05.30

ATDD 이해해보기!

최근 TDD에 큰 관심이 생겨서 요즘 핫하다는 ATDD에 대해서와 TDD에 대해 더 깊게 이해하려고 했다. 강연을 찾던 중 NEXTSTEP에 ATDD, 클린 코드 with Spring이라는 좋은 강의 코스가 있는데, 가격이 80만원이다... ㄷㄷ https://edu.nextstep.camp/c/R89PYi5H/ 사실 조금 부담스러워서 우아한 ATDD라는 우아한 테크 세미나 발표가 있다. 아래는 해당 발표 내용을 공부하며 정리한 것이다..! 사실 메모에 가깝다. 인수 테스트 인수 테스트는 시나리오(사용자 스토리) 기반으로 기능을 테스트하는 것이다. 이러한 인수 테스트는 아래의 장점이 있다. 배포 없이 빠른 피드백을 받을 수 있다. 도메인과 서비스 파악에 큰 도움이 된다. QA 절차 없이 테스트 코드만으로..

Server/JUnit, Spock 2023.05.17

우아한 스프링 배치 강연내용 정리 (+ 통합 테스트 SpringTestContext Caching 팁!)

배달의 민족의 주문, 포인트, 정산 시스템에서 향로님께서 적용하면서 얻은 팁을 아래 강연에서 발표했다. https://www.youtube.com/watch?v=_nkJkWVH-mo Web vs Batch Web 실시간 처리를 위주로 한다. 상대적인 처리 속도를 가진다. QA가 용이하다. Batch 후속 처리를 위주로 한다. 절대적인 처리 속도가 측정된다. QA가 복잡하다. (DB나 자바 코드를 까봐야, 문제를 찾을 수 있기 때문) 철저한 테스트 코드가 반드시 필요하다. 배치 애플리케이션이 필요한 근거 아래의 경우에는 필수적으로 배치 애플리케이션이 필요할 수 있다. 일정 주기로 실행되어야 할 때 실시간 처리가 어려운 대량의 데이터를 처리할 때 배민에서는 매출의 경우 5억건 정도가 있고, 매출 상세의 경우..

Server/Spring batch 2023.05.02

Spring Batch - 기본 주요 도메인 이해하기!

Job Job은 배치 계층에서 가장 상위에 있는 개념으로 하나의 작업 자체를 의미한다. Job Configuration을 통해 생성되고 하나의 작업을 어떻게 구성하고 실행할 것인지 전체적으로 명세한다. 여러 개의 Step으로 구성되기 때문에 최소한 1개 이상의 Step을 구성해야 한다. Job의 경우 빈으로 등록한 후 수동으로 실행시킬 수도 있고, SpringBoot의 BatchAutoConfiguration에서 기본으로 빈으로 등록한 Job을 수행한다. Job 구현체 Job 구현체는 크게 두 가지로 나뉜다. SimpleJob 순차적으로 Step을 실행시키는 Job 모든 Job에서 유용하게 사용할 수 있는 표준 기능을 가지고 있다. FlowJob 특정한 조건과 흐름에 따라 Step을 구성하여 실행시키는 ..

Server/Spring batch 2023.04.24

HikariCP 커넥션 누수 해결기 (Session wait_timeout 적용!)

HikariCP 커넥션 누수 해결기 (Session wait_timeout 적용!) 아래의 에러가 뜨면서 커넥션 연결이 실패하는 이슈가 발생했다. the last packet successfully received from the server was 30,035 milliseconds ago. 조금더 로그를 올라가보니 이런 경고가 뜨고있었다. 아래와 같이 각 커넥션으로 연결을 시도하다가 모두 실패했다. 2023-04-18 08:01:12.345 WARN 20 --- [nio-8080-exec-9] com.zaxxer.hikari.pool.PoolBase : HikariPool-3 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@1d5d8..

Server/Spring JPA 2023.04.19