TIL - 20250728

juni·2025년 7월 28일

TIL

목록 보기
77/316

0728 학습내용 정리


🧪 JPA 테스트 코드 작성법

🔹 어노테이션 설명

  • @SpringBootTest: Spring Container 전체를 로딩 (단위 테스트 목적 X)

  • @DataJpaTest: Repository 테스트에 최적화된 어노테이션

    • @Repository 관련 빈만 로드
    • 자동으로 롤백
    • 내장 DB만 사용 가능(H2 등)

🔹 Product 테스트 흐름

1. 사전 저장

@BeforeEach
void insertBefore() {
    Product p1 = Product.builder().name("아이폰").category(ELECTRONIC).price(2000000).build();
    Product p2 = Product.builder().name("탕수육").category(FOOD).price(20000).build();
    Product p3 = Product.builder().name("구두").category(FASHION).price(300000).build();
    Product p4 = Product.builder().name("주먹밥").category(FOOD).price(1500).build();
    productJpaRepository.saveAllAndFlush(List.of(p1,p2,p3,p4));
}

2. CRUD 테스트 예시

  • 저장: save() → 저장된 객체 반환
  • 삭제: deleteById(id)
  • 단일조회: findById(id) → Optional 사용
  • 수정: 객체 수정 후 다시 save() → UPDATE 실행됨
  • 전체조회: findAll() → List 반환

🔹 Product 클래스 주요 구성

  • @Entity, @Table(name = "tbl_product")
  • @Id + @GeneratedValue
  • @CreationTimestamp, @UpdateTimestamp
  • @Enumerated(EnumType.STRING)으로 enum값 명시적 저장
  • 편의 메서드: changeProduct()

📚 JPA 실습: Student 예제

🔹 엔티티 구조

@Entity
@Table(name = "tbl_student")
public class Student {
    @Id @GeneratedValue(strategy = GenerationType.UUID)
    private String id;
    private String name;
    private String city;
    private String major;
}

🔹 Repository: Query Method 예시

List<Student> findByName(String name);
List<Student> findByCityAndMajor(String city, String major);
List<Student> findByMajorContaining(String major);
List<Student> findByMajorStartingWith(String major);
List<Student> findByMajorEndingWith(String major);
  • 규칙 기반 쿼리 메서드를 통해 자동으로 SQL 생성

🗂️ SQL JOIN 문 복습

🔹 NATURAL JOIN

  • 공통 컬럼 기준 자동 조인
  • 별칭 사용 시 주의 (컬럼 이름 그대로 유지해야 작동)
SELECT USER_ID, U.USERNAME, U.EMAIL, UP.FULL_NAME
FROM USERS U
NATURAL JOIN USER_PROFILES UP;

🔹 USING JOIN

SELECT USER_ID, U.USERNAME, U.EMAIL, UP.FULL_NAME
FROM USERS U
JOIN USER_PROFILES UP USING (USER_ID);

🔹 SELF JOIN

SELECT U1.USER_ID, U1.USERNAME, U1.MANAGER_ID,
       NVL(U2.USERNAME, '상사없음') AS MANAGER_NAME
FROM USERS U1
LEFT JOIN USERS U2
ON U1.MANAGER_ID = U2.USER_ID;

🔹 집합 연산자

  • UNION: 합집합 (중복 제거)
  • UNION ALL: 중복 허용
  • INTERSECT: 교집합
  • MINUS: 차집합
-- 좋아요와 댓글 작성자 ID 교집합
SELECT USER_ID FROM LIKES
INTERSECT
SELECT USER_ID FROM COMMENTS;

✅ 요약

  • JPA에서 CRUD는 save, findById, deleteById 등으로 수행 가능하며, 수정은 조회 후 필드 변경 + save()로 처리
  • @DataJpaTest는 JPA Repository 테스트에 특화된 어노테이션
  • Query Method는 이름만으로 SQL을 자동 생성하여 간단한 조건 검색이 가능
  • SQL JOIN문(NATURAL, USING, SELF JOIN)과 집합 연산자(UNION, INTERSECT 등)도 실습을 통해 복습

0개의 댓글