JPA 문법 [Find-By] 외래키(FK) 조회 방법

박세건·2023년 3월 25일
0

Spring Data 방법

JPA에서는 findBy를 사용하여 엔티티의 컬럼 값으로 조회할 수 있습니다.
하지만 외래키(FK) 값을 기준으로 조회하려면 어떻게 해야 할까요?
이 글에서는 JPA에서 외래키 값을 사용하여 엔티티를 조회하는 방법을 설명합니다.


1. 엔티티 구조

우선, BoardEntity(게시판)와 MemberEntity(회원) 간의 관계를 설정한 엔티티를 살펴보겠습니다.

BoardEntity (게시판 엔티티)

@Entity
@Getter
@Setter
@ToString
public class BoardEntity extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String boardWriter;

    @Column
    private String boardTitle;

    @Column(length = 555)
    private String boardContents;

    @Column
    private int boardHits;

    // MemberEntity와 N:1 관계 (FK: member_id)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private MemberEntity memberEntity;

    public static BoardEntity toBoardEntity(BoardDTO boardDTO, MemberEntity memberEntity) {
        BoardEntity boardEntity = new BoardEntity();
        boardEntity.setBoardWriter(boardDTO.getBoardWriter());
        boardEntity.setBoardTitle(boardDTO.getBoardTitle());
        boardEntity.setBoardContents(boardDTO.getBoardContents());
        boardEntity.setMemberEntity(memberEntity);
        boardEntity.setBoardHits(0);
        return boardEntity;
    }
}

MemberEntity (회원 엔티티)

@Entity
@Getter
@Setter
@Table(name = "member_table")
public class MemberEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long memberId;

    @Column(unique = true)
    private String memberEmail;

    @Column
    private String memberPassword;

    @Column
    private String memberName;

    @Column
    private int memberAge;

    @Column(unique = true)
    private String memberPhone;

    // BoardEntity와 1:N 관계 (FK: memberEntity)
    @OneToMany(mappedBy = "memberEntity", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<BoardEntity> boardEntityList = new ArrayList<>();

    public static MemberEntity toMemberEntity(MemberDTO memberDTO) {
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setMemberEmail(memberDTO.getMemberEmail());
        memberEntity.setMemberPassword(memberDTO.getMemberPassword());
        memberEntity.setMemberName(memberDTO.getMemberName());
        memberEntity.setMemberAge(memberDTO.getMemberAge());
        memberEntity.setMemberPhone(memberDTO.getMemberPhone());
        return memberEntity;
    }

    public static MemberEntity toUpdateMemberEntity(MemberDTO memberDTO) {
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setMemberId(memberDTO.getMemberId());
        memberEntity.setMemberEmail(memberDTO.getMemberEmail());
        memberEntity.setMemberPassword(memberDTO.getMemberPassword());
        memberEntity.setMemberName(memberDTO.getMemberName());
        memberEntity.setMemberAge(memberDTO.getMemberAge());
        memberEntity.setMemberPhone(memberDTO.getMemberPhone());
        return memberEntity;
    }
}

2. FK를 활용한 데이터 조회

특정 회원이 작성한 모든 BoardEntity(게시글) 데이터를 가져오려면, MemberEntity의 PK(회원 ID)를 기준으로 조회해야 합니다.

JPA 쿼리 메서드 작성

Spring Data JPA에서는 엔티티 필드명을 기준으로 findBy 메서드를 자동 생성할 수 있습니다.

📌 FK 값으로 조회하는 방법

List<BoardEntity> findByMemberEntity_MemberId(Long id);

📌 규칙

findBy + {FK를 관리하는 엔티티 필드명} + _ + {FK를 관리하는 엔티티의 PK 필드명}
(findByMemberEntity_MemberId)

즉, BoardEntity의 memberEntity(참조 필드) → MemberEntity의 memberId(PK 필드) 순으로 접근하는 것입니다.


3. Repository 코드

package com.example.springProject.repository;

import com.example.springProject.entity.BoardEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
    // 특정 회원이 작성한 모든 게시글 조회
    List<BoardEntity> findByMemberEntity_MemberId(Long id);
}

4. 서비스(Service) 코드

서비스 계층에서는 BoardRepository를 이용해 특정 회원의 게시글을 가져올 수 있습니다.

@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;

    public List<BoardEntity> getBoardsByMemberId(Long memberId) {
        return boardRepository.findByMemberEntity_MemberId(memberId);
    }
}

5. 컨트롤러(Controller) 코드

컨트롤러에서는 특정 회원이 작성한 게시글 목록을 조회할 수 있도록 API를 제공합니다.

@RestController
@RequiredArgsConstructor
@RequestMapping("/boards")
public class BoardController {
    private final BoardService boardService;

    // 특정 회원의 게시글 조회 API
    @GetMapping("/member/{memberId}")
    public List<BoardEntity> getBoardsByMember(@PathVariable Long memberId) {
        return boardService.getBoardsByMemberId(memberId);
    }
}

6. 실행 예시 (API 호출)

📌 API 요청

GET /boards/member/1

📌 API 응답 (JSON)

[
    {
        "id": 1,
        "boardWriter": "user1",
        "boardTitle": "Spring Boot JPA",
        "boardContents": "JPA FK 조회 방법 정리",
        "boardHits": 10
    },
    {
        "id": 2,
        "boardWriter": "user1",
        "boardTitle": "Spring Boot Rest API",
        "boardContents": "API 문서화 방법",
        "boardHits": 25
    }
]

7. 정리

✅ JPA에서 외래키(FK) 값을 기준으로 조회할 때findBy{관계 엔티티명}_{엔티티의 PK 필드명} 형식을 사용해야 합니다.
@ManyToOne(fetch = FetchType.LAZY) 관계에서 FK를 이용한 조회를 수행할 수 있습니다.
List<BoardEntity> findByMemberEntity_MemberId(Long id); 방식으로 특정 회원이 작성한 게시글을 쉽게 조회할 수 있습니다.


profile
멋있는 사람 - 일단 하자

0개의 댓글