전체 글121 회원가입 동시성 이슈 테스트 - DB Unique 활용하기 회원가입 동시성 이슈 테스트 절대 흔한 일은 아니지만 만약 동시에 두 명의 사용자가 같은 이메일로 회원가입을 하게 되면 어떻게 될까? 이에 대한 궁금증을 해결하기 위해 직접 테스트를 진행해보고자 한다. 회원가입 비즈니스 로직 Service 계층에 위치한 signUp 메서드는 말그대로 회원가입을 진행하는 비즈니스 로직을 담고 있다. 순서는 다음과 같다. validateMemberDto(_): 사용자가 입력한 정보에 대해 유효성을 검사한다. if (isDuplicatedMember(_)) { ... }: 만약 이미 가입한 이메일이 있으면 EmailDuplicationException 예외가 발생한다. signUpMemberDto.toEntity(): DTO -> Entity로 변환한다. setBcryptPa.. 2023. 10. 30. MySQL 아키텍처 MySQL 아키텍처 MySQL 서버는 사람의 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. 그리고 스토리지 엔진은 핸들러 API를 만족하면 누구든 스토리지 엔진을 구현해서 MySQL 서버에 추가해서 사용할 수 있다. 즉, MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다. MySQL 엔진 MySQL엔진은 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 또한 MySQL은 표준 SQL(ANSI SQL) 문법을 지원하기 때문에 표준 문법에 따라 작성된 쿼리는 타 DBMS와 호환되어 실행될 수 있다. MySQL 엔진은.. 2023. 10. 24. MySQL 서버 설정과 사용자 및 권한 MySQL 서버 설정 일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용하는데, 리눅스를 포함한 유닉스 계열에서는 my.cnf라는 이름을 사용하고, 윈도우 계열에서는 my.ini라는 이름을 사용한다. MySQL 8.0 서버의 시스템 변수는 대략 570개 수준이며, 사용하는 플러그인이나 컴포넌트에 따라 시스템 변수의 개수는 더 늘어날 수도 있다. 모든 시스템 변수를 공부해야 하는 것은 아니지만 MySQL 서버를 제대로 사용하려면 시스템 변수에 대한 이해가 상당히 많이 필요하다. 설정 파일 MySQL 서버는 시작될 때만 이 설정 파일을 참조하는데, 이 설정 파일의 경로가 고정되어 있는 것은 아니다. MySQL 서버는 지정된 여러 개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 my.cnf 파일을 사용.. 2023. 10. 21. 빈 후처리기(BeanPostProcessor) 빈 후처리기 스프링에서 빈 후처리기(BeanPostProcessor)는 컨테이너에 의해 생성된 빈 객체의 초기화 과정에서 커스텀 동작을 수행할 수 있도록 해주는 용도로 사용된다. 빈 후처리기는 스프링의 AOP(Aspect-Oriented Programming)와 관련된 작업, 빈 초기와나 소멸 시 추가 작업, 그리고 빈의 커스텀 로직 적용과 같은 다양한 작업을 수행할 때 유용하다. BeanPostProcessor 인터페이스 postProcessBeforeInitialization(Object bean, String beanName): 빈 객체가 초기화되기 전에 호출되는 메서드이다. 이 메서드를 통해 빈 객체를 수정하거나 빈 객체가 초기화되기 전 추가 작업을 수행할 수 있다. postProcessAfter.. 2023. 10. 17. 프록시 팩토리를 통한 AOP 프록시 팩토리 스프리에서 프록시 팩토리는 AOP(Aspect-Oriented Programming)의 핵심 개념 중 하나이다. AOP는 애플리케이션의 핵심 비즈니스 로직 외에도 보안, 로깅, 트랜잭션 관리 등과 같은 다양한 부가적인 관심사를 모듈화하고 분리하는데 사용되는 기술로 이를 통해 코드 중복을 줄이고 코드의 재사용성을 향상시킬 수 있다. 프록시 팩토리는 주로 AOP를 구현하기 위해 사용된다. 스프링은 빈(Bean)을 프록시 객체로 래핑하고, 프록시 객체를 통해 부가적인 관심사를 처리하는 방식으로 AOP를 제공한다. 따라서 클라이언트 코드에 영향을 주지 않으면서 부가적인 동작을 수행할 수 있다. 프록시가 나온 계기 런타임 환경에서 프록시 객체를 동적으로 생성하는 방법에 다음 두 가지 방법이 있다. .. 2023. 10. 16. Auto Configuration Auto Configuration Spring Boot의 Auto Configuration은 Spring Boot 애플리케이션을 개발할 때 기본적인 설정을 자동으로 제공하는 기능이다. 덕분에 개발자가 별도의 구성 파일을 작성하거나 빈을 설정하는 번거로움을 줄여준다. 스프링 부트는 수 많은 자동 구성을 제공하고 spring-boot-autoconfigure에 자동 구성을 모아두는데 아래 사이트를 이동하면 확인할 수 있다. Auto-configuration Classes 자동 구성 확인 @Slf4j @SpringBootTest class DbConfigTest { @Autowired DataSource dataSource; @Autowired TransactionManager transactionManage.. 2023. 10. 9. ThreadLocal을 사용하여 로깅하기 + MDCFilter ThreadLocal ThreadLocal은 Java에서 멀티스레드 환경에서 스레드 간에 데이터를 공유하지 않고 각 스레드마다 독립적으로 데이터를 보관하고 접근할 수 있게 해주는 클래스이다. 이는 하나의 스레드가 힙 메모리에서 참조하는 객체는 다른 여러 스레드에서도 참조할 수 있기 때문에 멀티스레드 환경에서 컨텍스트 스위칭이 일어남에 따라 데이터를 공유하여 발생하는 문제를 해결할 수 있다. ThreadLocal의 특징 스레드 간 데이터 분리: ThreadLocal을 사용하면 각 스레드에서 독립적으로 데이터를 관리할 수 있다. 즉, 한 스레드에서 설정한 데이터는 다른 스레드에 영향을 미치지 않는다. 초기화 및 접근: ThreadLocal 변수는 초기화될 때 기본값이나 초기값으로 설정된다. 각 스레드는 이 .. 2023. 10. 8. 스프링 예외 추상화 예외 추상화 스프링이 제공하는 예외 추상화를 이해하기 위해서는 먼저 자바 기본 예외에 대한 이해가 필요하다. 체크 예외와 언체크 예외 Object: 예외도 객체이다. 모든 객체의 최상위 부모는 Object이므로 예외의 최상위 부모도 Object이다. Throwable: 최상위 예외로 하위에 Exception과 Error가 있다. Error: 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다. 상위 예외를 catch로 잡으면 그 하위 예외까지 함께 잡는다. 따라서 애플리케이션 로직에서는 Throwable 예외로 잡으면 Error 예외도 함꼐 잡을 수 있기 때문에 Exception부터 예외를 잡아야 한다. 참고로.. 2023. 10. 7. 스프링 트랜잭션 트랜잭션 트랜잭션은 하나 이상의 작업을 논리적인 작업 단위로 묶은 것으로, 이 작업들은 모두 성공적으로 완료되거나 실패할 수 있다. 데이터베이스 관리 시스템(DBMS)에서 특히 중요하며, 데이터베이스에서 데이터를 안전하게 조작하고 관리하기 위해 사용된다. 트랜잭션 ACID 트랜잭션의 주요 특징은 다음과 같다. 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어, 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 .. 2023. 10. 5. 이전 1 2 3 4 5 6 7 8 ··· 14 다음