전체 글 131

deleteAllInBatch() vs deleteAll() 메서드의 차이

상품(product)과 주문(order), 그리고 이 두 테이블 간 연결 테이블인 orderProduct가 있다고 하자. `deleteAllInBatch()` 메서드로 리소스를 정리하는 것과 `deleteAll()` 메서드로 리소스를 정리하는 것의 차이를 알아보자. deleteAllInBatch()먼저 `deleteAllInBatch()` 메서드를 사용해 정리해볼 것이다.@AfterEachvoid tearDown() { orderProductRepository.deleteAllInBatch(); productRepository.deleteAllInBatch(); orderRepository.deleteAllInBatch();} 위 테스트코드 실행 시 발생하는 쿼리는 다음과 같다.Hiber..

더 나은 테스트를 작성하기 위한 구체적 조언 + 나의 생각

테스트 환경의 독립성을 보장하자아래와 같은 테스트 코드가 있다고 생각하자.@DisplayName("재고가 부족한 상품으로 주문을 생성하려는 경우 예외가 발생한다.")@Testvoid createOrderWithNoStock() { // given LocalDateTime registeredDateTime = LocalDateTime.now(); Product product1 = createProduct(BOTTLE, "001", 1000); Product product2 = createProduct(BAKERY, "002", 3000); Product product3 = createProduct(HANDMADE, "003", 5000); productRepository.s..

Test Doubles 정리

Test Double 이란?테스트 더블이란 실제 객체를 대신해서 테스팅에서 사용하는 모든 방법을 일컬어 호칭하는 것이다. Test DoubleDummy: 아무것도 하지 않는 깡통 객체Fake: 단순한 형태로 동일한 기능은 수행하나, 프로덕션에서 쓰기에는 부족한 객체 (ex. FakeRepository)Stub: 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체. 그 외에는 응답하지 않는다.Spy: Stub이면서 호출된 내용을 기록하여 보여줄 수 있는 객체. 일부는 실제 객체처럼 동작시키고 일부만 Stubbing 할 수 있다.Mock: 행위에 대한 기대를 명세하고, 그에 따라 도작하도록 만들어진 객체 Mocks Aren't StubsMock과 Stub은 다르다. Stub - 상태 검증(Stat..

Presentation Layer 테스트

용어 정리- `MockMvc`: 실제 서블릿 컨테이너 없이도 MVC 동작을 모의(mock)하여 테스트할 수 있도록 Spring에서 제공하는 테스트 프레임워크- `@WebMvcTest`: @SpringBootTest가 전체 빈을 모두 띄우는 테스트 어노테이션이었다면, @WebMvcTest는 컨트롤러 관련 빈들만 띄우는 가벼운 테스트 어노테이션- `@MockBean`: Spring 컨텍스트에서 빈을 모의(mock) 객체로 교체할 때 사용하는 어노테이션 @Mock vs @MockBean@Mock: 스프링 애플리케이션 컨텍스트를 로딩하지 않고도 사용 할 수 있기 때문에, 스프링 애플리케이션 컨텍스트를 사용하지 않는 순수 단위 테스트에서 모의 객체를 생성하는 데 적합 (서비스 테스트)@MockBean: 스프링 애..

@SpringBootTest vs @DataJpaTest

@SpringBootTest특징✅ 애플리케이션의 전체 컨텍스트를 로드하여 통합 테스트를 수행한다.✅ 모든 빈(Bean)을 초기화하므로 JPA뿐만 아니라 서비스, 컨트롤러, 기타 의존성까지 포함된다.✅ 내부적으로 @Transactional 어노테이션이 없어, 테스트 후 데이터를 정리하려면 tearDown() 메서드를 직접 정의해야 한다.장단점✅ 장점: 애플리케이션 전체를 테스트할 수 있어 통합 테스트에 적합하다.✅ 단점: 테스트가 무겁고, 실행 시간이 상대적으로 오래 걸릴 수 있다. @DataJpaTest특징✅ JPA 관련 컴포넌트(Repository, EntityManager 등)만 초기화하여 테스트한다.✅ @SpringBootTest보다 가볍고 빠르게 실행된다.✅ 내장 데이터베이스(H2 등)를 활용해 ..

Persistence Layer 테스트

Repository 테스트를 왜 해야할까?1. JPA 메서드가 작성자의 의도대로 쿼리를 생성하고 실행하는지 검증하기 위해개발자는 코드에 기반한 로직이 올바르게 작동한다고 믿을 수 있지만, 실제로 생성된 쿼리가 기대와 다를 수 있다! 2. 미래의 변경 사항에 대비하기 위해현재 JPA를 사용하더라도 향후 QueryDSL, MyBatis와 같은 다른 기술로 변경될 가능성이 있다. Repository 테스트를 잘 구성해 두면, 이러한 변경에도 안정적으로 동작을 검증할 수 있다. Repository 코드@Repositorypublic interface ProductRepository extends JpaRepository { /** * select * * from product * wh..

레이어드 아키텍처(Layered Architecture)와 테스트

레이어드 아키텍처사용자 요청이 왔을 때 레이어별로 요청을 처리하자! -> 관심사의 분리관심사를 분리함으로써 책임을 나누고 유지보수하기 용이하게 만들 수 있다. Presentation Layer, Business Layer, Persistence Layer 로 나누고, 이를 3-Tier라고 부르기도 한다.조금 더 자세히 나누고 싶다면 Persistence Layer 하위에 Infrastructure Layer를 두고 4-Tier로 나누기도 한다. Presentation Layer✅ 외부 세계의 요청을 가장 먼저 받는 계층✅ 파라미터에 대한 최소한의 검증을 수행한다. Business Layer✅ 비즈니스 로직을 구현하는 역할✅ Persistence Layer와의 상호작용(Data를 읽고 쓰는 행위)를 통해 ..

[싸피에서 뭐했니?] #2학기_자율프로젝트_회고

안녕하세요~!! 11기 최민주 기자입니다 👋 자율 프로젝트란?자율 프로젝트는 SSAFY에서의 마지막 프로젝트로, 1학기에 배운 기술적 지식과 2학기에 익힌 협업 방식을 모두 활용할 수 있는 기회입니다! 주제는 기업 연계, 오픈소스, 자유 주제로 구성되며, 저희 팀은 자유 주제를 선택해 기존의 특화 프로젝트를 기반으로 고도화를 진행했습니다. 어떤 프로젝트를 진행했나요?AI 기반의 작품 관리 플랫폼을 진행했습니다. 작가들이 작품을 효율적으로 관리하고, 창작 과정에서 발생하는 다양한 작업을 쉽게 처리할 수 있는 플랫폼으로, 주요 기능은 다음과 같습니다.원고 관리: 원고 작성, 설정 오류 검사, 맞춤법 검사, 글자 수 체크 등으로 글의 품질을 높일 수 있습니다.인물 관계도: 작품 내 등장인물 간의 관계를 시각..

#10. 2학기 공통 프로젝트 최우수팀 인터뷰

안녕하세요~!! 11기 최민주 기자입니다 👋오늘은 2학기 공통 프로젝트에서 최우수 프로젝트를 수상한 바로 그 주인공, '이호석'님과의 특별한 인터뷰를 준비했습니다!성공 비결부터 다양한 꿀팁까지! 지금부터 함께 만나볼까요? 🏆🎉 1. 간단한 자기소개 부탁드립니다. 안녕하세요! 이제 11기 수료를 앞두고 있는 이호석 입니다. 2. 어떤 프로젝트를 진행했나요? 저는 2학기 첫 프로젝트인 공통 프로젝트에서 크롬 확장프로그램을 활용한 하이라이트 기반 스크랩 및 공유 플랫폼 프로젝트를 했어요!제가 다시 보고 싶은 웹사이트의 글을 드래그하게 되면 확장 프로그램을 통해 저희 웹 서비스로 손쉽게 스크랩할 수 있어요.같은 본문에 대해서 다른 사람들은 어떤 내용을 스크랩 했는지, 또 저와 비슷한 관심사를 가지는 사람들..

[👀 Owing] OpenAI ChatGPT로 프롬프트 생성하기 (feat. 프롬프트 작성팁)

프로젝트를 하며 이미지 생성 로직을 구현해야 했는데, 기존 프롬프트로는 원하는 이미지를 얻는 데 한계가 있었다.생각해본 원인은 아래와 같다.1. 프롬프트가 한글로 작성됨2. `{name}`, `{description}` 변수에 단순히 작품 설명만을 넣어 다소 고정적인 형식으로 구성됨 이러한 한계를 해결하고 보다 정교한 이미지를 생성하기 위해 ChatGPT를 활용하여 프롬프트를 동적으로 생성하는 방식을 도입하기로 했다. public class PromptUtils { /** * UniverseFileRequestDto 를 기반으로 작품 세계관 일러스트레이션 이미지를 위한 프롬프트를 생성하는 메서드 * * @param imageGenerateRequest 작품 정보가 담긴 DTO * @return 생..