Programing/Spring Boot 24

단위 테스트와 통합 테스트, 언제 어떤 걸 써야 할까?

단위 테스트와 통합 테스트, 언제 어떤 걸 써야 할까?개발을 하다 보면 "테스트를 왜 해야 하지?", "어떤 테스트가 더 중요한가?" 같은 고민이 생긴다.이번에 직접 테스트를 작성하면서, 단위 테스트와 통합 테스트에 대해 정리해봤다.✅ 단위 테스트(Unit Test)란?실제 데이터 없이, 로직 자체의 흐름과 메서드 호출 여부를 검증하는 테스트주로 mock 객체를 사용하여 의존성 분리빠르고, 내부 구현이 바뀌면 바로 확인 가능💡 예를 들어특정 메서드가 호출되었는지if/else 조건 분기가 잘 작동하는지특정 입력에 대해 정확한 출력을 내는지✅ 통합 테스트(Integration Test)란?실제 데이터(DB 등)를 사용하여 기능이 전반적으로 잘 동작하는지를 검증사람이 수동으로 하던 QA를 자동화한 느낌예: ..

Spring Boot 다국어(i18n) 처리 및 MessageSource 활용

Spring Boot에서 다국어(i18n)를 적용하는 방법과 MessageSource를 이용하여 다국어 메시지를 가져오는 유틸 클래스를 정리해보겠습니다. 1. 다국어 메시지 처리 유틸 (MessageUtils)다국어 메시지를 코드 기반으로 가져올 수 있도록 도와주는 MessageUtils 클래스입니다.🔹 MessageUtils.javaimport lombok.RequiredArgsConstructor;import org.springframework.context.MessageSource;import org.springframework.context.i18n.LocaleContextHolder;import org.springframework.stereotype.Component;/** * 메시지 정보를 ..

안드로이드 notification 뱃지 제거하기, 카운트 수정하기

기기홈 noti는 푸시를 받았을때 뱃지 카운트를 달 수 있다. 이 뱃지 카운트를 수정하고 싶을때는 //수정하고 싶은 숫자를 넣고 호출 0은 안된다 noti를 제거해야함 private fun updateHomeBadgeCount(badgeCount:Int) { Intent("android.intent.action.BADGE_COUNT_UPDATE") .putExtra("badge_count", badgeCount) .putExtra("badge_count_package_name", packageName) .putExtra("badge_count_class_name", getLauncherClassName(this)) .run { sendBroadcast(this) } } private fun getLaun..

오류) Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

스프링 부트 프로젝트를 실행하는데 다음과 같은 에러가 나타났다. *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put i..

동시성 문제 해결 - 비관적 락 (Pessimistic Lock)

다음과 같이 영화관 자리를 예매하는 예제가 있다고 할 때 여러명이 동시에 빈 자리를 확인하고 예매를 할 경우 동시에 예매가 되어버리는 문제가 있습니다. import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service class MovieBookingService(private val seatRepository: SeatRepository) { /** * 1. 예매정보가 있는지 조회 * 2. 없다면 예매 */ @Transactional fun bookMovieSeat(hallNumber: String, seatNumber: String): Pair { val ..

코틀린 Querydsl Pageble Sort 동적 정렬 쉽게 사용하기 + 유틸화

코틀린에서 Querydsl을 이용하여 pageble객체를 받아 동적으로 정렬하기 위해서 유틸리티 하나를 생성한다. open class QuerydslUtils { fun JPAQuery.withPageable(pageable: Pageable, entityPath: Q): JPAQuery { val query = this.limit(pageable.pageSize.toLong()).offset(pageable.offset) for (o in pageable.sort) { val pathBuilder = PathBuilder(entityPath.type, entityPath.metadata) query.orderBy( OrderSpecifier( if (o.isAscending) Order.ASC else..

스프링부트 스케줄러가 여러번 실행된다면? @SchedulerLock 사용법

Spring Boot @SchedulerLock는 분산 잠금 기능을 제공하는 어노테이션입니다. 분산 시스템에서 여러 인스턴스가 동시에 실행되고 있는 경우, 특정 작업을 한 번에 한 인스턴스 만 실행하도록 보장합니다. 즉 서버가 여러곳에서 구동중일 때 스케줄락을 통해 스케줄러가 한번만 실행되도록 해주는 기능입니다. 사용법 build.gradle에 dependency 주입 //shedlock implementation("net.javacrumbs.shedlock:shedlock-spring:4.14.0") implementation("net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.14.0") Config클래스 생성 @Configuration class..

SpringBoot @RequestBody 데이터 선택적으로 받기

결론: @RequestBody(required = false) 를 사용하여 해결 @RequestBody 사용 예시 일반적으로 @RequestBody를 사용할 때는 해당 필드값이 필수적으로 필요하다는 것을 가정합니다. 하지만 때로는 필수적이지 않은 경우가 있습니다. @PostMapping("/example") public ResponseEntity example(@RequestBody ExampleDto exampleDto) { // ... } 위 코드에서 ExampleDto는 @RequestBody로 받을 객체입니다. 하지만 이 객체의 필드 중 일부는 선택적으로 필요한 경우가 있을 수 있습니다. @RequestBody(required = false)를 사용한 예시 이런 경우, @RequestBody(re..

코틀린 스프링부트 Querydsl 사용 예제

우선 Querydsl을 사용하기 위해서는 인터페이스를 만들고, 구현체를 만들고, Repository에 상속한다 1. Repository (SpringDataJpa, Querydsl 2개를 상속받았다) @Repository interface MemberRepository : JpaRepository, MemberRepositoryCustom { } 2. 인터페이스 interface MemberRepositoryCustom { fun search(condition: MemberSearchCondition): List fun searchPageSimle(condition: MemberSearchCondition, pageable: Pageable): Page fun searchPageComplex(condit..

Scanner 테스트코드 작성하기 System.setIn()

계산기 프로그램에서 Scanner를 통해 값을 입력받는 부분을 테스트코드로 작성해보자. package org.example; import java.util.Scanner; public class CalculationRequestReader { public String[] read() { Scanner scanner = new Scanner(System.in); System.out.println("Enter two number and an operator (e.g 1 + 2): "); String result = scanner.nextLine(); return result.split(" "); } } 테스트코드 작성 @Test public void System_in으로_데이터를_읽어들일_수_있다(){ Ca..