본문 바로가기

Development/Diary

(11)
[Diary] Spring 비관적 락(Pessimistic Lock)과 Transaction Isolation level의 조합으로 발생할 수 있는 현상(+Snapshot Isolation) 이 글에서는 비관적 락을 사용하였음에도 멀티 스레드 환경에서 원하는 결괏값이 나오지 않아 발생한 문제 상황에 대해 작성하고자 합니다.문제 상황: 한 스레드가 새로운 레코드를 Insert 하고 다른 스레드가 findAll() 했을 때 새로운 레코드를 읽지 않는다?문제 재현UserTest@Entity@Getter@Setterpublic class UserTest { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false) private String username;}UserTestRepository@Repositorypublic interface UserTestRepos..
[Diary] Spring 테스트 관리 트랜잭션(Test-managed transactions)과 테스트 생명주기 + 멀티 스레드에서 테스트 문제 Spring에서 테스트 관리 트랜잭션(Test-managed transactions)은 통합 테스트(integration test) 중에 트랜잭션이 자동으로 관리되고, 테스트 메서드가 종료되면 자동으로 롤백되는 트랜잭션입니다. 이러한 트랜잭션은 Spring에서 관리되는 트랜잭션(테스트를 위해 로드된 ApplicationContext 내에서 직접적으로 Spring에 의해 관리되는 트랜잭션)이나 애플리케이션에서 관리되는 트랜잭션(테스트에서 호출되는 애플리케이션 코드 내에서 프로그래밍 방식으로 관리되는 트랜잭션)과는 다릅니다. 메서드 수준의 생명주기 메서드(예: JUnit Jupiter의 @BeforeEach 또는 @AfterEach로 주석이 달린 메서드)는 테스트 관리 트랜잭션 내에서 실행됩니다. 반면 클래..
[개발 일기] Hibernate의 UUID 변환과 PostgreSQL, H2 DB에 저장할 때 동작 + Foreign Key Constraint 개요프로젝트 테스트 환경이 PostgreSQL의 서버를 필수적으로 켜져있어야 테스트가 가능했다.Springboot는 h2 db를 내장하고 있어 PostgreSQL의 의존성을 없애기 위해 새로운 테스트 환경을 만들고 있었다. 문제는 데이터 타입을 UUID로 사용하고 있는 필드에 대해서 아래와 같은 에러가 발생했다.Caused by: org.h2.message.DbException: Data conversion error converting "UUID requires 16 bytes, got 255" [22018-214] at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.jav..
[개발 일기] java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter String token = Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(new Date(now.getTime() + tokenValidMillisecond)) .signWith(SignatureAlgorithm.HS256, secretKey) // 암호화 알고리즘, secret 값 세팅 .compact(); 이 코드의 signWith() 에서 아래 에러가 발생했다. java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 해결 방법 아래 의존성 추가하기 Maven은 javax.xml.bind jaxb-api 2.3.1 Gradle은 implementation 'java..
[개발 일기] 이게 왜 null이 아니야 (영속성 컨텍스트에서 같은 Entity를 참조!) 테스트 코드 공부 중에 의아한 점.Product givenProduct = Product.builder() .name("note") .price(1000) .stock(500) .build(); System.out.println("before save = " + givenProduct.getNumber()); // when Product savedProduct = productRepository.save(givenProduct); // then System.out.println("after save = " + givenProduct.ge..
[개발 일기] Primary key 타입은 숫자랑 GUID(UUID)중에 어떤 걸 쓸까요? 설문조사 엔티티의 ID 타입은 숫자 Or GUID(UUID)? 졸업 프로젝트 진행중에 나왔던 대화 주제입니다.설문조사 게시글의 Id 타입을 무엇으로 할지... 사실 그 당시에는 GUID 타입에 대해서도 처음 접해봐서 잘 몰랐는데 지금 다시 떠올라서 GUID에 견해에 대해 써보려합니다. GUID(UUID)? GUID는 'Globally Unique Identifier'의 약자로, '전역적으로 고유한 식별자'라는 뜻입니다. GUID는 128비트의 크기를 가지며, 이는 전 세계 어디에서든 고유하게 생성될 수 있는 값을 의미합니다. GUID는 주로 여러 데이터베이스나 서버 간에 데이터를 고유하게 식별하거나 병합할 필요가 있을 때 사용됩니다. 예를 들어, 여러 서버에 분산되어 있는 데이터베이스에서 각 레코드를 고..
[개발 일기] OSIV가 false일 때 LazyInitializationExceptions 이거 때매 거의 이틀을 삽질했다.... 이해가 안되어서.... OSIV=false + getReferenceId - @Transactional = LazyInitializationExceptions 문제의 코드 @Override public Product selectProduct(Long number) { Product selectedProduct = productRepository.getReferenceById(number); return selectedProduct; }다음과 같이 getReferenceById()를 사용한 객체를 리턴하고, @Override public ProductResponseDto getProduct(Long number) { Product product = productDAO..
[개발 일기]JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. (OSIV Anti Pattern) 스프링을 다시 공부하려고 새 프로젝트를 만들어서 바로 실행만 했더니, 이런 경고가 발생했습니다. WARN 6264 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 뤼튼(GPT 4)에게 물어봤는데 답변은 이러했습니다. 이 경고 메시지는 Spring Boot에서 'spring.jpa.open-in-view' 설정이 기본적으로 활성화되어..