목록프로그래밍/JPA (26)
쌓고 쌓다
최종 목표는 다음과 같은 API 응답을 만들어내는 것이다. 게시글과 태그 기능을 만들고자 한다.게시글과 태그는 N:M 관계이지만중간에 poster_tag라는 테이블을 만들어1:N과 M:1 관계로 풀어서 다음과 같은 관계를 갖는 테이블을 만들어서 관리하고자 한다. poster과 poster_tag는 1:N 관계이다.poster_tag과 tag는 M:1 관계이다. 먼저 복합키 연관관계를 매핑해보자.복합키 연관관계 매핑복합키 : 두개 이상의 컬럼을 묶어 기본 키로 사용하는 것이다. 다음과 같은 테이블을 JPA로 복합키를 설정해보자!+---------------------+ +---------------------+ +---------------------+| poster ..
테스트 코드를 작성하며 Getter를 이용해 .get 메서드를 통해 개수나 엔티티를 조회할때@OneToMany, @ManyToOne과 같은 연관 관계를 맺은 엔티티를 조회하고자할때조회가 되지 않는 경우를 자주 겪었었다. 아마 이 글을 검색해서 들어온 여러분들도...테스트 코드에서 왜 연관 관계 매핑을 제대로 했는데 원하는대로 테스트를 통과하지 못할까싶어서 들어왔을 것 같다. 간단하게 이해를 돕기위해 다음과 같은 예시 테스트 코드를 작성했다.한번 읽어보자! 상황 파악!member(회원)을 저장하고member(회원)이 poster(게시글)를 작성한 상황이다.이때 회원이 작성한 게시글의 개수를 조회하고자 한다.@Test@DisplayName("예시")void test1() { // 회원 저장 Mem..
댓글과 댓글 좋아요가 1:N으로 관계를 맺고 있는 상태이다. 즉, 댓글 좋아요에서 댓글PK를 외래키로 갖고 있다. Comment @Entity @Data public class Comment { ... @OneToMany(mappedBy = "comment", cascade = CascadeType.REMOVE) private List commentLikes = new ArrayList(); } CommentLike @Entity @Data public class CommentLike { ... @ManyToOne @JoinColumn(name = "comment_id") private Comment comment; } 실행한 테스트 코드는 다음과 같다. @Test @DisplayName("댓글 삭제")..
테스트 코드를 작성하는중에 문제가 발생했다. 먼저, 장소와 게시글의 관계는 1:N 관계이다. 다음의 테스트 코드를 보자. Location location = new Location(); location.setTitle("테스트 장소"); locationRepository.save(location); Poster poster = new Poster(); poster.setTitle("게시글1"); poster.setLocation(location); posterRepository.save(poster); Poster poster2 = new Poster(); poster2.setTitle("게시글1"); poster2.setLocation(location); posterRepository.save(post..
테스트 코드를 작성하던 중 NPE가 발생했다. List locationImages = location.getLocationImages(); for (LocationImage locationImage : locationImages) { imageStore.deleteLocationImage(locationImage); } get 메서드를 호출하여 반환받은 List를 탐색하는 코드이다. 여기서 반환 받은 컬렉션이 NULL이라면 난 NPE가 발생하지 않고 반복문만 돌지 않을거라 생각했었다. List를 탐색하는 로직이 존재할 수 있으니 엔티티의 List와 같은 컬렉션 필드는 new로 컬렉션을 초기화해주는 것이 좋다. 그리고 컬렉션을 초기화해주면 좋은 이유가 한가지 더 있다. 나중에 임의로 개발자가 초기화하게 된..
문제가 발생한 상황은 다음과 같다. 회원은 프로필 이미지를 하나만 가질 수 있는 상황이다. Member @Entity @Data public class Member { ... @OneToOne(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private MemberImage memberImg; ... } MemberImage @Entity @Data @NoArgsConstructor public class MemberImage { ... @OneToOne @JoinColumn(name = "member_id") private Member member; } @OneToOne으로 회원과 프로필 이미지는 하나만 가지도록 했다..
서버에 위도 경도를 쿼리 파라미터로 요청하면 요청한 위도 경도를 통해 특정 범위내에 속하는 데이터를 응답으로 보내는 로직이 필요했다! 어떻게 할까? 먼저 location 테이블은 다음과 같이 생겼다. CREATE TABLE location ( id BIGINT AUTO_INCREMENT PRIMARY KEY, latitude DOUBLE, longitude DOUBLE, title VARCHAR(255), address VARCHAR(255), description TEXT ) 위도 경도가 DOUBLE 타입이다. LocationRepository @Repository public interface LocationRepository extends JpaRepository { List findByLatitu..
게시글을 통해 해당 게시글의 댓글들을 모두 가져오는 코드가 필요했다. findAllByBoard 과 findByBoard를 쓸 수 있는데 findByBoard의 결과가 둘 이상이면 어떻게 반환하는지 궁금했고. 반환값을 List가 아닌 Comment로 단일 결과를 반환하도록 했지만 findBy 결과가 여러건인 경우 어떻게 되는지 궁금증이 발생했다. @Repository public interface CommentRepository extends JpaRepository { List findAllByBoard(Board board); List findByBoard(Board board); } 먼저 반환값을 List로하고 findAllBy와 findBy의 차이점을 보자. 결과는 동일하다. 즉, findBy와 ..