
Jacoco JaCoCo(Java Code Coverage)는 Java 언어를 대상으로 하는 코드 커버리지 도구이다. 이 도구는 소스코드의 얼마나 많은 부분이 실행되었는지 측정하여 코드 커버리지를 제공한다. 코드 커버리지는 테스트 스위트 또는 특정 테스트 케이스가 소스코드의 어느 정도를 실행했는지를 나타낸다. JaCoCo는 Java 애플리케이션의 클래스, 메서드, 라인 등의 다양한 수준에서 코드 커버리지를 측정할 수 있다. JaCoCo는 다음과 같은 주요 기능을 제공한다. 라인 커버리지(Line Coverage): 소스 코드의 각 라인이 얼마나 실행되었는지 측정 브랜치 커버리지(Branch Coverage): 조건 분기의 각 부분이 얼마나 실행되었는지 측정 메서드 커버리지(Method Coverage):..

로깅 로깅은 프로그램 동작 시 발생하는 모든 일(서비스 동작 상태 및 장애)을 기록하는 행위를 말한다. 이를 통해 개발, 테스트, 운영 등 다양한 환경에서 애플리케이션의 동작을 이해하고 모니터링하는 데 도움이 된다. 서비스 동작 상태: 시스템 로딩, HTTP 통신, 트랜잭션, DB 요청, 의도를 가진 Exception, ... 장애(exception, error): I/O Exception, NullPointerException, 의도하지 않은 Exception, ... 로깅은 언제할까? 정답이 없다. 프로젝트의 성격에 맞게 팀에 맞게 정의하면 된다. 그리고 로깅 시점은 때에 따라 다르다. 언제 기록할지를 정했다면 어떻게 기록할지도 중요한 부분이다. 우리가 아는 가장 로깅하기 쉬운 방법에는 System...

트랜잭션 이상 현상에 따른 정합성 문제 트랜잭션과 잠금 트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이 oneny.tistory.com 위 트랜잭션과 잠금에 대한 이론을 공부하고 프로젝트에 이 트랜잭션과 잠금을 어떻게 적용할 수 있을지 테스트해보려고 한다. 상품 구매 상황에서 발생 가능한 문제 두 명의 사용자가 동시에 하나의 상품을 구매했다고 가정해보면 다음과 같은 로직의 순서가 이루어진다. 구매하려는 상품 조회해서 재고가 있는지 확인 사용자의 주문 데이터 생성 구매하려는 상품 재고 차감 물론 결제 로직도 추가해야하지만 그것보다는 사용자가 상품 구매하는 상황에서 발생..

DTO Entity 어디서 변환해야 할까? 프로젝트를 진행하면서 DTO와 Enity를 어디서 변환하면 좋을지 생각했고, 이 주제는 개발에 있어 다들 많이 하는 고민 중 하나인 것 같다. 데이터베이스 Entity와 클라이언트 또는 API에서 사용하는 DTO(Data Transfer Object) 변환 과정은 데이터 구조 및 비즈니스 로직 차이를 해결하는 데 도움이 된다. 따라서 변환 과정은 개발에 중요한 요소 중 하나라고 생각한다. 그러면 먼저 DTO는 무엇이고, Entity가 무엇인지부터 간단히 살펴보자. Entity Entity는 데이터 모델링에서 레코드 또는 데이터베이스 테이블에서 식별 가능한 하나의 항목을 나타내는 개념이다. Entity는 특정 도메인에서 중요한 정보 단위를 나타내며 데이터베이스에서..

회원가입 동시성 이슈 테스트 절대 흔한 일은 아니지만 만약 동시에 두 명의 사용자가 같은 이메일로 회원가입을 하게 되면 어떻게 될까? 이에 대한 궁금증을 해결하기 위해 직접 테스트를 진행해보고자 한다. 회원가입 비즈니스 로직 Service 계층에 위치한 signUp 메서드는 말그대로 회원가입을 진행하는 비즈니스 로직을 담고 있다. 순서는 다음과 같다. validateMemberDto(_): 사용자가 입력한 정보에 대해 유효성을 검사한다. if (isDuplicatedMember(_)) { ... }: 만약 이미 가입한 이메일이 있으면 EmailDuplicationException 예외가 발생한다. signUpMemberDto.toEntity(): DTO -> Entity로 변환한다. setBcryptPa..

빈 후처리기 스프링에서 빈 후처리기(BeanPostProcessor)는 컨테이너에 의해 생성된 빈 객체의 초기화 과정에서 커스텀 동작을 수행할 수 있도록 해주는 용도로 사용된다. 빈 후처리기는 스프링의 AOP(Aspect-Oriented Programming)와 관련된 작업, 빈 초기와나 소멸 시 추가 작업, 그리고 빈의 커스텀 로직 적용과 같은 다양한 작업을 수행할 때 유용하다. BeanPostProcessor 인터페이스 postProcessBeforeInitialization(Object bean, String beanName): 빈 객체가 초기화되기 전에 호출되는 메서드이다. 이 메서드를 통해 빈 객체를 수정하거나 빈 객체가 초기화되기 전 추가 작업을 수행할 수 있다. postProcessAfter..

프록시 팩토리 스프리에서 프록시 팩토리는 AOP(Aspect-Oriented Programming)의 핵심 개념 중 하나이다. AOP는 애플리케이션의 핵심 비즈니스 로직 외에도 보안, 로깅, 트랜잭션 관리 등과 같은 다양한 부가적인 관심사를 모듈화하고 분리하는데 사용되는 기술로 이를 통해 코드 중복을 줄이고 코드의 재사용성을 향상시킬 수 있다. 프록시 팩토리는 주로 AOP를 구현하기 위해 사용된다. 스프링은 빈(Bean)을 프록시 객체로 래핑하고, 프록시 객체를 통해 부가적인 관심사를 처리하는 방식으로 AOP를 제공한다. 따라서 클라이언트 코드에 영향을 주지 않으면서 부가적인 동작을 수행할 수 있다. 프록시가 나온 계기 런타임 환경에서 프록시 객체를 동적으로 생성하는 방법에 다음 두 가지 방법이 있다. ..

Auto Configuration Spring Boot의 Auto Configuration은 Spring Boot 애플리케이션을 개발할 때 기본적인 설정을 자동으로 제공하는 기능이다. 덕분에 개발자가 별도의 구성 파일을 작성하거나 빈을 설정하는 번거로움을 줄여준다. 스프링 부트는 수 많은 자동 구성을 제공하고 spring-boot-autoconfigure에 자동 구성을 모아두는데 아래 사이트를 이동하면 확인할 수 있다. Auto-configuration Classes 자동 구성 확인 @Slf4j @SpringBootTest class DbConfigTest { @Autowired DataSource dataSource; @Autowired TransactionManager transactionManage..

ThreadLocal ThreadLocal은 Java에서 멀티스레드 환경에서 스레드 간에 데이터를 공유하지 않고 각 스레드마다 독립적으로 데이터를 보관하고 접근할 수 있게 해주는 클래스이다. 이는 하나의 스레드가 힙 메모리에서 참조하는 객체는 다른 여러 스레드에서도 참조할 수 있기 때문에 멀티스레드 환경에서 컨텍스트 스위칭이 일어남에 따라 데이터를 공유하여 발생하는 문제를 해결할 수 있다. ThreadLocal의 특징 스레드 간 데이터 분리: ThreadLocal을 사용하면 각 스레드에서 독립적으로 데이터를 관리할 수 있다. 즉, 한 스레드에서 설정한 데이터는 다른 스레드에 영향을 미치지 않는다. 초기화 및 접근: ThreadLocal 변수는 초기화될 때 기본값이나 초기값으로 설정된다. 각 스레드는 이 ..
- Total
- Today
- Yesterday
- 넥스트스탭
- Java
- postgresql
- NeXTSTEP
- nginx configuration
- 트랜잭션
- mdcfilter
- annotation
- 카프카
- nginx
- TDD
- spring session
- sql
- jvm 메모리 구조
- mysql
- spring webflux
- pessimistic lock
- 낙관적 락
- redis session
- 람다
- Kafka
- EKS
- socket
- 구름톤챌린지
- 분산 락
- Redisson
- transaction
- 비관적 락
- 구름톤 챌린지
- Synchronized
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |