전체 글 107

[DB / Error] @DataJpaTest 사용 시 org.springframework.beans.factory.UnsatisfiedDependencyException 에러

SpringBoot + Jpa + In-memory h2 환경에서 간단한 레포지토리 테스트를 수행하던 중 Bean 의존성 문제가 발생했다.에러더보기org.springframework.beans.factory.UnsatisfiedDependencyException:Error creating bean with name 'QueryDslEventRepositoryTest':Unsatisfied dependency expressed through field 'jf':No qualifying bean of type 'cohttp://m.querydsl.jpa.impl.JPAQueryFactory' available:expected at least 1 bean which qualifies as autowire ca..

데이터베이스 2024.11.26

[DB / 테스트] @DataJpaTest

@DataJpaTest는 JPA, 데이터베이스 관련 설정만 최소한으로 로드하여 레포지토리/엔티티를 테스트하는 어노테이션이다.  임베디드 데이터베이스를 자동 구성해주기 때문에 외부 데이터베이스를 사용하지 않아도 된다.Application Context에 JPA, 데이터베이스 관련 클래스들을 자동으로 로드해준다.테스트가 끝날 때마다 데이터베이스 상태가 자동으로 rollback된다. 위 내용에 대해 더 자세히 알아보자!1. 기본적으로 In-memory Embedded Database H2를 사용@DataJpaTest는 테스트 실행 시 In-memory Embedded Database H2를 기본적으로 사용한다. 임베디드 데이터베이스는 애플리케이션 외부의 데이터베이스(MySQL 등) 없이 테스트 실행 중 메모리..

데이터베이스 2024.11.26

[DB / H2] spring.jpa.properties.hibernate.globally_quoted_identifiers=true 설정

설명Spring Boot에서 embadded database(h2 등)을 쓸 때 ddl-auto를 사용하면 hibernate가 자동으로 쿼리를 만들어준다. 이때 설정으로 spring.jpa.properties.hibernate.globally_quoted_identifiers=true를 켜두면 hibernate가 ddl, dml을 생성할 때 테이블명/컬럼명을 백틱(`) 또는 쌍따옴표(")로 감싸서 생성한다. (dbms에 따라 사용되는 기호는 다름) ddl은 ddl-auto 옵션(update, create 등)에 따라 애플리케이션이 처음 실행될 때 한 번만 실행된다. hibernate가 스키마를 생성하거나 수정할 때 사용되는 명령어이다. dml은 entity mananger의 영속성 컨텍스트에서 엔티티의 ..

데이터베이스 2024.11.26

[DB / Error] Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a

Spring Boot + JPA + In-memory h2 환경에서 레포지토리 테스트 중 다음과 같은 에러 발생에러더보기더보기Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "\000d\000a    create table [*]user (\000d\000a        user_id bigint not null auto_increment,\000d\000a        birth date,\000d\000a        created_date datetime(6),\000d\000a        email varchar(255),\000d\000a        gender enum ('M','W'),\00..

데이터베이스 2024.11.25

[DB] Error / engine[*]=InnoDB"; expected "identifier";]

Spring Boot 환경에서 In-memory h2를 사용하던 중 에러가 발생했다.에러더보기    create table `bookmark` (         `bookmark_id` integer not null auto_increment,         `created_date` varchar(255) not null,         `last_modified_date` varchar(255) not null,         `name` varchar(255),         `user_id` bigint,         primary key (`bookmark_id`)     ) engine=InnoDB     create table `bookmark` (         `bookmark_id` ..

데이터베이스 2024.11.24

[백준 18248번 / java] 제야의 종

문제18248번: 제야의 종풀이1모든 사람(1~4)은 자리가 고정되어있고, 타종이 시행될 때마다 종 소리가 도달하는 거리는 다르다.따라서 들은 사람(1)과 못 들은 사람(0)이 생긴다. 첫 번째 타종이 수행됐을 때, 사람 1은 들었는데 사람 2는 못 들었다면 종으로부터의 거리는 (사람1 두 번째 타종이 수행됐을 때, 사람 2는 들었는데 사람 1은 못 들었다면 종으로부터의 거리는 (사람1 > 사람2)이다. 이 두 상황은 모순이다.따라서 각각의 타종이 울렸을 때를 비교해서 모순되는 경우를 찾으면 된다. 예제) 타종 M번사람N명 123410001200003000041110 예제의 경우, 세 번째 타종에서 사람 1은 못 들었고(0) 사람 4는 들었다(1).네 번째 타종에서 사람 1은 들었고(1) 사람 4는 못 ..

BOJ 2024.11.09

[백준 14496번 / java] 그대, 그머가 되어

문제14496번: 그대, 그머가 되어 풀이알고리즘을 굉장히 오랜만에 풀어서 감을 다 잃었다 ^^.. 일단 어떤 알고리즘을 사용해야 하는지도 떠오르지 않아서그냥 인접리스트를 만들고 재귀로 모든 경로를 돌려서 a->b가 가능한지 찾았다. 코드1import java.io.*;import java.util.Arrays;import java.util.StringTokenizer;public class boj_14496 { static int[][] arr; static int b, ans = -1; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new In..

BOJ 2024.11.08

[JPA] 기본 키 매핑, 컬럼 매핑

기본 키 매핑기본 키를 할당하는 방식은 두 가지입니다.직접 할당자동 할당기본 키 직접 할당기본키로 지정하고싶은 필드에 @Id를 붙여줍니다. @Id@Column(name = "ID")private int id; @Id 적용 가능 타입 :자바 기본형Wrapper 타입Stringjava.util.Datejava.sql.Datejava.math.BigDecimaljava.math.BigInteger @Id 필드에 개발자가 직접 값을 할당해야 합니다. 그런데 영속성 컨텍스트는 엔티티를 식별자값으로 관리하기 때문에 식별자 값이 할당되어야 영속성 컨텍스트의 관리를 받을 수 있습니다. 식별자 값이 없는 상태로 em.persist하면 예외가 발생하는데, 어떤 예외가 발생하는지는 jpa 표준에 정의되어있지 않습니다. 하이..

JPA 2024.10.05

[백준 16973번 / java] 직사각형 탈출

문제16973번: 직사각형 탈출 (acmicpc.net)풀이BFS를 이용해 Sr, Sc에서 시작해서 상하좌우로 한 칸씩 이동 가능한지 확인하며 모든 좌표를 탐색한다.작은 직사각형 범위 안에 벽(1)이 있거나 직사각형이 격자의 범위를 벗어나면 해당 경우는 이동할 수 없음이미 방문한 좌표이면 이동할 수 없음시작 좌표가 Fr, Fc에 도달하면 지금까지 움직인 거리를 출력한다. 직사각형 범위 안에 벽이 있는지 확인할 때, 직사각형의 모든 좌표를 탐색하면 시간초과가 발생한다. //시간초과import java.awt.*;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Lin..

BOJ 2024.09.14

[JPA] 지연 로딩

JPA는 데이터를 조회할 때 즉시 로딩(EAGER)와 지연 로딩(LAZY) 두 가지 방식을 사용합니다. 간단히 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오는 것이고, 지연 로딩은 필요한 시점에 연관된 데이터를 불러오는 것입니다. Fetch TypeFetch Type이란 JPA가 엔티티를 조회할 때 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값입니다. JPA를 사용하면 엔티티 조회가 발생할 때 JPA가 알아서 JPQL을 이용해 쿼리문을 생성합니다. 이때 객체와 필드를 보고 쿼리를 생성하는데, 만약 @ManyToOne 또는 @OneToMany와 같이 다른 객체와 연관관계 매핑이 되어있으면 그 객체들까지 조회하게 됩니다. 이때 이 객체를 어떻게 불러올 것인지 @..

JPA 2024.09.12