diff --git a/src/main/java/org/groomUniv/meet/MeetApplication.java b/src/main/java/org/groomUniv/meet/MeetApplication.java index 6edc886..6b036fe 100644 --- a/src/main/java/org/groomUniv/meet/MeetApplication.java +++ b/src/main/java/org/groomUniv/meet/MeetApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing // JPA Auditing 사용을 위한 설정 public class MeetApplication { public static void main(String[] args) { diff --git a/src/main/java/org/groomUniv/meet/blinddate/entity/BlindDate.java b/src/main/java/org/groomUniv/meet/blinddate/entity/BlindDate.java new file mode 100644 index 0000000..74377fa --- /dev/null +++ b/src/main/java/org/groomUniv/meet/blinddate/entity/BlindDate.java @@ -0,0 +1,48 @@ +package org.groomUniv.meet.blinddate.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.groomUniv.meet.common.entity.BaseEntity; +import org.groomUniv.meet.oauth.entity.Member; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +@Entity +@NoArgsConstructor +@Table(name = "blind_date") + + +public class BlindDate extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long blindDateId; + + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member1_id") + private Member member1; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member2_id") + private Member member2; + + // 채팅제한 + private Long chatLimit; + + //챗 엔티티 리스트로 관리하기 + @OneToMany(mappedBy = "blindDate", cascade = CascadeType.ALL) + private List chats = new ArrayList<>(); +} +// JPA Auditing 설명 +//@CreatedDate: 엔터티가 처음 생성된 날짜를 자동으로 기록합니다. +// +//@LastModifiedDate: 엔터티가 마지막으로 수정된 날짜를 자동으로 기록합니다. +// +//@CreatedBy: 엔터티를 처음 생성한 사용자를 자동으로 기록합니다. +// +//@LastModifiedBy: 엔터티를 마지막으로 수정한 사용자를 자동으로 기록합니다. \ No newline at end of file diff --git a/src/main/java/org/groomUniv/meet/blinddate/entity/BlindDateChat.java b/src/main/java/org/groomUniv/meet/blinddate/entity/BlindDateChat.java new file mode 100644 index 0000000..37111e0 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/blinddate/entity/BlindDateChat.java @@ -0,0 +1,31 @@ +package org.groomUniv.meet.blinddate.entity; + + +import jakarta.persistence.*; +import lombok.Data; +import org.groomUniv.meet.common.entity.BaseEntity; +import org.groomUniv.meet.oauth.entity.Member; +import org.springframework.data.annotation.CreatedDate; + +import java.time.LocalDateTime; + + +@Entity +public class BlindDateChat extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long blindDataChatId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "blind_date_id") + private BlindDate blindDate; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member sender; + + private String message; + + private Boolean readStatus; +} diff --git a/src/main/java/org/groomUniv/meet/blinddate/repository/BlindDateChatRepository.java b/src/main/java/org/groomUniv/meet/blinddate/repository/BlindDateChatRepository.java new file mode 100644 index 0000000..23f9679 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/blinddate/repository/BlindDateChatRepository.java @@ -0,0 +1,22 @@ +package org.groomUniv.meet.blinddate.repository; + +import org.groomUniv.meet.blinddate.entity.BlindDate; +import org.groomUniv.meet.blinddate.entity.BlindDateChat; +import org.groomUniv.meet.oauth.entity.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface BlindDateChatRepository extends JpaRepository { + + // 채팅 ID로 채팅 검색 + Optional findById(Long blindDataChatId); + + // 특정 블라인드 채팅에 속한 모든 채팅 시간순으로 + List findAllByBlindDateOrderByTimestampAsc(BlindDate blindDate); + // 읽지 않은 메세지들 가져오기 + List findAllByBlindDateAndReadStatusFalse(BlindDate blindDate); + // 특정 sender 기반으로 조회하기 + List findAllBySender(Member sender); +} diff --git a/src/main/java/org/groomUniv/meet/blinddate/repository/BlindDateRepository.java b/src/main/java/org/groomUniv/meet/blinddate/repository/BlindDateRepository.java new file mode 100644 index 0000000..e7eab9c --- /dev/null +++ b/src/main/java/org/groomUniv/meet/blinddate/repository/BlindDateRepository.java @@ -0,0 +1,20 @@ +package org.groomUniv.meet.blinddate.repository; + +import org.groomUniv.meet.blinddate.entity.BlindDate; +import org.groomUniv.meet.blinddate.entity.BlindDateChat; +import org.groomUniv.meet.oauth.entity.Member; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; + +public interface BlindDateRepository extends JpaRepository { + // 특정 두 멤버 기반의 챗 가져오기 + Optional findByMember1AndMember2(Member member1, Member member2); + // 특정 멤버중 하나만 있어도 가져오는 함수 + @Query("SELECT b FROM BlindDate b WHERE b.member1 = :member OR b.member2 = :member") + List findAllByMember(@Param("member") Member member); + +} diff --git a/src/main/java/org/groomUniv/meet/common/config/JpaAuditingConfig.java b/src/main/java/org/groomUniv/meet/common/config/JpaAuditingConfig.java new file mode 100644 index 0000000..39b6b1d --- /dev/null +++ b/src/main/java/org/groomUniv/meet/common/config/JpaAuditingConfig.java @@ -0,0 +1,24 @@ +package org.groomUniv.meet.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.AuditorAware; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +import java.util.Optional; + +@Configuration +@EnableJpaAuditing +// Spring이 CreatedBy에서 어떤 사용자를 넣을지 모르기 때문에 그걸 이 부분을 통해 찾아주려고 적는 Config 파일 +public class JpaAuditingConfig { + + @Bean + public AuditorAware auditorProvider() { + // 실제 사용자 인증이 있는 경우엔 SecurityContext에서 꺼내서 여기 부분 변경해야함 basic으로 쓰면 안됨. + return () -> Optional.of("basic"); // 기본값 + } +} +// Spring Security 사용할 때의 SecurityContextHolder 사용법 +// return () -> Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()) +// .filter(Authentication::isAuthenticated) +// .map(Authentication::getName); \ No newline at end of file diff --git a/src/main/java/org/groomUniv/meet/common/entity/BaseEntity.java b/src/main/java/org/groomUniv/meet/common/entity/BaseEntity.java new file mode 100644 index 0000000..536ba3d --- /dev/null +++ b/src/main/java/org/groomUniv/meet/common/entity/BaseEntity.java @@ -0,0 +1,29 @@ +package org.groomUniv.meet.common.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) // JPA Auditing 활성화 +// 생성일자, 수정일자, 시간 관리에 대한 것은 공통적인 부분이라 BaseEntity를 통해 관리하고 상속받아서 사용하기 위한 용도 +public class BaseEntity { + // create 날짜 언제인지 + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdAt; + + // 누가 create 했는지 + @CreatedBy + @Column(updatable = false) + private String createdBy; + + + +} diff --git a/src/main/java/org/groomUniv/meet/meeting/entity/Meeting.java b/src/main/java/org/groomUniv/meet/meeting/entity/Meeting.java new file mode 100644 index 0000000..88ba2c6 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/meeting/entity/Meeting.java @@ -0,0 +1,32 @@ +package org.groomUniv.meet.meeting.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.groomUniv.meet.blinddate.entity.BlindDateChat; +import org.groomUniv.meet.common.entity.BaseEntity; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +@Entity + +@NoArgsConstructor + +public class Meeting extends BaseEntity { + +@Id +@GeneratedValue(strategy = GenerationType.IDENTITY) +private Long meetingId; + + +private String meetingDetails; + + +@OneToMany(mappedBy = "meeting", cascade = CascadeType.ALL) +private List chats = new ArrayList<>(); +} + diff --git a/src/main/java/org/groomUniv/meet/meeting/entity/MeetingChat.java b/src/main/java/org/groomUniv/meet/meeting/entity/MeetingChat.java new file mode 100644 index 0000000..09c06dc --- /dev/null +++ b/src/main/java/org/groomUniv/meet/meeting/entity/MeetingChat.java @@ -0,0 +1,36 @@ +package org.groomUniv.meet.meeting.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.groomUniv.meet.common.entity.BaseEntity; +import org.groomUniv.meet.oauth.entity.Member; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; +import java.util.Date; + +@Entity +@NoArgsConstructor +public class MeetingChat extends BaseEntity { + + @Id + @GeneratedValue + private Long meetingChatId; + + private String message; + + private String senderId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "meeting_id") + private Meeting meeting; + +} +// 생성 가이드라인 +//MeetingChat chat = new MeetingChat(); +//chat.setMeeting(meeting); // 여기서 meeting은 기존에 조회한 Meeting 객체 +//chat.setSenderId(1L); +//chat.setMessage("안녕하세요!"); +//chat.setTimestamp(LocalDateTime.now()); diff --git a/src/main/java/org/groomUniv/meet/meeting/repository/MeetingChatRepository.java b/src/main/java/org/groomUniv/meet/meeting/repository/MeetingChatRepository.java new file mode 100644 index 0000000..c3ae008 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/meeting/repository/MeetingChatRepository.java @@ -0,0 +1,11 @@ +package org.groomUniv.meet.meeting.repository; + +import org.groomUniv.meet.meeting.entity.MeetingChat; +import org.groomUniv.meet.payment.entity.Payment; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface MeetingChatRepository extends JpaRepository { + Optional findById(Long meetingChatId); +} diff --git a/src/main/java/org/groomUniv/meet/meeting/repository/MeetingRepository.java b/src/main/java/org/groomUniv/meet/meeting/repository/MeetingRepository.java new file mode 100644 index 0000000..cbb338d --- /dev/null +++ b/src/main/java/org/groomUniv/meet/meeting/repository/MeetingRepository.java @@ -0,0 +1,17 @@ +package org.groomUniv.meet.meeting.repository; + +import org.groomUniv.meet.meeting.entity.Meeting; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface MeetingRepository extends JpaRepository { + + //미팅 Id 기반으로 검색 + Optional findById(Long meetingId); + // 생성한 사람 기반으로 검색 + List findAllByCreatedBy(String createdBy); + // 미팅 내용으로 검색 , 키워드 기반 욕, 문제되는 발언 필터링 + List findByMeetingDetailsContaining(String keyword); +} diff --git a/src/main/java/org/groomUniv/meet/oauth/entity/Member.java b/src/main/java/org/groomUniv/meet/oauth/entity/Member.java new file mode 100644 index 0000000..e9f0682 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/entity/Member.java @@ -0,0 +1,41 @@ +package org.groomUniv.meet.oauth.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Entity +@Getter +@Table(name = "member") +public class Member { + +@Id +@GeneratedValue(strategy = GenerationType.IDENTITY) +private Long memberId; + +@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) +@JoinColumn(name = "preference_id") +private MemberPreference memberPreference; + + +@ManyToOne(fetch = FetchType.LAZY) +@JoinColumn(name = "school_id") +private School school; + + +private String email; +// password는 security로 암홓화해야함 +private String password; + +private String name; +private String image; + +private Long height; +private Long age; +private String biography; +private String major; + +private boolean emailVerified; +} diff --git a/src/main/java/org/groomUniv/meet/oauth/entity/MemberPreference.java b/src/main/java/org/groomUniv/meet/oauth/entity/MemberPreference.java new file mode 100644 index 0000000..203e28e --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/entity/MemberPreference.java @@ -0,0 +1,34 @@ +package org.groomUniv.meet.oauth.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import org.groomUniv.meet.oauth.enums.*; + +@Getter +@Entity +public class MemberPreference { +@Id +@GeneratedValue(strategy = GenerationType.IDENTITY) +private Long preference_id; + +@OneToOne(mappedBy = "memberPreference", fetch = FetchType.LAZY) +private Member member; + +private Long desired_age_min; +private Long desired_age_max; +private Long desired_height_min; +private Long desired_height_max; +private String desired_school; +private String desired_major; +private String additional_criteria; + +// enum타입으로 받아야할 것들 +private BodyType bodyType; +private Drinking drinking; +private Hobby hobby; +private Mbti mbti; +private Religion religion; +private Smoke smoke; +private Style style; +} diff --git a/src/main/java/org/groomUniv/meet/oauth/entity/Report.java b/src/main/java/org/groomUniv/meet/oauth/entity/Report.java new file mode 100644 index 0000000..9401d11 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/entity/Report.java @@ -0,0 +1,30 @@ +package org.groomUniv.meet.oauth.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor +public class Report { +@Id +@GeneratedValue(strategy = GenerationType.IDENTITY) +private Long reportId; + +private String reportReason; +@CreatedDate +private LocalDateTime createdAt; + +private boolean rewardFlag; +private String reporterId; +private String reportedMemberId; + +} diff --git a/src/main/java/org/groomUniv/meet/oauth/entity/School.java b/src/main/java/org/groomUniv/meet/oauth/entity/School.java new file mode 100644 index 0000000..8540f0c --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/entity/School.java @@ -0,0 +1,24 @@ +package org.groomUniv.meet.oauth.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +@NoArgsConstructor +@Entity +@Getter +@Table(name = "school") +public class School { +@Id@GeneratedValue(strategy = GenerationType.IDENTITY) + private Long school_id; +// 학교이름 +private String name; +// 학과 +private String domain; + + @OneToMany(mappedBy = "school", fetch = FetchType.LAZY) + private List members = new ArrayList<>(); +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/BodyType.java b/src/main/java/org/groomUniv/meet/oauth/enums/BodyType.java new file mode 100644 index 0000000..54c0310 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/BodyType.java @@ -0,0 +1,11 @@ +package org.groomUniv.meet.oauth.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum BodyType { + THIN("마름"),NORMAL("보통"),FAT("통통"),MUSCLE("근육질"); + + private final String description; + +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/Drinking.java b/src/main/java/org/groomUniv/meet/oauth/enums/Drinking.java new file mode 100644 index 0000000..8aeb34f --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/Drinking.java @@ -0,0 +1,9 @@ +package org.groomUniv.meet.oauth.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum Drinking { +NEVER("안함"),SOMETIMES("가끔 마심"),OFTEN("자주"); +private final String description; +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/Hobby.java b/src/main/java/org/groomUniv/meet/oauth/enums/Hobby.java new file mode 100644 index 0000000..13c8cac --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/Hobby.java @@ -0,0 +1,11 @@ +package org.groomUniv.meet.oauth.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum Hobby { + +EXCERCISE("운동"), LISTENMUSIC("음악 듣기"),READBOOK("독서"), GAME("게임"), COOK("요리") + ,TRIP("여행"), DRAWING("그림"), TAKEPICTURE("사진찍기"); +private final String description; +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/Mbti.java b/src/main/java/org/groomUniv/meet/oauth/enums/Mbti.java new file mode 100644 index 0000000..02cf300 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/Mbti.java @@ -0,0 +1,5 @@ +package org.groomUniv.meet.oauth.enums; + +public enum Mbti { + ISTJ, ISFJ, INFJ, INTJ, ISTP, ISFP, INFP, INTP, ESTP, ESFP, ENFP, ENTP, ESTJ, ESFJ, ENFJ, ENTJ +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/Religion.java b/src/main/java/org/groomUniv/meet/oauth/enums/Religion.java new file mode 100644 index 0000000..11b8511 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/Religion.java @@ -0,0 +1,14 @@ +package org.groomUniv.meet.oauth.enums; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + + +@AllArgsConstructor +public enum Religion { + + NONE("무교"),Christianity("기독교"),Catholicism("천주교"),Buddhism("불교"), OTHERS("기타"); +private final String description; + + +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/Smoke.java b/src/main/java/org/groomUniv/meet/oauth/enums/Smoke.java new file mode 100644 index 0000000..dd93b71 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/Smoke.java @@ -0,0 +1,10 @@ +package org.groomUniv.meet.oauth.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum Smoke { + +NONE("안함"), SOMETIMES("가끔"), OFTEN("자주"); +private final String description; +} diff --git a/src/main/java/org/groomUniv/meet/oauth/enums/Style.java b/src/main/java/org/groomUniv/meet/oauth/enums/Style.java new file mode 100644 index 0000000..36f50c6 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/enums/Style.java @@ -0,0 +1,10 @@ +package org.groomUniv.meet.oauth.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum Style { + +CASUAL("캐쥬얼"), STREET("스트릿"), MINIMAL("미니멀"),AMERICANCASUAL("아메카지, 아메리칸 캐쥬얼"); +private final String description; +} diff --git a/src/main/java/org/groomUniv/meet/oauth/repository/MemberRepository.java b/src/main/java/org/groomUniv/meet/oauth/repository/MemberRepository.java new file mode 100644 index 0000000..c4ad88b --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/repository/MemberRepository.java @@ -0,0 +1,23 @@ +package org.groomUniv.meet.oauth.repository; + +import org.groomUniv.meet.oauth.entity.Member; +import org.groomUniv.meet.oauth.entity.School; +import org.groomUniv.meet.payment.entity.Payment; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface MemberRepository extends JpaRepository { + +Optional findByEmail(String email); +Optional findByName(String name); +//학교별 모든 멤버 가져오는 + + Optional findAllBySchool(School school); +} +// 간단한 사용법 +//School school = schoolRepository.findByName("경희대학교").orElseThrow(); +//List members = memberRepository.findAllBySchool(school); + + diff --git a/src/main/java/org/groomUniv/meet/oauth/repository/ReportRepository.java b/src/main/java/org/groomUniv/meet/oauth/repository/ReportRepository.java new file mode 100644 index 0000000..1dd0899 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/repository/ReportRepository.java @@ -0,0 +1,18 @@ +package org.groomUniv.meet.oauth.repository; + +import org.groomUniv.meet.oauth.entity.Report; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDateTime; +import java.util.List; + +public interface ReportRepository extends JpaRepository { +// 신고자 ID로 조회 + List findAllByReporterId(String reporterId); +// 신고당한 사람의 ID로 조회 + List findAllByReportedMemberId(String reportedMemberId); +// 보상 받은 report들 혹은 못받은 report들 기준 + List findAllByRewardFlag(boolean rewardFlag); +// 특정 날짜 기준으로 그 기준 이후의 report들만 가져오기 + List findAllByCreatedAtAfter(LocalDateTime createdAt); +} diff --git a/src/main/java/org/groomUniv/meet/oauth/repository/SchoolRepository.java b/src/main/java/org/groomUniv/meet/oauth/repository/SchoolRepository.java new file mode 100644 index 0000000..d612637 --- /dev/null +++ b/src/main/java/org/groomUniv/meet/oauth/repository/SchoolRepository.java @@ -0,0 +1,11 @@ +package org.groomUniv.meet.oauth.repository; + +import org.groomUniv.meet.oauth.entity.School; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface SchoolRepository extends JpaRepository { +Optional findByName(String name); + +}