본문 바로가기

코딩 공부/web & Java115

[JPA] N + 1 문제 N + 1 문제 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상입니다. 🏷️ 예시 위와 같이 DB가 만들어져 있었을 때, EAGER(즉시 로딩)으로 한 경우와 LAZY(지연 로딩)으로 한 경우를 살펴보겠습니다. ✅ Fetch 모드를 EAGER(즉시 로딩)으로 한 경우 // User 엔티티 @Entity public class User { @Id @GeneratedValue private long id; private String firstName; private String lastName; @ManyToOne(fetch = FetchType.EAGER)// 즉시 로딩 @JoinColumn(name = "team_id.. 2024. 4. 23.
[Spring] Proxy Proxy 프록시(Proxy)는 대리자 라는 뜻으로, 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 역할을 합니다. 프록시는 실제 대상인 것처럼 위장함으로써 이를 사용하는 클라이언트는 구체 클래스를 알 필요가 없어집니다. 또한 프록시는 클라이언트의 요청을 받아서 원래 요청 대상에게 바로 넘겨주는 게 아닌, 다양한 부가기능을 지원할 수 있습니다. 여기서 원래 요청하려는 대상, 즉 최종적으로 요청을 위임받아 처리하는 실제 오브젝트를 타깃이라고 합니다. 🏷️ 프록시 패턴 프록시 객체가 객체를 감싸서 클라이언트의 요청을 처리하게 하는 패턴으로 접근 제어, 부가 기능 추가 등의 이유로 사용합니다. 원래 객체와 같은 interface를 구현해줘야 하고 객체를 주입받아 inte.. 2024. 4. 17.
[Java] DTO를 Record로 만드는 이유 Record // 레코드 선언법 public record 레코드명(컴포넌트1, 컴포넌트2, ...) { } 값의 집합으로 이루어진 간단한 객체를 심플하게 개발하기위해 고안되었으며, immutable data(불변데이터)를 다룰 class 구현에 최적화되어있습니다. 따라서 웹서비스 구현에서 많이 사용되는 DTO 개념에 적용하면 유용합니다. 생성자, accessors(getter), equals(), hashCode(), toString() 등 DTO 특성의 클래스를 개발할때 매번 개발자가 직접 구현해주어야 했던 반복적인 작업이 줄어듭니다. 또한, "이 클래스는 data carrier 용도이다"를 명시적으로 나타낼 수 있으므로 코드에 대한 이해를 돕고 해당 클래스의 목적에 맞지 않는 구현을 하지 않도록 방지.. 2024. 4. 17.
[Java] Lombok Lombok Lombok이란 어노테이션 기반으로 코드를 자동완성 해주는 라이브러리입니다. Lombok을 이용하면 Getter, Setter, Equlas, ToString 등과 다양한 방면의 코드를 자동완성 시킬 수 있습니다. 예를 들어 객체에서 생성자도 필요하고, toString 함수도 Override 해야하는 등 추가적인 작업이 필요하다면 1개의 VO 클래스만 해도 상당히 길어지고, 코드의 가독성은 떨어지는 등의 단점이 있습니다. 하지만 Lombok을 적용한다면 아래와 같이 단순화시킬 수 있습니다. // Lombok 적용 전 public class User { private String useuId; // 유저ID private String password; // 비밀번호 // 생략 public St.. 2024. 3. 10.
[JPA] findById와 getReferenceById 🏷️ 데이터를 가져오는 방식 ✅ findById Optional findById(ID id) ▪️ Optional: 조회된 엔티티를 Optional로 감싼 반환 타입입니다. Optional은 엔티티가 존재하지 않을 수도 있는 경우에 사용됩니다. ▪️ ID: 조회할 엔티티의 식별자(ID) 타입입니다. ▪️ 조회된 엔티티 객체를 Optional로 감싸서 반환합니다. ▪️ CrudRepository와 JpaRepository 인터페이스에서 모두 제공되는 메소드입니다 ✅ getReferenceById public T getReferenceById(ID id) ▪️ T: 반환 타입으로 엔티티의 클래스 타입입니다. ▪️ ID: 조회할 엔티티의 식별자(ID) 타입입니다. ▪️ 엔티티가 영속성 컨텍스트에 없으면 Ent.. 2024. 3. 9.
[JPA] JPA Auditing JPA Auditing Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재합니다. 대표적으로 생성일, 수정일같은 필드 및 컬럼으로 데이터베이스에서 누가, 언제하였는지 기록을 잘 남겨놓아야 하기 때문에 이 컬럼은 대단히 중요한 데이터 입니다. 또한 도메인마다 공통으로 존재한다는 의미는 결국 코드가 중복된다는 말과 일맥상통합니다. 그래서 JPA에서는 Audit이라는 기능을 제공하고 있습니다. Audit은 감시하다, 감사하다라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터.. 2024. 2. 11.