전체 글
-
ArchUnit Test로 컨벤션 강제하기테스트코드(Test Code) 2025. 1. 18. 13:55
개요ArchUnit에 대해서 알아보고 ArchUnit을 활용하여 어떻게 컨벤션을 강제할 수 있는지 글을 작성해보려고 합니다. ArchUnit이란?ArchUnit은 패키지와 클래스, 레이어와 슬라이스 간의 종속성을 검사하고 순환 종속성 등을 확인할 수 있습니다. 주어진 Java 바이트코드를 분석하고 모든 클래스를 Java 코드 구조로 가져와서 이를 수행합니다. 실습 - gradle 세팅dependencies { // 글 작성 기준 공식문서 가이드 버전 testImplementation("com.tngtech.archunit:archunit-junit5:1.3.0") } 실습 - ArchUnit으로 의존성 강제하기class ArchitectureTest { private val import..
-
JVM 밑바닥까지 파헤치기 - 프런트엔드 컴파일과 최적화Java 2024. 12. 22. 14:24
개요스터디를 진행하면서 JVM 밑바닥까지 파헤치기 책의 10장 프런트엔드 컴파일과 최적화 발표를 맡게 되었고 이에 대한 내용을 정리해보고자 합니다. 프런트엔드 컴파일이란?.java 파일을 .class 파일로 변환하는 과정을 프런트엔드 컴파일이라고 합니다. 자바 소스 코드 → 바이트코드로 변환하는 과정입니다. 반대로 백엔드 컴파일의 경우 바이트코드를 기계어로 변환하는 과정을 뜻합니다. JIT 컴파일러가 런타임에 최적화를 수행하기도 하며, AOT 컴파일러가 특정 하드웨어용 네이티브 바이너리 코드로 곧바로 컴파일하기도 합니다. 최적화(optimization)는 무엇을 의미할까?먼저 최적화의 사전적 의미를 찾아보면 아래와 같습니다. 1. 한정된 자원과 상황 속에서 최대한의 성능을 발휘할 수 있도록 끌어올리는 ..
-
우리는 왜 spring kafka batch listener를 활용하지 않나요?프로젝트/kafka 2024. 12. 1. 23:38
개요신규입사자분께서 우리는 왜 kafka message를 consume 할 때 batch listener를 활용하지 않는지, 그 선택에서 어떤 히스토리와 결정이 있었는지 물으셨습니다. 단건씩 메시지를 받지 않고 batch listener를 활용하여 한번에 여러 건의 메시지를 받으면 네트워크 레이턴시를 아낄 수 있을 것 같다는 의견을 주셨습니다. 질문 주신 내용이 합리적인 생각이라는 들었지만 batch listener에 대한 지식이 없었기 때문에 why에 답변을 할 수 없었습니다. 그에 대한 답을 찾기 위한 여정을 기록해보고자 합니다. Batch Listener란?@Beanfun myContainerFactory(): ConcurrentKafkaListenerContainerFactory { val..
-
spin lock 대신 Thread Waiting을 활용하면 성능이 얼마나 개선될까?성능테스트 2024. 11. 23. 09:38
개요spin lock 방식에서 cpu의 리소스가 얼마나 점유될지 궁금하여 성능 테스트하면서 글을 작성했습니다. 만약 spin lock 방식 대신 Thread Sleep 방식을 적용하면 cpu의 성능이 얼마나 개선될 수 있을까요? Thread Sleep 방식을 알아보기 전에 임계영역을 점유하는 방법인 metux에 대해 알아보겠습니다. mutex란?Mutex는 특정 구현보다는 이론적인 용어로써 임계 영역에 여러 스레드가 경합하는 것을 방지합니다. Thread A는 임계 영역에 들어가기 전 lock을 점유합니다. 이후 Thread B가 Thread A가 접근한다면 임계 영역에 진입하지 못하고 기다려야 합니다. 이후 Thread A가 unlock을 수행하면 Thread B가 접근할 수 있습니다. 일상생활적으로 ..
-
MSA 환경에서 enum에 대한 위험성 줄여나가기Spring Framework 2024. 11. 16. 16:05
개요소프트웨어를 개발하다 보면 상수들의 집합을 관리하기 위해 enum을 활용하곤 합니다. ProductType을 enum으로 관리하게 된다면 여러 상품들을 enum으로 관리할 수 있습니다. 여러 서버에서 ProductType이라는 enum을 관리해야 한다면 어떤 일이 발생할 수 있을까요? 여러 서버에서의 불일치ProductType의 enum이 두 서버에서 관리된다면 혹은 백개의 서버에서 내부적으로 관리된다면 어떨까요? 새로운 Product가 추가되었을 때 관심사의 밖 혹은 추가하는것을 잊어서 여러 서버에서 차이가 발생하게 됩니다. 여러 서버에서의 불일치가 생기고, 신규 서버가 생성될때도 ProductType의 enum을 매번 추가해줘야 하는 불편함이 있을 것 같습니다. 공통 라이브러리로 관리하자만약 ..
-
Spring Bean 이름은 왜 소문자로 시작할까?Spring Framework 2024. 11. 3. 17:06
개요특정상황에서 Spring Bean의 이름으로 컨테이너에서 가져와서 활용하는 경우가 있었고 그 경우에 NoSuchBeanException이 발생하여 문제의 원인을 파악하고 알게 된 내용들을 정리해보고자 합니다. 스프링 컨테이너에 등록된 빈 이름은 어떻게 될까요?@Componentclass Z@Componentclass FooBar@Componentclass HTMLParser 대부분 일반적으로 앞자리가 소문자로 바뀌게 된다고 알고 있습니다.Z는 z로 FooBar는 fooBar로 HTMLParser는 hTMLParser로 바뀌게 될까요? @Componentclass BeanTest( private val applicationContext: ApplicationContext): ApplicationRunn..
-
분산시스템에서 로깅 트레이싱 전파는 어떻게 이루어질까?Spring Framework 2024. 10. 26. 20:30
대상 독자logback과 MDC를 활용하여 kafka, coroutine, async에도 트레이싱 전파를 어떻게 하는지 알고 싶으신 분들 개요 MSA 환경에서 Client가 하나의 호출을 수행했을 때 하나의 요청을 모아서 모니터링하고 싶으면 어떻게 해야 할까요? 아래 질문들에 대해 하나씩 답을 찾아가 보고자 합니다. 1. Server A에서 Spring MVC를 기반으로 여러 객체들이 협력하면서 비즈니스를 처리할텐데 어떻게 이어질 수 있을까? 2. Server A 에서 coroutine을 활용하면 어떻게 될까? 3. Server A 에서 @Async를 활용하면 어떻게 될까? 4. Server A가 kafka produce를 하고 Server B 가 consume을 수행하면 어떻게 될까? 5. Server..
-
하이버네이트 flush 순서에 주의하자JPA 2024. 10. 19. 20:20
대상독자하이버네이트 동작원리를 잘 모르고 사용했을 때 어떤 일이 발생할 수 있는지 궁금하신 분들 개요애플리케이션을 개발하던 중 하이버네이트의 동작원리를 잘 몰랐기 때문에 버그가 발생하게 되었습니다. 하이버네이트의 동작원리를 알아보면서 버그를 재현해보고 어떻게 해결할 수 있는지 정리해보고자 합니다. 하이버네이트란?하이버네이트(Hibernate)는 자바 애플리케이션과 관계형 데이터베이스 간의 상호작용을 간소화하기 위한 객체-관계 매핑(ORM) 도구입니다. 자바 클래스와 데이터베이스 테이블을 매핑하여, 자바 객체를 데이터베이스의 레코드로 변환하고 그 반대의 작업도 처리합니다. 이를 통해 개발자는 직접 SQL 코드를 작성할 필요 없이 데이터베이스와의 복잡한 상호작용을 처리할 수 있습니다. 하이버네이트를 ..