테스트 대역 용어
·
개발
테스트 코드를 작성하면서 InMemoryRepository, FakeRepository, RepositoryStub 를 별다른 기준 없이 네이밍을 작성했다.다른 개발자들과 의사소통을 위해서는 일반적으로 사용하는 네이밍 규칙을 따를 필요가 있다고 생각해 테스트 대역에 사용하는 용어들에 대해 정리Test Double우리말로 번역하면 테스트 대역이다. 여기서 대역은 대신 다른 역할을 하는걸 말한다.(잘 모를땐 주파수 대역을 떠올렸었다…)테스트에서 실제 객체를 대신하는 가짜 객체데이터베이스, 외부 API, 파일 시스템 등과 연결되어 있을 경우 테스트를 작성하기 어려워진다. 이 때 외부 의존성을 대신하는 객체를 만들어 테스트를 작성할 수 있다.외부 의존성 없이 순수하게 테스트Test Double을 사용하면:외부 ..
[JPA] 5개 데이터가 4+1개 쿼리로 나누어지다.
·
Spring Framework/JPA
Spring Data JPA의 saveAll()로 대량 데이터를 삽입할 때 예상과 다른 SQL이 실행되는 것을 발견누가 배치 쿼리를 어떻게, 왜 분할하는지 코드를 찾아본 과정예상 vs 실제 쿼리 실행5개의 프로젝트 데이터를 saveAll()로 저장했을 때:// 5개 엔티티를 한 번에 저장List projects = generateProjects(5);projectRepository.saveAll(projects);예상한 쿼리:# 예상했던 쿼리INSERT INTO project (title,id) VALUES ($1,$2),($3,$4),($5,$6),($7,$8),($9,$10);# 실제 실행된 쿼리# - 4개 + 1개로 분할됨INSERT INTO project (title,id) VALUES ($1,$..
[Spring Boot] 자동 설정(Auto Configuration)
·
Spring Framework/Spring
Spring Boot AutoConfiguration스프링 부트가 클래스패스, 환경, 설정 등을 분석해 필요한 Bean을 자동으로 구성개발자는 복잡한 환경설정 없이 바로 애플리케이션 개발에 집중할 수 있다.보편적으로 많이 사용하는 설정을 미리 제공spring-boot-starter-data-jpa 의존성을 추가하면 최소한의 DB 접속 정보만 입력하면 자동으로 DataSource, EntityManager, 트랜잭션 매니저 등이 설정된다.설정 실수를 줄이고 빠른 개발이 가능자동 설정의 동작 원리Spring Boot 프로젝트를 생성할 때 만들어진 클래스에서 볼 수 있는 @SpringBootApplication 애너테이션이 애너테이션에 포함된 @EnableAutoConfiguration@Target(Eleme..
[DB] 격리수준
·
DB
트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것이다. 트랜잭션의 격리 수준은 격리 수준이 높은 순서대로 SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED가 존재한다.격리 수준이 낮으면 의도했던 코드와 다르게 데이터가 변경될 수 있다. 격리 수준이 낮으면 변경으로 인한 부작용이 발생할 수 있고, 격리 수준이 높으면 시간당 처리할 수 있는 쿼리 수가 낮아지기 때문에 적절한 설정값을 고려해야 한다.발생할 수 있는 부작용 세 가지Dirty Read트랜잭션A에서 데이터 변경 후 커밋하기 전에 트랜잭션B에서 ..
동시성 이슈 해결하기
·
개발
문제 상황 : 동시에 여러 사용자가 쿠폰을 발급받을 때 발급 수량을 초과하면 안된다.목표 : 설정된 발급 수량만큼만 정확히 발급되도록 보장해야 한다.기술스택 : Spring Boot 3.x, Spring Data JPA, Postgresql16문제 상황쿠폰 발급 시나리오@Entity@NoArgsConstructor(access = AccessLevel.PROTECTED)@Getterclass Coupon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String name; @Column(nullable = false) p..
[Book] 만들면서 배우는 클린 아키텍처 - 2
·
Book
만들면서 배우는 클린 아키텍처의 8장을 읽고 내용을 작성했다. 아직 정리하면서 이해까지는 하지 못했는데, 나중에 프로젝트에 여러 매핑 전략을 사용하면 체득이 될 것 같다.매핑 전략서로 다른 계층(웹, 애플리케이션, 도메인, 영속성 등)간 데이터가 어떻게 변환되고 전달될지를 정의각 계층이 자신의 관심사에만 집중할 수 있게 하고, 한 계층의 변경이 다른 계층에 미치는 영향을 최소화 해야한다.적절한 매핑 전략을 선택함으로써 단일 책임 원칙을 지키고, 코드의 유지보수성과 확장성을 높일 수 있다.매핑하지 않기 전략웹 계층의 웹 컨트롤러가 SendMoneyUseCase 인터페이스를 호출해서 유스케이스를 실행이 인터페이스는 Account 객체를 인자로 가진다웹 계층, 애플리케이션 계층, 영속성 계층 모두 동일한 모델..
[Java] 표준 예외를 사용하자
·
Language/Java
Effective Java의 72번째 항목으로 Exception, RuntimeException, Throwable, Error를 직접 재사용하지 말자는 내용이다. 이 예외들은 다른 예외들을 포괄하는 클래스이므로 안정적으로 테스트할 수 없다. 예외 처리 코드가 실제로 잡아야 할 구체적인 예외가 아닌 다른 예외도 함께 잡을 수 있기 때문이다.class Calculator { public static int add(final String text) { if (!StringUtils.hasText(text)) { throw new RuntimeException("Input text cannot be null or empty"); } // do so..
[Book] 만들면서 배우는 클린 아키텍처 - 1
·
Book
톰 홈버그 저/박소은 역 | 위키북스 | 2021년 11월 26일144 페이지로 편히 읽기 좋은 책예전에 도서관에서 이 책을 빌렸는데 막상 읽으려니 눈에 안들어와서 미뤘다가 이번에 다시 빌려서 읽고 있다.목차를 보면 각 장마다 유지보수 가능한 소프트웨어를 만드는 데 어떻게 도우밍 될까?라는 절이 있다. 어떤 부분이 더 개선이 되었는가를 설명해줘서 맥락을 따라가는데 도움이 될 것 같다.1. 계층형 아키텍처의 문제는 무엇일까?개발을 하면서 가장 익숙하고 많이 사용하는 아키텍처가 계층형 아키텍처(Layered Architecture)같다. 특히 스프링으로 개발할 땐 @Controller, @Service, @Repository를 사용하면 자연스럽게 계층형 아키텍처를 만들게 되는 느낌이다.웹 계층의 요청을 받아..