본문 바로가기

개발 일지

[TIL]이노베이션 캠프 68일차

1. 개발 진행 상황

코드를 계속 수정중인데 DB쪽을 제대로 잡고 가야할 것 같다.

조인이랑 관계의 종류와 방향을 제대로 모르고 필요한 것만 검색해서 필요 할 때마다 해결 방법으로만 적용시켜서 제대로 잡고가야 하지 않을까 싶다.

검색 기능을 문제점 없는 지 확인하고, 중복 검색이랑 띄어쓰기가 들어간 검색을 추가하고, 기능 추가 후에는 검색된 데이터를 이용해서 추천에도 활용해 볼까 생각했는데, 검색도 결국 DB와 관련되기 때문에 공부를 좀 더 하려고 한다.

 

2. 개발 중 발생한 이슈와 해결

 

1) 기존 코드

- n:1관계, 관계의 주인인 CourseHeart와 단일 값인 course_id를 연결

- 일반적으로 참조되는 개체(Post)의 타입으로 유추 가능하므로 명시적으로 지정할 필요 없음 

처음에 코스를 post로하여 코드를 작성했기 때문에 명시적으로 지정했고, 수정하면서 느꼈는데 post를 다 course로 바꿔야하지 않나 하는 생각이 든다.(따로 지정할 필요 없는 것을 굳이 해야하는 부분도 있고, 코드가 post랑 course를 섞어서 쓰게 되면서 가독성이 떨어짐)

course_heart

 

 

// 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 키를 이용해서 관계를 관리 할듯(?)

 

course_heart

// 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_course_heart

// 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

계속 코드 수정!