본문 바로가기

분류 전체보기

(178)
[Database] Join의 의미와 여러 종류의 Join SQL에서 join join은 SQL에서 두 개 이상 테이블 데이터를 함께 조회하는 것을 말한다. join은 여러 종류의 join이 존재한다. Implicit join과 Explicit join SELECT D.name FROM employee AS E, department AS D WHERE E.id = 1 and E.dept_id = D.id; 위 SQL문은 implicit join을 사용한 예시이다. implicit join은 from 절에는 table들만 나열하고 where절에 join condition을 명시하는 방식이다. implicit join은 where절에 selection condition과 join condition이 같이 있기 때문에 가독성이 떨어지며, 실수할 가능성이 높아서 exp..
[Database] 데이터베이스의 파티셔닝, 샤딩, 레플리케이션 파티셔닝(Partitioning) 파티셔닝은 테이블을 더 작은 크기의 테이블로 나누는 것으로, Vertical Partitioning과 Horizontal Partitioning으로 나눌 수 있다. Vertical Partitioning은 컬럼을 기준으로 테이블을 나누는 방식으로, 데이터 테이블을 정규화하기 위해 사용될 수도 있으며, 다른 경우에도 활용할 수 있다. Vertical Partitioning을 통해 컬럼을 나눠 서로 다른 테이블에 저장할 수도 있으며, 게시판에서 게시물의 조회수, 댓글 수 등을 별도의 테이블로 나눠 저장할 수 있다. Horizontal Partitioning은 행을 기준으로 테이블을 나누는 방식이다. Vertical Partitioning으로 컬럼 기준으로 테이블을 나누어 데..
[Spring] 영속성 전이(Cascade)와 고아 객체(Orphan) 영속성 전이(Cascade) 영속성 전이란 특정 엔티티의 영속성 상태를 변경할 때 그 엔티티와 연관된 엔티티의 영속성에도 영향을 미쳐 영속성 상태를 변경하는 것 예를 들어 아래 코드에서 @OneToMany 어노테이션의 인터페이스를 살펴보면 cascade()라는 요소를 볼 수 있다. public @interface OneToMany { Class targetEntity() default void.class; CascadeType[] cascade() default {}; FetchType fetch() default FetchType.LAZY; String mappedBy() default ""; boolean orphanRemoval() default false; } 영속성 전이에 사용되는 타입은 엔티티..
[Spring] 연관 관계 매핑하기 RDBMS를 사용할 때는 각 도메인에 맞는 테이블을 설계하고 연관관계를 설정해서 조인(Join) 등의 기능을 활용합니다. JPA를 사용하여 테이블의 연관관계를 엔티티 간의 연관관계로 표현할 수 있습니다. 연관관계 매핑 종류와 방향 One To One(일대일) 테이블의 하나의 레코드가 다른 테이블의 하나의 레코드만 연관되어 있는 관계입니다. 예를 들어 Product 테이블과 Product_Detail 테이블의 경우, 한 Product 당 한 Detail 레코드와 연관 관계를 가질 수 있으므로 일대일 관계라고 볼 수 있습니다. One To Many(일대다), Many To One(다대일) 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연관되어 있는 관계입니다. 예를 들어 Team 테이블과 Player ..
[Spring] JPA Auditing, BaseEntity JPA Auditing 'Audit'란 '감시하다'라는 뜻으로, 각 데이터마다 '누가', '언제' 데이터를 생성했고 변경했는지 감시한다는 의미로 사용됩니다. 엔티티 클래스에는 공통적으로 들어가는 필드가 있을 수 있습니다. 예를 들어, '생성 일자'와 '변경 일자', '생성 주체'와 '변경 주체' 같은 것 입니다. 이러한 필드들은 매번 엔티티별로 생성하거나 변경할 때 값을 주입해야 하는 번거로움이 있습니다. 이 같은 번거로움을 해소하기 위해 Spring Data JPA에서는 이러한 값을 자동으로 넣어주는 기능을 제공합니다. JPA Auditing 기능 활성화 @EnableJpaAudting @EnableJpaAuditing 어노테이션은 JPA Auditing을 활성화하는 역할을 합니다. 이 어노테이션은 @..
[Spring] QueryDSL QueryDSL QueryDSL은 정적 타입을 이용해 SQL과 같은 쿼리를 생성할 수 있도록 지원하는 프레임워크 문자열이나 XML파일을 통해 쿼리를 작성하는 대신 QueryDSL이 제공하는 플루언트(Fluent) API를 활용해 쿼리를 생성할 수 있다. QueryDSL의 장점 IDE가 제공하는 코드 자동 완성 기능을 사용할 수 있다. 문법적으로 잘못된 쿼리를 허용하지 않는다. 따라서 정상적으로 활용된 QueryDSL은 문법 오류를 발생시키지 않는다. 고정된 SQL 쿼리를 작성하지 않기 때문에 동적으로 쿼리를 생성할 수 있다. 코드로 작성하므로 가독성 및 생산성이 향상된다. 도메인 타입과 프로퍼티를 안전하게 참조할 수 있다. QueryDSL 의존성 추가하기 Spring 3.x.x이상, Java 21, Gr..
[Spring] JPA의 정렬과 페이징 처리 정렬 처리하기 일반적인 쿼리문에서 정렬을 사용할 때는 ORDER BY 구문을 사용합니다. 쿼리 메서드도 정렬 기능에 동일한 키워드가 사용됩니다. // ASC: 오름차순, DESC: 내림차순 List findByNameOrderByNumberAsc(String name); List findByNameOrderByNumberDesc(String name); 위와 같이 기본 쿼리 메서드를 작성한 후 OrderBy 키워드를 삽입하고 정렬하고자 하는 칼럼과 오름차순/내림차순을 설정하면 정렬이 수행됩니다. 여러 정렬 조건을 사용하기 위해선 다음과 같이 작성할 수 있습니다. List findByNameOrderByPriceAscStockDesc(String name); 위 코드에서 먼저 Price를 우선으로 오름차순..
[Database] 인스타그램의 Justin Bieber 문제 ️Justin Bieber 문제 Justin Bieber 문제는 인스타그램에서 저스틴 비버가 사진을 업로드할 때 마다 인스타그램이 다운되거나 매우 느려지는 현상을 말합니다. 이는 그 당시 인스타그램의 '좋아요' 수를 계산하는 방식 때문이었습니다. 인스타그램에서는 어떤 유저가 언제 어떤 사진에 '좋아요'를 클릭했는지 알 수 있습니다. 그래서 저스틴 비버의 팔로워들에게 그의 최신 사진을 표시할 때 해당 사진을 본 모든 사람에 대해 '좋아요' 수를 최신화된 수치로 보여주어야 했습니다. '좋아요' 수를 계산하기 위한 테이블로 다음과 같은 DB 테이블를 구성해보겠습니다. Photos id title user_id file_url 1 Photo A 2 http://example.com/photo1.jpg 2 Pho..