전체 글

Spring Data JPA 사용 중 unique 제약조건이 있는 데이터를 삭제한 뒤 추가하는 경우 duplicate entry 에러가 발생했다. 🫠 나는 데이터를 삭제했는데 왜 에러가 나지?1. 영속성 컨텍스트의 쓰기 지연 성질로 @Transactional 내부의 쿼리문들은 마지막에 한 번에 실행2. Hibernate의 쿼리 실행 인터페이스(AbstractFlushingEventListener)의 구현 메서드(performExecutions)는 동작하는 SQL 순서가 정해져 있다. 따라서 delete 코드를 먼저 작성했더라도 insert 쿼리를 먼저 실행한 후에 delete를 실행한다. 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 DB에 쿼리를 날리지 않고 내부 쿼리 저장소에 모아둔 후 트랜잭션을 ..
·Back-end
1️⃣ HashTable 자료구조에 대해 알아보자 (Key, Value) 구조로 데이터를 저장하는 자료구조로, 빠르게 데이터를 검색할 수 있다. 각각의 Key 값에 해시함수를 적용해 고유 index를 생성하고, 이 index를 활용해 값을 저장하고 검색한다. 평균 O(1)의 시간복잡도를 갖지만 충돌이 일어나 연속적으로 검색해야 되는 경우 O(n)까지 증가할 수 있다. 💥 해시값이 충돌하는 경우 서로 다른 Key 값에 해시함수를 적용한 값이 동일한 경우에는 어떻게 할까? 1. 분리연결법(Seperate Chaining) 동일한 버킷일 경우 추가 메모리를 사용해 데이터를 연결해 관리한다. 분리연결법의 경우 해시 테이블의 확장이 필요 없고, 구현이 간단하지만 데이터의 수가 많아지면 동일한 버킷에 연결되는 데이..
이전에 썼던 상품 좋아요 생성 API를 구현하면서 "상품 좋아요 수"의 동시성 문제에 대해 고민하게 되었다. 👍 상품 좋아요 수회원이 상품 좋아요를 생성하면 해당 상품은 좋아요 개수가 1 증가한다.트래픽이 많아지고 동시에 요청하게 될 경우 동시성 문제가 발생할 것이다. 🧐 DB 락을 사용해 볼까?🔓 Optimistic Lock(낙관적 락)대부분의 트랜잭션이 충돌이 발생하지 않을 것이라고 낙관적으로 가정하는 방법이다. 따라서 데이터베이스가 제공하는 락 기능을 사용하지 않고, 엔티티의 버전을 통해 동시성을 제어한다. 즉, DB Transaction을 이용하는 것이 아닌 애플리케이션 레벨에서 지원하는 락이다.낙관적락은 version 등의 구분 컬럼을 이용해서 충돌을 예방한다. (version 뿐 아니라..
·Back-end
@Transactional 에는 rollbackFor 옵션이 있다. 해당 옵션의 주석을 확인해 보았더니 By default, a transaction will be rolled back on RuntimeException and Error but not on checked exceptions (business exceptions). See org.springframework.transaction.interceptor.DefaultTransactionAttribute.rollbackOn(Throwable) for a detailed explanation. Transaction은 Unchecked Exception(RuntimeException 하위 클래스)과 Error에만 roll back을 수행하고, C..
·Back-end
1. 현재 작업 내용 임시 저장 git add . git stash 2. 임시 저장한 작업 내역 불러오기 git stash apply [stash 이름] 3. 작업 끝난 가장 최근 stash 한개 제거 git stash drop 4. stash를 잘못지워 복구하고 싶을 때 $ git stash drop Dropped refs/stash@{0} (5d5d2ea0733eb0b528571473973ff893b70956fb) 위 메세지의 오른쪽 괄호 값이 삭제된 stash의 해쉬 값이다. 해당 해쉬 값을 복사해 git stash apply 5d5d2ea0733eb0b528571473973ff893b70956fb
·Back-end
@Entity란? JPA를 사용해 테이블과 매핑할 클래스에 붙이는 어노테이션이다. @Entity가 붙은 클래스는 JPA가 관리하는 객체가 된다. 🧐 무분별한 어노테이션 사용 @Setter // 문제 1. 객체가 무분별하게 변경될 가능성 있음 @Getter @NoArgsConstructor // 문제 2. 기본 생성자의 접근 제어자가 불명확함 @AllArgsConstructor // 문제 3. 객체 내부의 인스턴스 멤버들을 모두 가지고 있는 생성자를 생성 @Builder // 문제 4. 모든 매개변수가 생성자 param으로 들어가 객체 생성 시 받지 않아야 할 매개변수도 빌더에 노출 @Data // 문제 5. 사용하지 않는 어노테이션을 따로 exclude 할 수 없기 때문에 개별 어노테이션 사용 @Enti..
·Back-end
- IDE: IntelliJ- jdk: openjdk 17 버전- spring boot: 3.0.0- Gradle 언어: Groovyjava.lang.NoClassDefFoundError:javax/persistence/Entityattempt to recreate a file for type qclasscould not find class file for querydslUnable to load class 'javax.persistence.Entity'.위 오류들 해결 🌲 멀티 모듈 X1. build.gradle에 Querydsl 의존성 추가dependencies { ... // querydsl implementation "com.querydsl:querydsl-jpa:5.0.0:ja..
·Back-end
멀티모듈로 구성되어 있는 프로젝트의 테스트코드를 실행해 보았더니 Caused by: java.lang.IllegalStateException: Failed to introspect Class [AccountService] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7] Caused by: java.lang.NoClassDefFoundError: repository/AccountRepository Caused by: java.lang.ClassNotFoundException: repository.AccountRepository 이렇게 다른 모듈로 구분되어 있는 클래스파일을 읽어오지 못한다는 에러가 발생했다. 우선 내 b..
·Back-end
스프링에서 JPA를 사용 시 application.yml 파일의 spring.jpa.hibernate.ddl-auto: create 설정을 통해 하이버네이트가 자동으로 테이블을 만들어주지만 실 배포 단계에서는 하이버네이트가 자동 생성한 sql을 사용하는 것은 좋지 않다. 1️⃣ schema.sql 파일 schema.sql 파일을 만들면 하이버네이트에서 기본적으로 만드는 ddl을 사용하지 않고 데이터베이스 테이블을 만들 수 있다. 해당 파일을 resources 디렉토리에 만들어준다. drop table if exists post; create table post ( id bigint not null auto_increment, title varchar(255), content text not null, p..
서채리
chaewss