-
Notifications
You must be signed in to change notification settings - Fork 8
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
조은채(B) Spring JPA and H2 Datebase #6
base: main
Are you sure you want to change the base?
Conversation
whdmsco010
commented
Jul 11, 2024
- H2 Database 연결
- Student, Course, Enrollment 테이블에 컬럼 값 추가, 조회, 삭제
- 특정 학생의 수강 과목 추가, 조회, 삭제
- 오류 (조회는 잘 되지만 결과가 무한 반복됨...)
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.
고생하셨습니다! 서비스 클래스를 추가해서 비즈니스 로직과 데이터 접근 로직을 분리할 필요성은 있어보여요. 코드 리뷰를 한번 더 자세히 보면서 꼭 수정해보고 push 해보시길 바랍니다. 추후 제 이름 태그해서 리뷰 요청해주시면 마지막으로 한번 더 확인해볼게요
private StudentRepository studentRepository; | ||
|
||
@Autowired | ||
private CourseRepository courseRepository; |
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.
레포지토리를 컨트롤러 클래스에서 직접 사용하는 것보다 서비스 클래스를 두고 서비스 클래스에서 레포지토리를 사용하는 게 관심사를 명확히 할 수 있을 것 같아요
enrollment.setEnrollmentDate(enrollmentRequest.getEnrollmentDate()); | ||
|
||
// Enrollment 저장 | ||
enrollmentRepository.save(enrollment); |
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.
컨트롤러에서는 응답을 반환하는 것에만 관심사 집중을 하고, 서비스 클래스에서 해당 데이터 베이스 로직을 처리하도록 구성하면 더 좋을 것 같네요
} | ||
|
||
// DTO 클래스 정의 | ||
public static class EnrollmentRequest { |
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.
DTO를 이너 클래스로 정의하는 것보다 별도의 클래스나 레코드로 분리하는 게 좋아보여요. 자동 완성 기능이 보이지만.. DTO를 통해 request 클래스를 별로도 정의한 점은 앞으로도 계속 습관화하는게 좋아요
|
||
// 학생 추가 (POST 요청 처리) | ||
@PostMapping("/add") | ||
public String addStudent(@RequestBody Student student) { |
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.
Enrollment 컨트롤러가 아닌 부분에서는 엔티티를 바로 바디에서 바인딩 시키고 있죠? 이런 경우 API 요구사항과 틀리거나, 사용자의 무분별한 데이터가 검증 없이 들어갈 수 있을 것 같아요. 바인딩 되는 클래스는 DTO를 따로 분리하도록 하는게 좋습니다!
@GetMapping("/{id}") | ||
public Student getStudentById(@PathVariable Long id) { | ||
return studentRepository.findById(id) | ||
.orElseThrow(() -> new RuntimeException("Student not found with id: " + id)); |
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.
무한 반복이 일어난다면 양방향 관계에서 무한 참조 때문일 수 있어요. 반환할때도 전용 DTO를 사용해 필요한 값만 매핑하여 주도록하면 문제가 해결 될 수도 있을 것 같네요
private Long courseId; | ||
|
||
@Column(name = "course_name") | ||
private String courseName; |
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.
name = 으로 네이밍 컨벤션 맞춰준 점 좋았어요
private CourseRepository courseRepository; | ||
|
||
// 특정 학생의 수강 과목 추가 (POST 요청 처리) | ||
@PostMapping("/add") |
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.
add가 없어도 충분히 url의 의미가 전달되지 않을까요? 왜 그럴까요?
} | ||
|
||
// 과목 삭제 (DELETE 요청 처리) | ||
@DeleteMapping("/delete/{id}") |
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.
여기도 /{id}만 하더라도 의미가 전달될 것 같아요. 혹시 자동완성 기능이었다면, 스스로 url 구조를 짜보는 연습도 필요할 것 같습니다
@GetMapping("/{id}") | ||
public Course getCourseById(@PathVariable Long id) { | ||
return courseRepository.findById(id) | ||
.orElseThrow(() -> new RuntimeException("Course not found with id: " + id)); |
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.
이 부분도 추후에는 예외처리를 세부적으로 할 수 있도록 공부하셔야합니다!