백/spring boot

findBy~ & .equals,== 차이

남승현 2024. 6. 18. 16:34

TIP)

엔티티의 필드에 접근할 때 필드가 private임으로 직접 접근이 불가. Getter, Setter를 이용해 접근하기

인스턴스를 생성하지 않고 클래스 이름으로 직접 호출하고 싶다면 static으로 선언

https://velog.io/@gkrry2723/Spring-Boot-Response-Entity-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-%EA%B2%B0%EA%B3%BC%EA%B0%92-return-%ED%95%B4%EC%A3%BC%EA%B8%B0

 

[Spring Boot] Response Entity 사용해서 결과값 return 해주기

Spring Boot에서 값을 return해줄 때 ResponseEntity를 활용하는데, 이에 대해 조금 더 자세하게 공부하고, 더 편하게 사용하기 위해 공부해보았다.Response Entity는 HttpEntity를 상속받아 구현한 클래스이다.Ht

velog.io

 


findBy외래키로 repository에서 조회하기

-> 특정 study id로 post를 찾는 경우

 

entity의 필드명으로만 조회를 할 수 있고 이렇게 조회하는 경우가 많다. 하지만 FK로 조회를 하고 싶다면?!

<post>

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name="type", nullable=false)
    private String type;

    @Column(name="description", nullable=false)
    private String description;

    @Column(name="title")
    private String title;

    @Column(name="due_date")
    private LocalDate dueDate;

    @CreationTimestamp
    @Column(updatable=false)
    private LocalDateTime created_at;

    @UpdateTimestamp
    @Column(insertable = false)
    private LocalDateTime updated_at;

    @ManyToOne
    @JoinColumn(name="study_id")
    private Study study;
    }

<study>

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
@Entity
public class Study {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name="category",nullable=false)
    private String category;

    @Column(name="place")
    private String place;

    @Column(name = "member_num")
    private Long member_num;

    @Column(name="status")
    private Boolean status;

    @Column(name = "start_date")
    private LocalDate startDate;

    @Column(name = "end_date")
    private LocalDate endDate;

    @Column(name="score")
    private Long score;

    @Column(name="leader_id", nullable=false)
    private Long leader_id;

}

 

findBy + {FK를 관리하는 엔티티의 필드명(첫글자를 대문자로)} + _ + {FK엔티티의 PK필드명(첫글자를 대문자로)}

 

public interface PostRepository extends JpaRepository<Post, Long> {

    List<Post> findByStudy_Id(Long study_id);
}

 


 

findBy여러개 조건 검색

주차별 스터디 관리 API를 만드는중!

특정 스터디의 특정 주차에 이미 한번 출석, 지각 관련해서 입력 후 점수를 받았으면 이 주차에 대해서 더이상 등록이 안되게끔 해야 한다.

이 기능을 구현하기 위해 특정 study id와 week(주차)의 manage가 있는지 manageRepository에서 찾고, 있다면 exception을 반환 해야한다.

-> study id와 week, 즉 여러 조건으로 검색하려면 AND/OR로 연결해주면 된다

나는 특정 study id와 특정 week를 가진 manage가 있나 찾고싶은 것이므로 AND 사용!


문자열 비교( .equals(), == ) 의 차이

1) == : 객체의 "주소"를 비교하여 일치하는지 확인

2) .equals() : 객체의 "내용"을 비교하여 같은지 확인

 

 스터디 관리 페이지에서 캘린더에서 특정 날짜를 클릭하면 해당 날짜에 기록된 일정을 보여주는 api를 만들던 중 

-> 아무리 조회해도 빈 리스트가 자꾸 반환됐었음!

public List<PostDto> showDatePost(Long studyId, LocalDate date) {
    List<Post> studyPost=postRepository.findByStudy_Id(studyId);
    List<PostDto> datePostList=new ArrayList<>();
    for(Post post:studyPost){
        if(post.getDueDate()==date){
            datePostList.add(PostDto.createPostDto(post));
        }
    }
    return datePostList;
}

 

찾아보니 '=='는 객체의 주소를 비교하여 일치하는지 확인하기에 같은 날짜라도, LocalDate 인스턴스가 다르면 다르다고 판단되어 그랬던 것!

따라서 같은 날짜인지, 즉 같은 내용인지 내용자체를 비교하고 싶으면 .equals()를 이용하기!

public List<PostDto> showDatePost(Long studyId, LocalDate date) {
        List<Post> studyPost=postRepository.findByStudy_Id(studyId);
        List<PostDto> datePostList=new ArrayList<>();
        for(Post post:studyPost){
            if(date.equals(post.getDueDate())){
                datePostList.add(PostDto.createPostDto(post));
            }
        }
        return datePostList;
    }