Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

24-25-Server-Assignment-04_채경완 #9

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

wandk2
Copy link

@wandk2 wandk2 commented Nov 2, 2024

Description

학생 CRUD 기능:학생 정보를 생성, 조회 , 수정, 삭제하는 기능
강의 CRUD 기능: 강의 정보를 생성, 조회 , 수정, 삭제하는 기능
수강신청 기능: 학생이 강의를 수강신청하고, 해당 수강신청을 조회 및 취소하는 기능

Question

Reference

스터디세션 코어님 자료
https://velog.io/@dongkyun0713/GDGoC-JPA%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-CRUD-%EB%A7%8C%EB%93%A4%EA%B8%B0
즉시로딩과 지연로딩
https://velog.io/@yuseogi0218/JPA-%EC%A6%89%EC%8B%9C%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%A7%80%EC%97%B0%EB%A1%9C%EB%94%A9-FetchType.EAGER-or-LAZY
세은님 코드 ,지후님 코드
JPA 일대다, 다대일 정리 벨로그

Copy link

@kjoon418 kjoon418 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어려운 과제였을텐데 완성하시느라 수고 많았습니다~
댓글을 남겼으니 확인해 보세요.
또한 제가 언급하지 않은 개행 실수도 있으니 잘 찾아보며 리펙토링하면 좋을 것 같아요~

Comment on lines +17 to +21
@PostMapping("/student/{studentId}/lecture/{lectureId}")
public ResponseEntity<Void> CourseRegistration(@PathVariable Long studentId, @PathVariable Long lectureId) {
courseRegistrationService.CourseRegistration(studentId, lectureId);
return new ResponseEntity<>(HttpStatus.OK);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드 이름에 대문자를 사용한 이유가 있나요?

Comment on lines +23 to +26
@GetMapping("/{lectureId}")
public ResponseEntity<LectureInfoResponseDto> findByLectureId(@PathVariable(name = "lecturId") Long lectureId) {
return new ResponseEntity<>(lectureService.findByLectureId(lectureId), HttpStatus.OK);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모든 컨트롤러의 반환 타입으로 ResponseEntity를 사용하고 계시네요.
ResponseEntity를 사용했을 때의 장점은 무엇이고, ResponseEntity 대신 직접 객체를 반환하려면 어떻게 해야 하는지도 참고로 알아두시면 후에 도움이 될 것 같아요~

ResponseEntity를 사용한 것이 부적절하다는 의미는 아닙니다!

Comment on lines +7 to +10
@Entity
@Getter
@NoArgsConstructor
public class CourseRegistration {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

도메인 작명과 관련해서 아래 리뷰를 참고해 보세요~
#1 (comment)

Comment on lines +23 to +33
public static CourseRegistration of(Student student, Lecture lecture) {
CourseRegistration courseRegistration = new CourseRegistration();
courseRegistration.student = student;
courseRegistration.lecture = lecture;
return courseRegistration;
}

public CourseRegistration(Student student, Lecture lecture) {
this.student = student;
this.lecture = lecture;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생성자와 정적 팩터리 메서드를 같이 사용한 이유가 있나요?
이유가 있다면 댓글로 알려주시고, 만약 없다면 정적 팩터리 메서드를 사용하는 이유에 대해 찾아보면 좋을 것 같아요~

Comment on lines +31 to +43
@Builder
public Lecture(String title, String professor, String slot, String location) {
this.title = title;
this.professor = professor;
this.slot = slot;
this.location = location;
}
public void update(String title, String professor, String slot, String location){
this.title = title;
this.professor = professor;
this.slot = slot;
this.location = location;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드 사이 개행!

Comment on lines +27 to +38
@Builder
public Student( String name , Long studentNumber ) {
this.name = name;
this.studentNumber = studentNumber;

}

public void update(String name, Long studentNumber){
this.name = name;
this.studentNumber = studentNumber;

}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드에 불필요한 공백이 있는 것 같아요~

Comment on lines +27 to +40
@Transactional
public void CourseRegistration(Long studentId, Long lectureId) {
if (courseRegistrationRepository.existsByStudentIdAndLectureId(studentId, lectureId)) {
throw new IllegalArgumentException("이미 수강 신청한 강의입니다.");
}

Student student = studentRepository.findById(studentId)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 학생입니다."));
Lecture lecture = lectureRepository.findById(lectureId)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 강의입니다."));

CourseRegistration courseRegistration = CourseRegistration.of(student, lecture);
courseRegistrationRepository.save(courseRegistration);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드 이름에 대문자를 사용한 이유가 있나요?
또한, 이후 유지보수를 위해 어떤 상황에 예외를 발생시키는지 문서화하는 방법도 공부해보면 좋을 것 같아요~

Comment on lines +32 to +38
@Transactional(readOnly = true)
public LectureInfoResponseDto findByLectureId(Long lectureId) {
Lecture lecture = lectureRepository.findById(lectureId)
.orElseThrow(()-> new IllegalArgumentException("존재하지 않는 강의입니다."));

return LectureInfoResponseDto.from(lecture);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

readOnly 옵션을 사용하면 읽기 전용 트랜잭션을 생성하게 됩니다.
JPA를 사용할 경우 readOnly 옵션을 적절히 사용할 경우 성능을 최적화할 수 있어요.
어떤 원리로 성능 최적화가 이루어지는 걸까요? 공부해보면 JPA를 보다 깊이 있게 이해하는데 도움이 될 것 같아요~

@dongkyun0713
Copy link
Collaborator

현재 충돌 나서 머지가 안 되네요~ 해결 부탁드립니다~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants