1. 개발 진행 상황
코드를 계속 수정중인데 DB쪽을 제대로 잡고 가야할 것 같다.
조인이랑 관계의 종류와 방향을 제대로 모르고 필요한 것만 검색해서 필요 할 때마다 해결 방법으로만 적용시켜서 제대로 잡고가야 하지 않을까 싶다.
검색 기능을 문제점 없는 지 확인하고, 중복 검색이랑 띄어쓰기가 들어간 검색을 추가하고, 기능 추가 후에는 검색된 데이터를 이용해서 추천에도 활용해 볼까 생각했는데, 검색도 결국 DB와 관련되기 때문에 공부를 좀 더 하려고 한다.
2. 개발 중 발생한 이슈와 해결
1) 기존 코드
- n:1관계, 관계의 주인인 CourseHeart와 단일 값인 course_id를 연결
- 일반적으로 참조되는 개체(Post)의 타입으로 유추 가능하므로 명시적으로 지정할 필요 없음
처음에 코스를 post로하여 코드를 작성했기 때문에 명시적으로 지정했고, 수정하면서 느꼈는데 post를 다 course로 바꿔야하지 않나 하는 생각이 든다.(따로 지정할 필요 없는 것을 굳이 해야하는 부분도 있고, 코드가 post랑 course를 섞어서 쓰게 되면서 가독성이 떨어짐)
// Post
// CourseHeart
@ManyToOne
@JoinColumn(name = "Course_id")
private Post post;
2) 테스트 1: Post에 관계(OneToMany)와 Joincolumn 추가
- post가 heart를 필요로 하지 않을 것으로 생각해서 양방향이아닌 단방향 OneToMany관계를 추가함
- course_heart DB에 course_heart_id컬럼이 생성됨
- course_heart_id 키를 이용해서 관계를 관리 할듯(?)
// Post
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn
private List<CourseHeart> courseHeart;
// CourseHeart
@ManyToOne
@JoinColumn(name = "Course_id")
private Post post;
3) 테스트 2: Post에 관계(OneToMany)만 추가
- 새로운 테이블 post_course_heart가 생성됨, joincolumn은 말그대로 컬럼으로 조인하는 것이였군..
- course_heart_id 키를 이용해서 관리하는게 확실해졌고..!
// Post
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<CourseHeart> courseHeart;
// CourseHeart
@ManyToOne
@JoinColumn(name = "Course_id")
private Post post;
4) 테스트 3: 관계(ex. @OneToMany) 안쓰고 @JoinColumn 쓰면 에러 발생
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: com.example.week08.domain.CourseHeart, at table: post, for columns: [org.hibernate.mapping.Column(course_heart)]
5) 정리
관계랑 관계의 옵션 설정에 대해서 공부하다가 실제 적용이 어떻게 되는건지 직접해봤고, 잘 까먹기 때문에 기록하기..!
- 양방향 관계로 사용하려고 하지 않는 이상, OneToMany는 사용하지 않는 것이 더 나은 것같다.
이유1. CourseHeart는 post와의 관계도 있지만, member와도 관계가 있기 때문에
이유2. ManyToOne만으로도 지금 필요한 기능 구현이 충족 됨
이유3. 이건 직접 테스트 한건 아닌데, 공부하면서 찾아보니까 단방향OneToMany는 update쿼리가 추가로 발생한다고 함(예를들어 heart를 생성하면, post에 데이터가 생성되고 추가로 courseHeart에 update를 해주는 방법으로 진행되기때문)
-ManyToOne만 사용하고, 필요한 옵션 추가를 해야겠다.
3. 새로 배운 것
4. 참고 레퍼런스
5. 오늘 한 일 / 회고
JPA공부..
공부할게 너어어어무 많다
계속 이거공부했다가, 저거 공부했다가..ㅎ
6. TO-DO LIST
계속 코드 수정!
'개발 일지' 카테고리의 다른 글
[TIL]이노베이션 캠프 70일차 (0) | 2022.10.09 |
---|---|
[TIL]이노베이션 캠프 69일차 (0) | 2022.10.08 |
[TIL]이노베이션 캠프 67일차 (0) | 2022.10.07 |
[TIL]이노베이션 캠프 66일차 (0) | 2022.10.05 |
[TIL]이노베이션 캠프 65일차 (0) | 2022.10.04 |