본문 바로가기
개발 관련 학습 및 문제해결

@ElementCollection , 모델(엔터티)에 List, 배열 넣는 법[20221109 TIL]

by 날파리1 2022. 11. 9.

다시 코드를 리팩터링 하는 중. 어제 쓴 것에 기반으로 조금 리팩토링하는데 확실히 달라진게 있는 듯? 하다. 단점은 시간이 다소 걸린다는 점.

 

여태까지 모델(엔터티)에 배열 넣는 법을 글을 썼는데 다시 또 바꿔쓰려고 한다.

 

고민

https://onulmansanda.tistory.com/202

 

데이터베이스에 배열 넣기?[20221031-TIL]

[관계형]데이터베이스에 배열을 넣을수 있나 데이터에 배열형태로 해쉬태그를 넣으려고 했는데 이런 오류코드가 뜬다. 테이블에 배열 넣을 수 없다는 뜻인듯. 이걸 해결하는 어노테이션이 있는

onulmansanda.tistory.com

1. @ManyToOne 쓰는 법

https://onulmansanda.tistory.com/204

 

ManyToOne, OneToMany 를 쓰지않고 DTO에 List 속성 넣어주기[20221102 TIL]

어제 불과 ManyToOne, OneToMany 어노테이션으로 프론트엔드로 보내주는 DTO에 리스트 배열을 넣을 수 있다고 했는데 오늘은 반대의 방식을 들고 왔다. 오늘 트레이너님께서 위 어노테이션을 사용하면

onulmansanda.tistory.com

 

2. Dto로 변환 한 뒤 다시 넣어주기

1. controller 에서

List<StudyDto> StudyDtos =
        studyService.list(page)
            .stream()
            .map(study -> study.toDto(studyService.list(study.getId())))
            .collect(Collectors.toList());

 2. service 에서

public Page<Study> list(Integer page) {

    Sort sort = Sort.by("createdAt").descending();

    pageable = PageRequest.of(page - 1, 4, sort);

    return studyRepository.findAll(pageable);
  }

 

3. @ElementCollection 사용하기

@ElementCollection
private List<String> hashTags;

엔터티에서 사용하고자하는 속성 값 위에 저렇게 붙여주면 List를 넣을 수 없다는 오류를 막을 수 있다.

 

데이터베이스에서는 아래처럼 인식된다.

특징은 @ElementCollection 을 사용한 것은 edit 버튼이 없다.

우여곡절끝에... 3가지 방법으로 배열을 넣었다.

 

저렇게 다양하게 짜다보니 엔터티 모델을 만들면서 속성들을 어떻게 처리해줘야할까를 고민하게 되는데 결국 그럴수록 객체지향적 사고를 해야하고 설계의 중요성이 드러난다.

 

일단은 List<String> 형태로 사용하면서 Study라는 (스터디 모임의 객체 모델)의 해쉬태그를 사용하면서 확장성이 보일때 갑객체로 빼줄 예정이다. 

댓글