@SpringBootTest: Spring Container 전체를 로딩 (단위 테스트 목적 X)
@DataJpaTest: Repository 테스트에 최적화된 어노테이션
@Repository 관련 빈만 로드@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));
}
save() → 저장된 객체 반환deleteById(id)findById(id) → Optional 사용save() → UPDATE 실행됨findAll() → List 반환@Entity, @Table(name = "tbl_product")@Id + @GeneratedValue@CreationTimestamp, @UpdateTimestamp@Enumerated(EnumType.STRING)으로 enum값 명시적 저장changeProduct()@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;
}
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);
SELECT USER_ID, U.USERNAME, U.EMAIL, UP.FULL_NAME
FROM USERS U
NATURAL JOIN USER_PROFILES UP;
SELECT USER_ID, U.USERNAME, U.EMAIL, UP.FULL_NAME
FROM USERS U
JOIN USER_PROFILES UP USING (USER_ID);
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;
save, findById, deleteById 등으로 수행 가능하며, 수정은 조회 후 필드 변경 + save()로 처리@DataJpaTest는 JPA Repository 테스트에 특화된 어노테이션