0. 환경필자는 mysql8.0 을 사용중 이며, RDBMS 기준으로 이야기를 해보겠다 1. 들어가며기본적으로 도메인에 대한 내용을 확실히 숙지했고, 비즈니스 흐름을 명확히 파악했을 때 DB 설계를 해야 큰 효율을 볼 수 있다고 생각한다 실무에서 가끔 테이블 설계를 하고, 필요한 컬럼들을 추가하는 작업을 진행할 때 가 있다 테이블 설계시 거시적인 관점이 아닌 당장 앞에 필요한 부분만 보고 설계하면 누구나 쉽게 설계 할 수 있다 하지만 확장성 및 유지보수성을 생각하는 미래지향적 설계라면 고려해야 할 부분이 여러가지가 있다.정규화키관리 전략외래키, 복합키 등등대표적으로 2가지가 있다 필자는 실무에서 JPA 를 사용중에 있고, JPA 연관관계 설정시 1:1, 1:N 관계을 테이블이 여러개있지만 새로운 설계에..

문득 궁금한게 생겼다. Redis 가 얼마나 빠르길래 사람들이 Redis 를 자주 사용하는걸까? 그래서 직접 RDB 와 InMemory DB 의 퍼포먼스를 비교해보려고 한다단순한 궁금증에서 출발한 실험이지만, 실제로도 Redis 캐시를 도입할 가치가 있는지 가늠할 수 있는 지표가 될 수 도 있다. 실험 조건rdb 는 mysql, inMemory 는 redis 를 사용한다Sample 은 40만건 기준이다.비교 정보는 단건 조회 및 전체 조회 이다.rdb 및 redis 는 조회할 컬럼에 인덱스가 걸려있다.동시성은 고려하지 않는다.Redis 는 Hash 자료구조를 사용한다. 단건 조회// MySQL 단건 조회public Pos getUuid(Long id) { Pos pos = posRepository...

JPA 를 사용할 때 항상 N+1 문제를 조심해야한다 그리고 N+1 문제를 해결하기 위해서는 여러가지 방안이 있다 왜 N+1 이 발생하고, 어떻게 해결해 나가는지 코드를 통해 이해를 도와보자 1) Entity기본적으로 위 예시에는 2개의 엔티티가 존재한다 NMember 와 NOrder 가 있고, NMember 는 여러개의 NOrder 를 가짐으로써 두 엔티티의 관계에서부모: NMember, 자식: NOrder 관계 이다. 그러므로 NMember 기준 @OneToMany, NOrder 기준 @ManyToOne 사용 코드 수 최소화 및 편의를 위해 Lombok 을 사용하서 개발을 한다 @AllArgsConstructor@NoArgsConstructor(access = AccessLevel.PROTECTED..

로컬에서 테이블 데이터를 비우기 위해서 truncate 를 계속 사용하고 있다가 테스트 DB 에서 테스트를 한 후'truncate' 로 테이블 데이터를 지우는 것을 사수님이 보고 깜짝 놀라셨다 잠깐 당황했지만, 이유를 여쭤보았다 위 명령어는 최대한 지양 하라고 하고, 이유는 꼭 찾아보라고 말씀하셔서 제대로 공부를 해본 내용을 정리해보겠다RDBMS 는 MySQL8.0 을 기준으로 작성하였습니다 DDL (데이터 정의어)보통 DBA 나 DB 를 관리하는 사람들이 자주 사용을 한다 작업단위는 '테이블(=객체)' 단위로 변화가 일어난다 exO schema, table, view, index 1) CREATE (테이블 생성, 스키마 생성)CREATE TABLE users ( id INT AUTO_INCREM..

들어가며영속성 전이는 엔티티의 영속성 상태 변화를 줄 때 연관된 엔티티에도 함께 적용하는 것이다예를 들어 엔티티를 저장할 때 연관된 엔티티도 함께 저장하고, 엔티티를 삭제할 때 연관된 엔티티도 함께 삭제하는 것이 영속성 전이 이다 영속성 전이를 적용하는 방법은 간단하다@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)@JoinColumn(name = "user_id")private User user; 연관관계 설정시 옵션에 cascade 속성값을 지정해주면 된다cascade = CascadeType.(*) 위 설정을 PERSIST 로 하게되면 연관된 엔티티도 함께 저장을 시킨다 EntityManger em = EntityManagerFact..

들어가며토이 프로젝트를 하며 이 오류를 처음 접하게 되었다. 아래 내용을 통해 어떻게 해결하는지 알아보자 아래 코드를 보자@RequiredArgsConstructorpublic class CustomUserDetails implements UserDetails { private final LoginEntity login; private MemberEntity member; @Override public Collection getAuthorities () { Collection collection = new ArrayList(); collection.add(new GrantedAuthority() { @Override public String getAuthority () { return l..

서론 토이프로젝트를 진행하다가 insert 쿼리를 날리는 회원가입 로직을 작성하는데자꾸 마지막에 쿼리에 update 쿼리가 발생하는 문제를 확인하였다. DB에 insert 되는 데이터에는 크게 문제가 없긴했다.하지만 궁금했다, 나는 분명 insert 로직만 작성을 했는데 왜 update 쿼리가 날라갈까? 본론을 들어가기 전에 간단한 더티 체킹 개념에 대해서 이야기 해보겠습니다. 더티 체킹이란?JPA에서 더티 체킹(dirty checking)이란 영속성 컨테이너가 관리하는 엔티티의 상태를 감지해서, 변경된 부분이 있다면 자동으로 트랜잭션이 끝나는 시점에 데이터베이스에 반영하는 기능이다.여기서 말하는 dirty는 “엔티티 데이터의 변경된 부분”을 뜻하며 checking은 변경된 부분을 감지한다는 의미이다. ..

오늘은 JPA 어노테이션인 @Embedded @Embeddable 에 대해서 알아보겠습니다. 서론JPA 는 Java 에서 사용할 수 있는 ORM 으로 정말 유용한 도구 입니다.보통 Java,Spring 개발자들은 Spring Data JPA 를 사용합니다. Spring Data JPA 는 추상화가 아주 잘되어 있어 사용에 정말 유용 합니다. 하지만 사용에 유용한 만큼, 잘 알고 사용할 필요가 있습니다. Spring Data JPA 를 추가하게 되면jakarta.persistence; 위 패키지에서 추상화가 잘된 인터페이스 및 어노테이션을 사용할 수 있습니다.그리고 공식문서 또한 보기 좋게 되어 있어, 개발 생산성에 아주 좋다고 생각합니다. 왜 JPA Entity 에서 @Embeddalbe , @Emb..

안녕하세요👋오늘은 제가 개발시 느꼈던 에러와 불편함에 대한 해결책을 이야기 해보려고 합니다. 해결 방법이 급하게 궁금하신분은 맨 아래에 해결 방법이 나와 있습니다ㅎㅎ ✅ 서론제 개발 환경은 Intellj, Java17, SpringBoot3.2, MySQL8.0 입니다 (참고 해주세요) 저는 항상 DB 툴을 통해서 미리 ERD 를 통해 DB 설계 후 , DB에 알맞게 Entity 를 구현하였습니다. 그리고 실무라고 생각하고 개발을 진행하였기에 application.yml 에서 JPA 설정은 spring: jpa: show-sql: true properties: format_sql: true dialect: org.hibernate.dialect.MySQL8Diale..

안녕하세요✋오늘은 Redis 데이터 타입에 대하여 설명을 해보겠습니다. Redis 는 Key/Value 구조을 저장을 지원하는 NoSQL 데이터 베이스 입니다. Key는 Redis data에 접근할 수 있는 식별자이며Key 에는 binary, text를 사용할 수 있습니다. 하나의 Key 에는 최대 512MB 까지 저장할 수 있다. 이제 Redis 의 DataType 에 대하여 알아보겠습니다. 대표적으로 Key/Value(Data type) 에는 1) Strings2) Lists3) Sets4) Sorted sets5) Hashes6) Geospatial7) Bitmap Java 컬렉션 프레임 워크에도 비슷한 자료구조가 있습니다. 그리고 위에 있는 데이터 타입들은 자바 컬렉션 프레임워크랑 거의 유사하다고..