-
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) - Implement Spring project with JPA and H2 Database #1
base: main
Are you sure you want to change the base?
Conversation
Duckssocks
commented
Jul 10, 2024
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.
JPA를 잘 이해하고 사용해주신 것 같아요. 이후 프로젝트에서는 입력값을 검증하는 방법이나, 예외처리, DTO를 사용하는 방법, 트랜잭션을 활용하는 방법 등 같이 공부해봐도 좋을것 같습니다. 고생 많으셨습니다! 👍
public class Enrollment { | ||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private int enrollment_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.
필드 명들이 스네이크 케이스를 사용하고 있는데요, "column(name = "을 통해 컬럼 네임을 따로 지정해주면, 자바에서의 카멜케이스 네이밍 컨벤션을 지킬 수 있으면서도, JPA의 스네이크케이스에 대한 네이밍 연동을 할 수 있어요 ~!
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.
레포지토리에서 사용하는 아이디와 다른 테이블에서는 아이디를 Long속성으로 둔 만큼 int -> Long으로 통일해도 좋을 것 같습니다
} | ||
|
||
public Course getCourse(Long id) { | ||
return courseRepository.findById(id).orElse(null); |
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.
지금은 연습 프로젝트이니 null을 반환하는 것으로 끝냈지만, 실제 프로젝트에서는 nullPointerException가능성을 두는 것 보단 orElseThrow()로 예외를 던지고 적절히 처리할 수 있도록 구조를 짜보면 좋을 것 같아요
} | ||
|
||
public List<Enrollment> getEnrollmentsByCourseId(Long courseId) { | ||
return enrollmentRepository.findByCourseCourseId(courseId); |
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.
Jpa 커스텀 쿼리 메서드를 잘 사용해서 깔끔하게 만들어 주셨네요, 지금은 데이터 베이스에 접근하는 코드가 메서드마다 하나씩이기에 큰 이점은 없을테지만, 프로젝트가 복잡해지고, 여러번의 도메인별 접근이 이루어 질 경우가 생기곤 합니다. 그럴때 트랜잭션 어노테이션을 꼭 활용할 수 있으면 좋을 것 같아요
} | ||
|
||
@PostMapping | ||
public ResponseEntity<Enrollment> addEnrollment(@RequestBody Enrollment 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.
사용자가 모든 값을 입력할 수 있는 body에서 엔티티를 검증없이 바로 바인딩 시키는 방법보다는 중간 클래스(레코드 활용 가능)인 DTO를 활용하는게 더 바람직해요. 이후 사용자가 입력가능한 DTO 클래스 -> 엔티티로 바꾼다면 API 요구사항과 엔티티구조가 다르더라도 유연하게 코드를 짤 수 있기도하구요.