실전 프로젝트 5일 회고

SaGo_MunGcci·2022년 8월 30일
0

실전 프로젝트

목록 보기
4/19

Today do list

  • ERD다이어그램 작성

  • 깃을 통한 기본 코드 공유

  • 백앤드 팀원들 기능 분담.



TIL

@ElementCollection

  • 값타입 컬랙션

    • 말 그대로 값 타입을 컬렉션에 담아서 사용하는 것이다.

    • @OneToMany 처럼 엔티티를 컬렉션으로 사용하는 것이 아니라, Integer, String과 같은 값 타입을 컬렉션으로 사용하는 것이다.

    • 관계형 데이터베이스는 컬렉션을 담을 수 없다. 따라서 이를 저장하기 위해서는 별도의 테이블을 만들어서 저장해야 한다.

    • 이때 값 타입 컬렉션은 개념적으로 보면 1대 N 관계이다.

      (그리고 값 타입을 저장하는 테이블은 값 타입을 소유한 엔티티의 기본 키와 모든 값 타입 필드를 묶어서 PK로 사용하며, 엔티티의 기본 키를 PK겸 FK로 사용한다.)

  • @ElementCollection

    • 값 타입 컬렉션을 매핑할 때 사용한다.

    • 위에서 말했듯이 관계형데이터베이스에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없기 때문에, 별도의 테이블을 생성하여 컬렉션을 관리해야하는데, 이때 해당 필드가 컬렉션 객체임을 JPA에게 알려주는 어노테이션이 @ElementCollection 이다.

    • @Entity가 아닌 Basic Type이나 Embeddable Class로 정의된 컬렉션을 테이블로 생성하며 One-To-Many 관계로 다룬다.

@Entity
public class Member {

@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;

@Column
@ElementCollection
private List<String> profileImgUrl = new ArrayList<>();
}

                 :

  create table member (
  member_id bigint not null,
  age integer,
  name varchar(255),
  tel_no varchar(255),
  primary key (member_id)
  )                     :

    create table member_profileImgUrl (
       member_member_id bigint not null,
        roles varchar(255)
    )

  • @ElementCollection 작동 원리.

    • 부모 Entity 에 의해 관리된다.
      member_profileImgUrl 에 member_id 와 관련된 키가 생성된 것을 볼 수 있다.

    • 부모와 함께 저장되고 삭제된다. casecade 옵션이 default 이다.
      컬렉션 값 변경 시, 전체 삭제 후 새로 추가한다.

    • member id 데이터 하나의 roles 가 변경되면 전체 삭제 후, 새로 추가한다.

  • @ElementCollection 사용시 유의점.

  • 값 타입 컬렉션의 제약

    • 값 타입은 엔티티와 다르게 식별자 개념이 없기 때문에 값을 변경하면 추적이 어렵다.

    • 값 타입 컬렉션에 변경 사항(저장, 삭제)이 발생하면, 소유하는 엔티티와 연관된 모든 데이터를 삭제하고, 현재 남아있는 값을 모두 다시 저장한다.(예제에서는 삭제를 예로 들었지만, 저장도 마찬가지)

    • 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키를 구성해야 함 → null 입력 X, 중복 저장 X

  • 값 타입 컬렉션의 대안

    • 값 타입 컬랙션 대신에 일대다 관계를 고려하자.
      일대다 엔티티를 만들고, 엔티티에서 값 타입을 사용.
      cascade와 고아 객체 제거를 설정해서 값 타입 컬렉션처럼 사용.

참고: https://insanelysimple.tistory.com/350 [Simple is best:티스토리]

참고 : https://developer-hm.tistory.com/48

참고 : https://www.inflearn.com/course/ORM-JPA-Basic#

참고 : https://ttl-blog.tistory.com/121



Retrospection

  • 오늘 mvp를 마지막으로정리하고 백앤드는 백앤드대로 프런트는 프런트 대로 나누어서 개발에 들어갔다.

  • 백앤드는 ERD다이어그램을 먼저 작성하고 그다음 기능분담을 하여 개발에 들어갔는데, 오늘따라 왜이리 피곤하고 머리가 안돌아가는 지 머리가 자꾸 멍하고 다른 생각이 나서 코드에 집중 할 수 가없었다.

  • 개발해야될 양은 엄청난데, 갑자기 피곤이 몰려오더니 더이상 코드에 집중하는 내눈을 가려버렸다.

  • 그래도 집중해야지, 깨어봐야지 하고 밖에 나갔다 들어왔다를 하기를 수번 그래도 밖에 있으면 잠에서 깨는 느낌이지만 다시 돌아와서 의자에 앉기만하면 왜이렇게 잠이 쏟아지거나 아니면 다른 생각이 나는지..

  • 결국 이상태로는 코드를 만들어도 실수 할 것 같고 특히 간단한 실수 일수록 눈에 보이기가 힘들어서 악순환이 계속 될 것 같아서 팀원들에게 미리 양해를 구하고 일찍 게더에서 나왔다.(정말 감사하게도 팀원들 모두가 고생하셨다고 말씀해 주셔서 약간의 죄책감은 덜 수 있었다.

  • 마음속으로는 내일 열심히 해야지라고 되뇌였지만, 내일도 과연 열심히 아니, 잘할 수 있을까?????

  • 두고온 팀원분들이 자꾸 생각나서 미안할 따름이다......



Tommorrow do list

  • Lombok 사용상 주의점(Pitfall)


profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글