쌩로그

@ElementCollection (feat. JPA, DB) 본문

Spring/JPA

@ElementCollection (feat. JPA, DB)

.쌩수. 2023. 6. 18. 18:59
반응형

내가 성장하는 것이 다른 사람에게 좋은 영향을 줄 수 있다.

그래서 나는 잘 되야만 한다.

나는 진짜 ㄹㅇ 조만간 잘 될 사람이다.

어차피 잘 될 것이고, 지금도 잘 된 사람이다..

요즘 폭풍성장 중이다.

어쨋든간에 나는 어잘될사다.


요즘 개발을 하면 할수록 내가 얼마나 부족한지 고개가 절로 숙여지는 하루하루다.. 그만큼 또 성장하고 있다는 증거겠지..

 

그래도 모든 문제들을 마주할 때마다 결국은 이해하고 풀었다...포스팅 스택이 겁나 쌓였다..날잡고 2-3일은 글만 적어야 할 기세다..여튼...

목차

  1. 포스팅 개요
  2. 본론
      2-1. 문제가 뭘까?
      2-2. 어떻게 하다가 문제를 마주했는가?
      2-3 그럼 @ElementCollection 는 어떤 건가?
  3. 요약

1. 포스팅 개요

제목처럼 @ElementCollection이라는 애너테이션을 사용하다가 내가 생각했던 대로 일어나지 않았고, 알고보니 내가 생각했던 것처럼 안 되는 게 당연하기 때문에 포스팅을 하게 되었다.

2.본론

2-1. 문제가 뭘까?

문제는 DB에 Member Table과 매핑한 Member 객체에 권한을 저장하는 필드인 List&ltString&gt roles 에 setter를 통해서 권한을 설정해주더라도, DB의 Member 테이블의 권한 Column에는 들어가지 않는 것이 문제다.

2-2. 어떻게 하다가 문제를 마주했는가?

무슨 말인가..?

회원가입 로직을 간단히 이야기하면,
// 소셜로그인 이후,
// 토큰이 발급되고,
// 중간에 Member 객체를 생성하는 로직이 있는데, 이 로직으로 인해서 Member객체가 생성되고, Member객체를 JPA를 통해 insert Query를 날려서 DB에 저장한다.

Member Domain의 서비스 계층에서 DB에 insert Query를 날려서 엔티티가 저장하는 과정이 이루어지는데, 이때, 멤버의 상태(활동 중, 휴면계정 구분

가입이니깐 당연히 활동중

), 그리고 멤버의 권한이 sette를 통해서 설정 된 Member 객체를 DB에 save한다.

이런 로직이다.

배포서에서 의 DB와도 전쟁도 이걸 마무리하면서 끝났다..물론 아직 몇 차전 더 남았을 거 같다...

결과를 한번 보면,(

DB와의 컬럼명 맞짱도 이 문제를 마무리하면서 일단락 되었다.

)
서비스 계층에서 Member를 생성한 이후의 결과를 배포 환경의 DB로 확인한 결과다.

이런 식으로 나온다.
Member 테이블의 ROLES 컬럼은 다 null이지만, 권한 정보 Table인 ROLES에는 Member 엔티티의 IdMember의 Id 값에 해당하는 권한들이 테이블에 저장된다.

엔티티 클래스에는 어떻게 정의 되어있는가...?

이렇게 작성했다..

ager은 일부러 썻다...;;

지금 보니깐 @ElementCollection에 대한 이해가 부족했다.

일단 권한은 String 타입을 요소로 갖는 List&ltString&gt 로 정의했다.
즉 컬렉션 값들이 하나의 컬럼에 다 담기길 생각했었다..

 음.. 쓰면서 생각났다.. 만약 권한이 두 개면, 값이 두개가 들어가는 게 알맞지가 않다..
 부족한 개념이지만, 정보처리기사에서 본 내용 중 정규화가 생각난다.
 만약 정규화한다고 가정하면, 권한만 다른 똑같은 튜플이 중복으로 발생하게 될 것 같아서 내가 생각했던 그림으로 만들어진다 하더라도,,, 형편없는 그림이 나올 수 밖에... 

고개가 또 숙여진다..

2-3 그럼 @ElementCollection 는 어떤 건가?

일단 PT한테 물어봤다..

컬렉션으로 이루어진 값을 연관관계의 매핑이 아닌 단순히 값으로 사용하고 싶을 때, 사용하는 애너테이션이다.
그런데 마지막 부분에 보면, 매핑된 필드는 컬렉션 형태의 데이터를 저장하고, 해당 데이터는 별도의 테이블에 저장된다.라고 적혀있다.

그래서 저렇게 나온게 당연한 것이었었고, 맞는 것이었다..

이 말듣고, 지워보았지만, **'Basic' attribute type should not be a container** 이오류가 나와서 GPT한테 역시 물어봤다..
그냥 별도의 테이블이 생기는 걸 받아들였다..;;ㅋㅋ;;

그래서 과감히 Member의 Entity를 정의한 클래스에는 그대로 놔두었지만,
DB의 Member테이블에서 권한 정보를 담고싶었던 roles 이름의 column은 삭제했다.

사실 영한님 강의에서 봤었다..,, 봤었기 때문에 사용했지만,, 이렇게 한 번 조금은 제대로 알아간다..

3. 요약

연관관계 매핑으로가 아닌 정말 단순히 권한정보를 값으로 쓰기 위해서 @ElementCollection을 사용했다.
하지만 이 애너테이션이 붙은 필드는 DB로 입력했을 때, 해당 테이블에 값이 들어가는 것이 아니라, 별도의 다른테이블에 지정되는 것을 알지 못해서 삽질하게 되었다.

그리고는 Member의 테이블에서 권한정보 컬럼을 삭제했다.
그리고 JPA를 통해 insert가 오류없이 잘 들어가는 것을 확인했다.

728x90
Comments