-
Notifications
You must be signed in to change notification settings - Fork 15
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
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어려운 과제였을텐데 완성하시느라 수고 많았습니다~
댓글을 남겼으니 확인해 보세요.
또한 제가 언급하지 않은 개행 실수도 있으니 잘 찾아보며 리펙토링하면 좋을 것 같아요~
@PostMapping("/student/{studentId}/lecture/{lectureId}") | ||
public ResponseEntity<Void> CourseRegistration(@PathVariable Long studentId, @PathVariable Long lectureId) { | ||
courseRegistrationService.CourseRegistration(studentId, lectureId); | ||
return new ResponseEntity<>(HttpStatus.OK); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메서드 이름에 대문자를 사용한 이유가 있나요?
@GetMapping("/{lectureId}") | ||
public ResponseEntity<LectureInfoResponseDto> findByLectureId(@PathVariable(name = "lecturId") Long lectureId) { | ||
return new ResponseEntity<>(lectureService.findByLectureId(lectureId), HttpStatus.OK); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
모든 컨트롤러의 반환 타입으로 ResponseEntity
를 사용하고 계시네요.
ResponseEntity
를 사용했을 때의 장점은 무엇이고, ResponseEntity
대신 직접 객체를 반환하려면 어떻게 해야 하는지도 참고로 알아두시면 후에 도움이 될 것 같아요~
ResponseEntity
를 사용한 것이 부적절하다는 의미는 아닙니다!
@Entity | ||
@Getter | ||
@NoArgsConstructor | ||
public class CourseRegistration { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
도메인 작명과 관련해서 아래 리뷰를 참고해 보세요~
#1 (comment)
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; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
생성자와 정적 팩터리 메서드를 같이 사용한 이유가 있나요?
이유가 있다면 댓글로 알려주시고, 만약 없다면 정적 팩터리 메서드를 사용하는 이유에 대해 찾아보면 좋을 것 같아요~
@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; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메서드 사이 개행!
@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; | ||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메서드에 불필요한 공백이 있는 것 같아요~
@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); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메서드 이름에 대문자를 사용한 이유가 있나요?
또한, 이후 유지보수를 위해 어떤 상황에 예외를 발생시키는지 문서화하는 방법도 공부해보면 좋을 것 같아요~
@Transactional(readOnly = true) | ||
public LectureInfoResponseDto findByLectureId(Long lectureId) { | ||
Lecture lecture = lectureRepository.findById(lectureId) | ||
.orElseThrow(()-> new IllegalArgumentException("존재하지 않는 강의입니다.")); | ||
|
||
return LectureInfoResponseDto.from(lecture); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
readOnly
옵션을 사용하면 읽기 전용 트랜잭션을 생성하게 됩니다.
JPA
를 사용할 경우 readOnly
옵션을 적절히 사용할 경우 성능을 최적화할 수 있어요.
어떤 원리로 성능 최적화가 이루어지는 걸까요? 공부해보면 JPA
를 보다 깊이 있게 이해하는데 도움이 될 것 같아요~
현재 충돌 나서 머지가 안 되네요~ 해결 부탁드립니다~ |
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 일대다, 다대일 정리 벨로그