본문 바로가기

전체 글203

JPA 메서드 네이밍 & 반환 타입 Spring Data JPA는 메서드 이름만으로 쿼리를 자동으로 생성해주는 기능을 제공합니다.findByXxx, readByXxx, countByXxx처럼 메서드 이름을 규칙에 맞게 설정하면 편리하게 DB 접근이 가능.1. findByTagNo역할: 특정 tagNo 값을 가진 여러 개 태그 데이터 조회반환 타입: List예시:public interface TagsRepository extends JpaRepository { List findByTagNo(Long tagNo);}주의: DB에서 tagNo가 유일(unique)하지 않다면, 여러 개의 엔티티가 반환될 수 있습니다.2. getTagById역할: 단일 태그를 조회할 때 사용하는 서비스 레이어 메서드내부적으로 findById 등을 사용하여 O.. 2025. 2. 25.
스프링에서 Bean 주입 시 주의사항 (필드 vs 생성자 주입) Spring에서 의존성 주입(Dependency Injection)을 할 때, 흔히 @Autowired를 사용합니다.여기서 필드 주입(Field Injection)과 생성자 주입(Constructor Injection) 두 가지 중 무엇을 사용할지 자주 논의되는데요,주로 권장되는 방식은 생성자 주입입니다.1. 필드 주입(@Autowired)의 문제점가시성 부족: 클래스 내부 필드에 그냥 @Autowired 하면, 어디서 어떻게 주입되는지 한눈에 파악하기 어려움final 사용 불가: 런타임에 주입되므로, 재할당 불가능하게 만들기 힘듦테스트 어려움: 단위 테스트에서 Mock 객체를 주입하기가 번거롭거나 불가능할 수 있음2. 생성자 주입의 장점명시적 의존성: 생성자 시그니처에서 어떤 의존성이 필요한지 바로 확.. 2025. 2. 24.
양방향 매핑 시 무한 루프 문제란? JPA에서 양방향 연관 관계(예: @OneToMany, @ManyToOne 등)를 설정하면,Spring Boot에서 JSON을 직렬화(Serialize)할 때 무한 루프(Infinite Recursion) 문제가 발생할 수 있다.📌 무한 루프 발생 예시@Entitypublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List orders;}@Entitypublic class Order { @Id @.. 2025. 2. 23.
JPA 일대일(OneToOne) 관계 매핑 JPA에서 1:1 관계를 설정할 때는 @OneToOne과 함께 @JoinColumn 또는 mappedBy 속성을 사용합니다.어떤 엔티티가 외래 키를 가질지에 따라 설정이 달라집니다.1. @JoinColumn 사용 시@OneToOne(cascade = CascadeType.ALL)@JoinColumn(name = "diary_tags_no")private DiaryTagsEntity diaryTagsEntity;DiaryEntity 테이블에 diary_tags_no 컬럼이 생성됨 (주인, owner)2. mappedBy 사용 시@OneToOne(mappedBy = "diaryEntity", cascade = CascadeType.ALL)private DiaryTagsEntity diaryTagsEntity.. 2025. 2. 23.
즉시 로딩(EAGER)과 지연 로딩(LAZY), 언제 어떤 전략을 써야 할까? JPA에서는 @ManyToOne, @OneToMany, @OneToOne, @ManyToMany 같은 연관 관계를 맺을 때,데이터를 언제 로딩할지 결정하는 FetchType 옵션이 있습니다.즉시 로딩(FetchType.EAGER): 연관된 엔티티를 즉시 함께 조회지연 로딩(FetchType.LAZY): 연관된 엔티티를 실제 사용할 때 조회1️⃣ 왜 기본적으로 LAZY가 권장될까?✅ 즉시 로딩(FetchType.EAGER)의 문제점즉시 로딩은 편리하지만 항상 모든 연관된 엔티티를 함께 불러온다는 점이 문제가 됩니다.즉, 필요 없는 데이터를 가져오거나, 쿼리가 복잡해지면서 성능 저하가 발생할 수 있어요.❌ EAGER 사용 시 발생할 문제들1️⃣ 불필요한 데이터까지 한 번에 조회됨예를 들어, User 엔티티가.. 2025. 2. 23.
JPA 페치 타입: 즉시 로딩(EAGER)과 지연 로딩(LAZY) JPA에서 엔티티 간 연관관계를 설정할 때, 연관 객체를 언제 조회할지를 결정하는 것이 FetchType입니다.즉시 로딩(EAGER)과 지연 로딩(LAZY)의 차이와 장단점을 알아봅니다.1. 즉시 로딩(EAGER)원리: 엔티티를 조회할 때, 연관된 엔티티도 바로 함께 조회장점:한 번의 쿼리로 필요한 정보를 전부 가져오기 때문에, 코드에서 편리단점:필요 없는 데이터까지 가져와서 성능을 해칠 수 있음대규모 연관관계에서는 N+1 문제 등이 발생하기 쉬움2. 지연 로딩(LAZY)원리: 엔티티를 먼저 가져오고, 실제로 사용할 때(필요할 때) DB에서 추가 조회를 수행장점:처음에는 최소한의 데이터만 조회 -> 성능 최적화에 유리단점:LazyInitializationException, N+1 문제 대비가 필요연관 객.. 2025. 2. 23.
@EntityListeners(AuditingEntityListener.class)란? Spring Data JPA에서 자동으로 날짜/시간을 기록하는 기능(@CreatedDate, @LastModifiedDate 등)을 사용하려면,Spring이 해당 엔티티의 생성/수정 이벤트를 감지할 수 있도록 Auditing 기능을 활성화해야 합니다.이때 필요한 설정이 바로 @EntityListeners(AuditingEntityListener.class)입니다.1. 왜 필요한가?Spring Data JPA의 Auditing 기능(@CreatedDate, @LastModifiedDate)은엔티티가 언제 생성되었는지, 언제 수정되었는지를 자동으로 기록하는 기능입니다. 하지만 JPA에서는 엔티티의 변경을 자동으로 감지하지 않기 때문에,JPA의 이벤트 리스너(@EntityListeners)를 등록해야 Audi.. 2025. 2. 22.
JPA 엔티티 날짜/시간 자동 설정 JPA에서는 엔티티가 생성되거나 수정될 때 자동으로 날짜/시간을 기록할 수 있습니다.Spring Data JPA의 @CreatedDate, Hibernate 구현체의 @CreationTimestamp가 대표적이다.1. @CreatedDate특징: Spring Data JPA에서 제공, 엔티티가 처음 저장될 때의 시간을 자동으로 기록설정 조건:@EnableJpaAuditing 활성화 (예: @SpringBootApplication 클래스나 별도 설정 클래스)엔티티 클래스에 @EntityListeners(AuditingEntityListener.class) 추가해당 필드에 @CreatedDate 적용예시 코드:@Entity@EntityListeners(AuditingEntityListener.class)pu.. 2025. 2. 22.