JPA에서는 findBy
를 사용하여 엔티티의 컬럼 값으로 조회할 수 있습니다.
하지만 외래키(FK) 값을 기준으로 조회하려면 어떻게 해야 할까요?
이 글에서는 JPA에서 외래키 값을 사용하여 엔티티를 조회하는 방법을 설명합니다.
우선, BoardEntity
(게시판)와 MemberEntity
(회원) 간의 관계를 설정한 엔티티를 살펴보겠습니다.
@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;
}
}
@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;
}
}
특정 회원이 작성한 모든 BoardEntity
(게시글) 데이터를 가져오려면, MemberEntity의 PK(회원 ID)를 기준으로 조회해야 합니다.
Spring Data JPA에서는 엔티티 필드명을 기준으로 findBy
메서드를 자동 생성할 수 있습니다.
List<BoardEntity> findByMemberEntity_MemberId(Long id);
findBy
+{FK를 관리하는 엔티티 필드명}
+_
+{FK를 관리하는 엔티티의 PK 필드명}
(findByMemberEntity_MemberId
)
즉, BoardEntity의 memberEntity
(참조 필드) → MemberEntity의 memberId
(PK 필드) 순으로 접근하는 것입니다.
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);
}
서비스 계층에서는 BoardRepository
를 이용해 특정 회원의 게시글을 가져올 수 있습니다.
@Service
@RequiredArgsConstructor
public class BoardService {
private final BoardRepository boardRepository;
public List<BoardEntity> getBoardsByMemberId(Long memberId) {
return boardRepository.findByMemberEntity_MemberId(memberId);
}
}
컨트롤러에서는 특정 회원이 작성한 게시글 목록을 조회할 수 있도록 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);
}
}
GET /boards/member/1
[
{
"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
}
]
✅ JPA에서 외래키(FK) 값을 기준으로 조회할 때는 findBy{관계 엔티티명}_{엔티티의 PK 필드명}
형식을 사용해야 합니다.
✅ @ManyToOne(fetch = FetchType.LAZY)
관계에서 FK를 이용한 조회를 수행할 수 있습니다.
✅ List<BoardEntity> findByMemberEntity_MemberId(Long id);
방식으로 특정 회원이 작성한 게시글을 쉽게 조회할 수 있습니다.