전체 게시물 (200) 썸네일형 리스트형 [MySQL] SELECT FOR UPDATE란? 1. SELECT FOR UPDATESELECT * FROM Student WHERE id = 1 FOR UPDATE;SELECT FOR UPDATE를 실행하면 조회된 레코드에 대해 LOCK이 설정되어 해당 세션이 UPDATE 쿼리를 완료하고 COMMIT 또는 ROLLBACK 할 때까지 다른 세션에서 해당 레코드를 수정할 수 없다. 2. SELECT FOR UPDATE FlOW2-1. 테스트 환경도커를 사용하여 테스트 환경을 구성한다.MysQL 이미지 설치 : docker pull mysql:latestMySQL 컨테이너 실행 : docker run --name test-mysql-container -e MYSQL_ROOT_PASSWORD=1234 -d -p 3313:3306 mysql:latest My.. [Spring] 테스트 데이터 클렌징 시에 deleteAll(), deleteAllInBatch(), @Transactional 중에 무엇을 사용해야할까? 여러 개의 테스트를 동시에 실행하기 위해서는 각 테스트가 독립적으로 수행되어야 한다. 즉, 이전 테스트에서 수행한 내용이 다음 테스트에 영향을 미쳐서는 안 된다. 스프링을 사용한다면 @AfterEach 또는 @BeforeEach를 사용하여 각 테스트가 종료될 때마다 클렌징 처리가 가능하다. 이때, deleteAll(), deleteAllInBatch(), @Transactional 중에 하나를 사용하여 클렌징 처리가 가능하다. 셋 다 테스트에서 사용한 데이터를 지운다는 것은 동일하지만, 성능 상에 차이점이 존재한다. 각 방식의 차이점과 무엇을 사용해야 할지 알아보자. 1. 테스트 환경하나의 주문(Order)에는 여러 개의 상품이 포함될 수 있다.하나의 상품(Product)은 여러 개의 주문에 포함될 수.. [Spring] BDD 패턴의 테스트 코드 작성 시 Mockito의 어색함과 BDDMockito의 활용 Mockito와 BDDMockito 둘 다 Java 기반의 테스트 프레임워크로, 모킹(mocking)을 지원한다. 이 둘은 기능상에 차이점은 없으나, 모킹하는 스타일 방식이 차이가 있다.1. Mockito를 통해 Mock 객체 생성하는 방법@Mock 애너테이션을 통해 Mock 객체를 생성하고, @InjectMocks 애너테이션을 통해 Mock 객체를 주입할 수 있다. 예를 들어, MailService 객체를 생성하기 위해서 MailSendClient와 MailSendHistoryRepository가 필요하다. 이를 위해 @Mock 애너테이션을 사용하여 MailSendClient와 MailSendHistoryRepository 클래스의 Mock 객체를 생성하고, @InjectMocks 애너테이션을 통해 이.. [Spring] MockMvc 테스트에서 with(csrf()) 자동화 하기 1. 사건 발달스프링 시큐리티 환경에서 MVC를 테스트하기 위해서는 요청 헤더에 CSRF 토큰이 필요하다. 따라서 아래 코드와 같이 perform() 시에 요청 헤더에 스프링 시큐리티가 생성한 CSRF 토큰을 포함할 수 있다.근데 테스트 코드를 작성할 때마다 CSRF 토큰을 일일이 추가하는 것보단, 테스트 실행 전에 자동으로 추가할 수 있지 않을까? @WithMockUser@WebMvcTest(controllers = SectionController.class)class SectionControllerTest { @Test @DisplayName("신규 회고카드를 등록한다.") void createSection() throws Exception { //given .. [Spring] 스프링 시큐리티 환경에서 @WebMvcTest 사용 시에 발생하는 401, 403 에러 해결하기 우리 프로젝트는 Spring Security를 사용하여 사용자의 인증 정보와 권한 정보를 관리하고 있다. 따라서 사용자의 인증과 권한 정보에 따라서 API 요청이 서버로 도달하게 할 것인지 결정한다. @WebMvcTest 애너테이션을 사용하여 Spring MVC의 Presentation Layer 테스트가 가능하다. 즉, 스프링에서는 Controller에 대한 테스트를 하게 된다. 1. 테스트 환경1-1. Controller@CurrentUser 애너테이션을 사용하여, 요청 헤더에 담긴 Bearer 토큰을 통해 인증된 사용자 정보를 가져온다.@ResponseStatus(HttpStatus.CREATED)를 통해 응답 상태 코드로 201을 갖는다.@RestController@RequestMapping(".. [JPA] 읽기 전용 트랜잭션과 JPA 1차 캐시의 동작 원리 1. @Transactional트랜잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위이다. 스프링 프레임워크로 개발하는 경우 보통 Business Layer에 @Transactional을 사용한다. 기본적으로 @Transactional은 CRUD 시에 사용할 수 있다. 즉, Query와 Command를 구분하지 않고 사용할 수 있다.예를 들어, @Transactional을 사용하여 save() 메서드에서 생성된 member 객체를 데이터베이스에 저장할 수 있다. @Transactional을 사용하면 트랜잭션 AOP가 동작하면서 메서드 시작과 끝에 transactional.begin()과 transactional.commit()을 추가하기 때문이다. 단, 중간에 예외가 발생하면 transac.. 블로킹 큐(Blocking Queue) 블로킹 큐(Blocking Queue)는 동기화와 스레드 안전성을 보장하는 자료구조이다. 주로 멀티 스레드 환경에서 사용되며, 생산자-소비자 패턴과 같은 문제를 해결할 때 유용하다.블로킹 큐의 동작 방식블로킹 큐는 큐가 비어 있거나 가득 찼을 때, 큐에 데이터를 넣거나 빼려는 스레드가 일정 조건을 만족할 때까지 대기 상태(블로킹)에 들어간다. 이를 통해 스레드 간의 안전한 데이터 공유가 가능하다.삽입 시 대기큐가 가득 찬 경우, 데이터를 삽입하려는 스레드는 큐에 빈 공간이 생길 때까지 대기한다.다른 스레드가 큐에 데이터를 소비해서 자리가 생기면, 삽입하려는 스레드는 대기 상태에서 깨어나고 데이터를 큐에 넣을 수 있다.삭제 시 대기큐가 비어 있는 경우, 데이터를 꺼내려는 스레드는 큐에 새로운 데이터가 삽입.. 논 블로킹 I/O (비동기 방식) 동기 방식은 블로킹 I/O에서는 실행 상태에서 CPU 자원을 사용하던 프로세스가 입출력 작업이 발생하면 대기 상태로 이동한다. 대기 상태로 이동하면 사용하던 CPU 자원은 운영체제의 CPU 스케줄링에 의해 준비 상태에 있는 다른 프로세스에게 할당한다. 입출력 작업이 종료되면 대기 상태에서 준비 상태로 이동되어 CPU 스케줄링을 대기하게 된다. 비동기 방식인 논 블로킹 I/O에서는 실행 상태에 있는 프로세스가 입출력 작업이 발생하더라도 실행 상태를 유지하면서 CPU 자원을 사용한다. 이는 운영체제의 비동기 처리 메커니즘 덕분이다. 이 메커니즘은 CPU가 입출력 작업이 완료되기까지 기다리지 않고, 그 사이에 다른 작업을 할 수 있도록 하여 CPU 자원을 보다 효율적으로 사용할 수 있게 한다. 비동기 방식 메.. 이전 1 2 3 4 5 6 7 8 ··· 25 다음