TIL - 20250729

juni·2025년 7월 29일

TIL

목록 보기
78/316

0729 학습 정리

1. JPA 연관관계 매핑 (양방향 매핑)

◆ 개념

  • 객체지향에서는 DB의 관계를 클래스 간의 관계로 표현함.
  • 1\:N (부서:사원) 관계를 객체에서도 부서가 사원 리스트를 가짐으로써 표현 가능

◆ 코드 구성

  • Department (부서)

    • @OneToMany(mappedBy = "department")로 사원 리스트 관리
    • CascadeType 설정 가능: PERSIST, REMOVE, ALL
    • orphanRemoval: 고아 객체 자동 삭제
  • Employee (사원)

    • @ManyToOne(fetch = FetchType.LAZY)
    • 부서 정보를 LAZY 로딩으로 설정해 성능 최적화
    • changeDepartment() 메서드로 양방향 관계 동기화

◆ 테스트

  • 부서를 통해 소속 사원 조회
  • 사원을 통해 소속 부서 조회
  • 사원 부서 변경 시 양방향 동기화 필수

2. JPA Repository

  • EmployeeRepositoryDepartmentRepository 는 JpaRepository 상속으로 기본 CRUD 제공

3. SQL 서브쿼리 복습

◆ 서브쿼리 기본

  • SELECT 절, WHERE 절, FROM 절 등 다양한 위치에서 사용

  • 단일행 vs 다중행 서브쿼리:

    • 단일행: =, <>, <, >
    • 다중행: IN, ANY, ALL

◆ 예시 쿼리들

1. 특정 유저(ryan)가 작성한 게시글

SELECT *
FROM POSTS
WHERE USER_ID = (
  SELECT USER_ID FROM USERS WHERE USERNAME = 'ryan'
);

2. 평균 조회수보다 높은 게시물

SELECT *
FROM POSTS
WHERE VIEW_COUNT > (
  SELECT AVG(VIEW_COUNT) FROM POSTS
);

3. 특정 해시태그(#그래픽) 게시글 조회

SELECT P.*, U.USERNAME
FROM POSTS P
LEFT JOIN USERS U ON P.USER_ID = U.USER_ID
WHERE POST_ID IN (
  SELECT POST_ID
  FROM POST_TAGS
  WHERE TAG_ID = (
    SELECT TAG_ID FROM HASHTAGS WHERE TAG_NAME = '#포켓모드'
  )
);

4. 피카츄가 올린 게시물에 좋아요 누른 유저

SELECT USERNAME
FROM LIKES L
JOIN USERS U ON L.USER_ID = U.USER_ID
WHERE POST_ID IN (
  SELECT POST_ID
  FROM POSTS
  WHERE USER_ID = (
    SELECT USER_ID FROM USERS WHERE USERNAME = 'pikachu'
  )
);

마무리 정리

  • JPA 양방향 매핑에서는 관계 유지 및 동기화 메서드 작성이 중요함
  • 테스트 시 @Transactional, @Rollback(false) 설정을 통해 DB 반영 확인
  • 서브쿼리는 복잡한 조건을 효율적으로 처리할 수 있는 유용한 도구이며, 다양한 위치에 삽입 가능함

0개의 댓글