전체 글
-
Spring Core - 쓰레드 로컬 동기화(적용, 주의사항)FrameWork/Spring&Spring-boot 2024. 3. 6. 09:12
쓰레드 로컬 동기화(적용) package com.spring.core; import com.spring.core.logTrace.LogTrace; import com.spring.core.logTrace.ThreadLocalLogTrace; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class Configration { @Bean public LogTrace logTrace(){ // return new FieldLogTrace(); return new ThreadLocalLogTrace(); } } 동시성 ..
-
Spring Core - 쓰레드 로컬(동시성문제2)FrameWork/Spring&Spring-boot 2024. 3. 5. 13:58
동시성 문제 - 예제 코드 동시성 문제가 어떻게 발생하는지 단순화해서 알아보자 테스트에서도 lombok을 사용하기 위해 다음 코드를 추가하자 build.gradle dependencies{ ... //테스트에서 lombok 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor'org.projectlombok:lombok:' } 이렇게 해야 테스트 코드에서 @Slfj4 같은 어노테이션이 작동한다. FieldService @Slf4j public class FieldService { private String nameStore; public String logic(String name){ // 1. 파라미터 name값, nameStore..
-
Spring Core - 쓰레드 로컬(필드 동기화, 동시성 문제1)FrameWork/Spring&Spring-boot 2024. 3. 4. 14:47
쓰레드 로컬 - 필드 동기화 앞서 로그 추적기를 만들면서 다음 로그를 출력할 때 트랜잭션ID와 level을 동기화 하는 문제가 있었다. 이 문제를 해결하기 위해 TraceId를 파라미터로 넘기도록 구현했다. 이렇게 해서 동기화는 성공했지만, 로그를 출력하는 모든 메서드에 TraceId 파라미터를 추가해야 하는 문제가 발생했다. TraceId를 파라미터로 넘기지 않고 이 문제를 해결할 수 있는 방법은 없을까? 이런 문제를 해결할 목적으로 새로운 로그 추적기를 만들어보자. 향후 다양한 구현체로 변경할 수 있도록 LogTrace 인터페이스를 먼저 만들고, 구현해보자. LogTrace 인터페이스 public interface LogTrace { TraceStatus begin(String message); vo..
-
Spring Core - 로그 추적기(V2 파라미터로 동기화 개발)FrameWork/Spring&Spring-boot 2024. 3. 4. 12:52
V2 파라미터로 동기화 개발 트랜잭션ID와 메서드 호출의 깊이를 표현하는 가장 단순한 방법은 첫 로그에서 사용한 트랜잭션ID와 level을 다음 로그에 넘겨주면 된다. 현재 로그의 상태 정보인 트랜잭션ID와 level은 TraceId에 포함되어 있다. 따라서 TraceId를 다음 로그로 넘겨주면 된다. 이기능을 추가한 HelloTraceV2를 개발해보자. HelloTraceV2 @Slf4j @Component public class HelloTraceV2 { private static final String START_PREFIX = "-->"; private static final String COMPLETE_PREFIX = "
-
Spring Core - 로그 추적기(프로토타입, V1)FrameWork/Spring&Spring-boot 2024. 3. 4. 11:16
로그 추적기 요구사항 모든 PUBLIC 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안된다. (로그를 남긴다고 해서 비지니스 로직의 동작에 영향을 주면 안된다.) 메서드 호출에 걸린 시간 정상 흐름과 예외 흐름 구분 예외 발생시 예외 정보가 남아야 한다. 메서드 호출의 깊이 표현 HTTP 요청을 구분 HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확하게 구분이 가능해야한다. 트랜잭션 ID(DB 트랜잭션 X), 이때 의 트랜잭션으 HTTP요청이 시작해서 끝날 때 까지를 하나의 트랜잭션이라고 한다. 프로토타입 개발 애플리케이션의 모든 로직에 직접 로그를 남겨도 되지만, 그것보다는 더 효율적인 개발 방법이 필요하다. 특히 트랜잭션ID와 깊이를 표현하..
-
ORM - 영속성 관리(플러시, 준영속)FrameWork/ORM 2024. 2. 29. 14:38
플러시 플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 구체적으로 다음과 같은 일이 일어난다. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어 쓰기지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.(등록,수정,삭제,쿼리) 영속성 컨텍스트를 플러시하는 방법은 3가지 em.flush()를 직접 호출한다. 트랜잭션 커밋 시 플러시가 자동 호출된다. JPQL쿼리 실행 시 플러시가 자동 호출된다. ▼직접호출 엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시한다. 테스트나 다른 프레임워크와 JPA를 함께..
-
ORM - 영속성 관리(엔티티 등록,수정,삭제)FrameWork/ORM 2024. 2. 29. 10:58
엔티티 등록,수정,삭제 엔티티 등록 엔티티 매니저를 사용해서 엔티티를 영속성 컨텍스트에 등로해보자. @Transactional public void enrollEntity(EntityManager em){ Member memberA= new Member(); memberA.setId("member1"); memberA.setUsername("test1"); memberA.setAge(20); Member memberB= new Member(); memberB.setId("member2"); memberB.setUsername("test1"); memberB.setAge(30); em.persist(memberA); em.persist(memberB); //여기까지 INSERT SQL을 데이터베이스에 보내..
-
ORM - 영속성관리(엔티티 매니저 팩토리와 엔티티 매니저)FrameWork/ORM 2024. 2. 28. 14:55
엔티티 매니저 팩토리와 엔티티 매니저 JPA가 제공하는 기능을 크게 엔티티와 테이블을 매핑하는 설계 부분과 매핑한 엔티티를 실제 사용하는 부분으로 나눌 수 있다. 매핑한 엔티티를 엔티티 매니저(EntityMnager)를 통해 어떻게 사용하는지 알아보자 엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. 이름 그대로엔티티를 관리하는 관리자다. 개발자 입장에서는 엔티티 매니저를 엔티티를 저장하는가상의 데이터베이스로생각하면 된다. 데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다. 엔티티 매니저 팩토리는 이름 그대로 에티티 매니저를 만드는 공장인데, 공장을 만드는 비용은 상당히 크다. 따라서 한..