본문 바로가기

분류 전체보기45

프로세스와 스레드(운영체제 기본) 1. 프로세스와 스레드프로세스프로세스란 프로그램의 데이터가 메모리에 올라와 CPU 에 할당되어 실행되는 상태를 말한다.프로세스는 운영체제로 부터 자원을 할당 받는 단위이고, 프로세스는 독립적으로 메모리를 할당받는다.프로세스의 메모리 구성stack: 지역변수, 매개변수 등이 저장되는 공간으로 동적할당된다.=== 아래 영역은 스레드에 의해 공유 ===heap: 객체를 저장하는 공간으로 동적할당된다.data: static 변수와 같은 전역적인 데이터를 저장하는 공간code: .class 파일과 같은 실행될 코드를 저장하는 공간컨텍스트 스위칭을 하려면 프로세스의 실행정보를 전환해야해서 비용이 크다.스레드스레드란 프로세스가 할당 받은 자원을 바탕으로 실행의 단위가 된다.운영체제의 스케줄러에 의해 CPU 를 할당받.. 2024. 7. 29.
JPA 1차캐시의 동작 방식 만약 같은 테이블을 다른 entity 로 논리적으로 분리하게 되면 1차 캐시가 동작할까? 라는 질문으로부터 1차캐시가 어떻게 동작하는지 궁금해졌다.실제 1차 캐시가 동작하는 방식은 더 복잡하고, 연관관계가 있는 경우에는 또 다르게 동작한다. 그렇기에 해당 포스트에서는 연관관계가 없는 단일 테이블 조회에서 1차 캐시가 어떻게 동작하는지 살펴보고자 한다.1차 캐시란 무엇인가?우선 1차 캐시가 정확히 무엇인가? 라는 질문을 해야한다.JPA 에서 1차 캐시는 영속성 컨텍스트(Persistence Context) 를 의미한다.어플리케이션은 엔티티를 엔티티 매니저 를 통해 다루게 된다.즉, 엔티티 매니저를 통해 entity 의 상태 (managed, detached, removed 등) 을 관리하게 된다. 그리고 .. 2024. 7. 28.
스프링부트 테스트(3) - context caching context caching 이란?테스트 시 구성되는 ApplicationContext 는 아래의 구성정보를 바탕으로 캐시 키를 발급한다.해당 캐시 키를 바탕으로 application context 를 구성하거나 재사용하게 되어서, 테스트시 이러한 구성정보가 다르다면 새로운 컨텍스트가 생성된다.locations (from @ContextConfiguration)classes (from @ContextConfiguration)contextInitializerClasses (from @ContextConfiguration)contextCustomizers (from ContextCustomizerFactory) – this includes @DynamicPropertySource methods as well.. 2024. 7. 23.
스프링부트 테스트(2) - configuration 과 property 1. 무엇으로 configuration 을 구성할까?참고로 조금 더 자세한 추가적인 내용은 공식문서에 있습니다.1편에서 소개한 TestContextBootstrapper 구현체 SpringBootTestContextBootstrapper 는 기본적으로 별다른 조건이 없다면 @SpringBootConfiguration 어노테이션이 붙은 클래스를 찾아서 context 를 구성한다.즉 @SpringBootApplication 어노테이션 내에 @SpringBootConfiguration 어노테이션을 포함하기 때문에 별다른 조건이 없는 경우 전체 컨테이너 환경이 구성되는 것이다.// @SpringBootApplication 어노테이션@Target(ElementType.TYPE)@Retention(Retention.. 2024. 7. 23.
스프링부트 테스트(1) - 동작원리와 어노테이션 친해지기 동작 원리TestContext 를 bootstrap 하는 원리테스트 컨텍스트란, 테스트시 application context 를 말하며 애플리케이션의 구성 정보를 구성하는 것을 말한다. 예를들어,애플리케이션의 Bean 을 로드하는 것도 이에 포함된다고 할 수 있다.그렇다면, 이 테스트 컨텍스트는 어떻게 로드 될까? 이를 알기 위해서 @SpringBootTest 어노테이션을 확인해보자.@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited// TestContextBootstrapper 구현체 : SpringBootTestContextBootstrapper@BootstrapWith(SpringBootTestContex.. 2024. 7. 23.
AOP 활용 (feat. jpa 호출 로깅) AOP 에 대한 기본적인 개념을 이전 포스팅에서 알아보았다.https://pius712.tistory.com/33 스프링 AOP - 톺아보기aop 는 횡단 관심사를 분리하여 모듈화 한 것을 말한다.횡단 관심사란 비즈니스 로직이 아닌 그 외의 로깅, 트랜잭션과 같은 것들을 말한다.스프링을 사용하면 자주 만나게되는 @Transactional 이나 @pius712.tistory.com 이 AOP 를 활용하여, JPA repository 메서드 호출에 대한 로깅을 간단하게 구현하고자 한다.요구사항jpa repository 모든 메서드에 대해 로그를 남겨야함어떤 메서드가 호출했는지, 어떤 메서드가 호출되었는지 로그를 남겨야함jpa repository 의 time elapsed 로그를 남겨야함예외 발생시 messa.. 2024. 6. 6.
스프링 AOP - 톺아보기 aop 는 횡단 관심사를 분리하여 모듈화 한 것을 말한다.횡단 관심사란 비즈니스 로직이 아닌 그 외의 로깅, 트랜잭션과 같은 것들을 말한다.스프링을 사용하면 자주 만나게되는 @Transactional 이나 @Cacheable 과 같은 어노테이션들이 이런 스프링 AOP 를 통해 구현된 것이라고 볼 수 있다.이 스프링 AOP의 기반이 되는 proxy 와 bean post processor 에 대해 알아보고, 스프링 AOP 에 대해 알아보고자 한다.Spring-Aop 의 기반Proxy프록시는 디자인 패턴의 일종이다.아래와 같이 client 가 target 객체를 호출할 때, target 을 객체로 감싸서 중간에서 다른 작업을 하게 된다.간단하게 코드를 살펴보면 아래와 같다.// 인터페이스 기반class Foo.. 2024. 6. 6.
MySQL(InnoDB)이 잠금할 레코드를 고르는 방법 MySQL 을 처음 공부할 때, 레코드 잠금에 관해서 여러가지 궁금한 점들이 많았다. 그동안 궁금했던 세부적인 부분들에 대해서 정리해보고자 한다.MySQL 은 기본적으로 잠금 읽기(locking read), update, delete 문에 대해서 잠금을 걸 때, 스캔되는 모든 인덱스에 잠금을 건. WHERE 조건에 특정 행(row)를 제외할 수 있다고 하더라도, 이와 관계 없이 스캔되는 모든 인덱스에 잠금을 걸게 된다.Q. WHERE 절을 기반으로 스캔되는데, 왜 WHERE 절과 관계 없이 레코드 잠금이 걸린다고 할까?참고로, 이 내용은 REPEATABLE READ 에 해당하는 내용으로, READ COMMITTED 에서는 다르게 동작한다. WHERE 절을 기반으로 레코드를 조회하는 것은 맞다.하지만, M.. 2024. 6. 5.
카프카 톺아보기4-1 프로듀서 개념 카프카 프로듀서란 카프카 클러스터로 이벤트를 발행하는 클라이언트 어플리케이션을 의미한다.DDD 관점에서 보면, 서로 다른 바운디드 컨텍스트(일반적으로 서버가 분리되어 있음)에 속한 애그리거트의 상태 변경에 대한 도메인 이벤트를 시스템간의 이벤트로 변환하여 발행할 때 카프카 프로듀서를 통해 이벤트를 발행하곤 한다.예를들어, 주문이 취소되는 경우 주문이라는 애그리거트 (도메인의 제약사항을 공유하는 객체 묶음) 상태가 변경된 것을 이벤트로 발행하게 되는데, MSA 에서 다른 컨텍스트 예를 들어, 재고 시스템과 같은 컨텍스트가 이에 대한 처리가 필요한 경우 해당 이벤트를 받아서 로직을 처리하게 된다.기본적으로 카프카 프로듀서는 컨슈머에 비해 그렇게 복잡하지 않다.파티셔너파티셔너는 프로듀서가 메시지를 발행할 때 .. 2024. 5. 30.