[Spring] 인터넷 강의 클론 3 - 회원 API 구현

춤인형의 개발일지·2025년 2월 20일

Spring실습

목록 보기
30/40

회원 controller

@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방식으로 데이터베이스까지 삭제하기로 했다.


수강신청 controller

수강신청은 어디에 속할까? 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적인 사고!)


OOP


0개의 댓글