@RestController
public class StudentRestController {
private final StudentService studentService;
public StudentRestController(StudentService studentService) {
this.studentService = studentService;
}
//회원가입
@PostMapping("/members/signup")
public SignUpResponse create(@RequestBody SignUpRequest sign){
return studentService.save(sign);
}
@DeleteMapping("/members/{memberId}")
public void delete(@PathVariable Long memberId){
studentService.delete(memberId);
}
service 부분도 강의 api와 비슷하게 작성했다.
public SignUpResponse save(SignUpRequest sign) {
Student student = studentRepository.save(new Student(
sign.nickName(),
sign.email()
));
return new SignUpResponse(
student.getId(),
student.getNickName(),
student.getEmail());
}
public void delete(Long memberId) {
Student student = studentRepository.findById(memberId)
.orElseThrow(() -> new NoSuchElementException("등록된 Id가 없습니다."));
studentRepository.delete(student);
}
삭제도 delete방식을 사용해서 일단, hard delete방식으로 데이터베이스까지 삭제하기로 했다.
수강신청은 어디에 속할까? student? lecture?
처음에 나는 수강신청은 강의와 학생의 N:M 관계에 속한다고 생각했다.
따라서 나는 학생이 강의를 신청하는거니까 학생 controller에 들어가도 된다고 생각했다. 하지만!
도메인을 구분하는 방법
기능따라 구분한다.
같이 수정되는지, 같이 만들어지는지를 보고 판단해야한다.ex)
- 학생에 속한다면?
학생을 만들 때 수강신청도 만들어지는가? ❌
학생 수정할 때 수강신청도 수정되는가? ❌- 강의에 속한다면?
강의 만들 때 수강신청도 만들어지는가? ❌
강의 수정할 때 수강신청도 수정되는가?❌둘다 아님!!!!!
그렇다는 말은, 도메인을 따로 만들어야 된다는 것.
//수강신청
@PostMapping("/lectureEnrollments")
public LectureEnrollmentResponse select(@RequestBody LectureEnrollmentRequest request){
return lectureEnrollmentService.select(request);
}
@Transactional
public LectureEnrollmentResponse select(LectureEnrollmentRequest request) {
Lecture lecture = lectureRepository.findByIdAndDeletedFalse(request.lectureId())
.orElseThrow(() -> new NoSuchElementException("찾는 강의가 없습니다."));
Student student = studentRepository.findByIdAndDeletedFalse(request.studentId())
.orElseThrow(() -> new NoSuchElementException("존재하지 않는 회원입니다."));
LectureEnrollment lectureEnrollment = new LectureEnrollment();
lectureEnrollment.setLecture(lecture);
lectureEnrollment.setStudent(student);
lecture.countStudent();
LectureEnrollment savedStudentLecture = lectureEnrollmentRepository.save(lectureEnrollment);
return new LectureEnrollmentResponse(
savedStudentLecture.getId(),
savedStudentLecture.getLecture().getId(),
savedStudentLecture.getStudent().getId(),
savedStudentLecture.getEnrollmentTime());
}
강의와, 학생이 있는지 확인하고, lecture에 추가해줬다. 근데 지금 보니까, set아니고 add라는 함수를 만들어서 관리해도 될 것 같다.(OOP적인 사고!)