목록분류 전체보기 (83)
신비한 개발사전

아무런 문제 없던 코드를 리팩터링하는 도중에 갑자기 "For queries with named parameters you need to provide names for method parameters" 오류가 발생하기 시작했다.. 아래는 오류가 발생한 코드다. 해당 코드는 잘 동작함을 확인했었고 이후엔 수정한 적도 없는데, 다른 변동사항을 확인하기 위해 테스트를 돌려보니 동작하지 않는다. 어디가 잘못되었길래 없던 오류가 나타났을까?@Query(""" SELECT t FROM Theme t JOIN Reservation r ON r.details.theme = t WHERE r.details.date >= :from AND r.details.date findTopThe..
Spring 테스트를 작성하면서 @Sql 애노테이션을 통해 주입한 테스트용 데이터가 실제로 들어오지 않는 문제가 발생했다. 사용자 로그인 검증이 포함되는 엔드포인트를 테스트해야 해서 아래와 같이 로그인을 자동화하기 위해 @BeforeAll을 사용했는데, 테스트를 돌려보니 로그인이 실패하고 있었다.@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)@TestInstance(TestInstance.Lifecycle.PER_CLASS) // 혹시 몰라서 TestInstance 하나만 두도록 하고 BeforeAll에서 static을 뺌 (참고: BeforeAll은 원래 static 메서드로 구현해야 함)@Sql("/member-..

Spring 애플리케이션에서 클라이언트 요청을 처리하는 도중 예외가 발생하면 어떻게 될까? 아무런 조치를 취하지 않았다면 클라이언트에게는 Spring이 디폴트로 설정한 오류 응답이 전달된다. 클라이언트 코드에서 후속 처리를 해야 한다면, 위와 같은 에러는 정보가 부족해 큰 도움이 되진 않을 것이다. Spring은 예외 상황을 웹 환경에 알맞게 핸들링할 수 있는 몇가지 인터페이스를 제공한다. 그 중 @ControllerAdvice를 써서 에러를 핸들링하도록 구현했고, 다양한 상황에 맞춰 적절한 상태코드를 응답했다. 학습하는 데에 정신이 없었는지, 뷰를 테스트하면서 보니 에러 응답 본문에 문자열만 전달하는 경우도 있고, JSON으로 적절하게 응답하는 경우도 있었다. 게다가 ControllerAdvice로 미..

Spring 애플리케이션에서 값의 유효성에 대한 검증을 할 때, 자칫하면 여러 계층에 걸쳐서 같은 검증을 중복적으로 하게 될 수 있다. 뷰에서는 뷰 나름대로 클라이언트로부터 입력 받은 값을 검증하고, 비즈니스 계층에서는 또 비즈니스 요구사항에 맞는 검증을 하고.. Jakarta ValidationJakarta Validation은 도메인 모델 한 곳에서 이루어지는 유효성 검사 로직을 여러 계층에서 활용할 수 있도록 해주는 유효성 검사 프레임워크다. 애노테이션을 기반으로 검증을 수행하도록 지원한다. 도메인의 필드에 검증 애노테이션을 사용하고, 해당 도메인 객체를 사용하는 클래스에도 애노테이션만 추가하면 도메인 모델 필드에 달려 있는 검증 애노테이션이 동작한다. 이런 구조를 통해 각각의 계층에서는 별도의 검..
Spring은 컴포넌트 스캔(component scan)이라는 액션을 통해 생성해야 하는 bean을 찾아 등록한다. 컴포넌트 스캔은 @ComponentScan 애노테이션을 단 클래스가 수행한다. 기본적으로는 해당 클래스가 속한 패키지와, 그 모든 하위 패키지에 존재하는 bean 클래스(즉, @Component가 달린 클래스)를 탐색해 bean 객체로 생성한다. 필요하다면 @ComponentScan 애노테이션의 basePackages 속성에 스캔하고자 하는 패키지를 명시적으로 제한할 수 있다.@Configuration@ComponentScan(basePackages = "cholog.scan") // {}를 사용해 복수 표현 가능public class ContextConfiguration {} 처음 Spr..
Spring 프레임워크는 개발자를 대신해 직접 객체를 생성하고 주입하는 등의 관리 작업을 수행할 수 있다. 이렇게 Spring이 직접 관리하는 객체를 Spring bean이라고 하며, Spring bean의 생애주기와 의존성이 관리되는 곳을 IoC 컨테이너라고 한다. ApplicationContextIoC 컨테이너는 스프링 프레임워크 내에서도 bean 관리를 중점적으로 맡는 컴포넌트라고 생각할 수 있다. ApplicationContext는 IoC 컨테이너의 개념을 코드로 옮긴 것으로, Spring bean을 설정, 생성 및 조합하는 기능들을 정의하는 인터페이스다.The interface org.springframework.context.ApplicationContext represents the Spri..
Spring 애플리케이션 구현에 JdbcTemplate을 사용하는 도중 Spring의 의존성 주입이 제대로 이루어지지 않는 듯한 문제가 발생했다. 클래스의 필드에 @Autowired 애노테이션을 추가해 Spring이 주입해주기를 기대했지만, 해당 필드의 값이 null로 초기화된 것이다. 문제되는 코드:// DAO 클래스public class QueryingDAO { // Autowired를 사용했지만 JdbcTemplate 객체가 아닌 null로 초기화됨 @Autowired private JdbcTemplate jdbcTemplate;}// 컨트롤러 클래스@RestControllerpublic class ReservationController { @GetMapping publi..

H2는 자바로 작성된 오픈소스 RDBMS다. 인메모리(in-memory) 데이터베이스로, 시스템 메모리에 저장되기 때문에 애플리케이션과 동일한 생명주기를 가진다. 애플리케이션이 종료되면 H2에 저장된 데이터가 다 휘발되기 때문에, 로컬 개발 환경이나 테스트에 적합한 데이터베이스라고 볼 수 있다. H2 설치해보기H2는 설치 방법이 간단하다. Spring Boot 애플리케이션을 구현한다면 build.gradle 파일에 의존성을 추가해주만 해도 Spring이 DataSource로 H2를 주입한다.dependencies { runtimeOnly 'com.h2database:h2'} H2 콘솔H2 콘솔은 브라우저를 통해 메모리에 올라간 H2 데이터베이스에 접근할 수 있도록 해준다. 아래와 같이 applicati..