findBy~ & .equals,== 차이
TIP)
엔티티의 필드에 접근할 때 필드가 private임으로 직접 접근이 불가. Getter, Setter를 이용해 접근하기
인스턴스를 생성하지 않고 클래스 이름으로 직접 호출하고 싶다면 static으로 선언
[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;
}