SSAFY11th-book-study / book-study

0 stars 0 forks source link

[5.1.1] DB 저장시 일정한 종류 정보를 문자열로 넣는 것이 부적절한 이유 #44

Closed a-young-kim closed 4 months ago

a-young-kim commented 4 months ago

Enum을 사용하는 이유를 설명하면서 BASIC, SILVER, GOLD라고 문자열을 넣는 방법은 별로 좋아 보이지 않는다고 하였습니다. 이 이유로 일정한 종류의 정보를 문자열로 정보를 넣는 것 보다 범위가 작은 용량으로 관리하면 DB 용량도 많이 차지하지 않는 것이라고 설명하였습니다.

하지만 위의 장점을 제외하면 DB 상에서 해당 정보만 보고 어떠한 데이터인지 한눈에 알아보지 못하며 enum을 사용하여 코드 상의 복잡성만 늘어 난다고 생각이 듭니다.

토프링 책에서 언급한 장점을 제외하고 다른 장점이 있을까요??

sootudio commented 4 months ago

답변을 찾다가 해당 질문에 대한 좋은 답변이 있어 첨부합니다. https://github.com/JavaBookStudy/JavaBook/issues/93

추가하자면, 질문에 코드 상의 복잡성이 늘어난다는 내용과 달리, 제가 찾아봤을 때는 enum을 사용하면 해당 값이 어떤 역할을 하는지 명확하게 표현할 수 있기 때문에 오히려 코드의 가독성과 유지보수성이 높아진다고 나왔습니다.

limjongheok commented 4 months ago

우선 enum 을 사용한다는것은 해당 필드에 올 값(BASIC, SILVER, GOLD) 이 (일정한 정보만 올수 있다라는 뜻으로 enum 으로 해당 값들을 나열하고 순서를 db에 저장하는것이 db 용량차원에서 좋지 않나 생각 듭니다. 또한 enum 타입으로 관리해 특정 값만 올 수 있으니 혹시 모르는 개발자의 실수를 줄일 수 있다는 장점도 있을수다 생각이 듭니다.

gmelon commented 4 months ago

관련된 추가 질문으로, db에 enum의 문자열 값 말고 정수 인덱스인 ordinal 값을 넣는 것이 옳은 것인지에 대한 궁금증입니다. 저는 추후 enum에 값이 추가되면 db에 저장된 index와 오차가 생길 수 있어 주로 문자열로 저장한다고 알고 있어서요!


-> 이는 JPA에서 ordinal을 사용하기 때문에 발생하는 문제로, enum이 직접 value를 갖는 경우에는 괜찮다고 생각

hj-k66 commented 4 months ago

enum을 문자열로 넣었을 경우에도 동일한 단점이 발생한다고 생각합니다. enum 명칭을 변경할 경우 맞는 name이 없어 DB 조회 시 문제 발생할 수 있을 것 같습니다.

이와 관련된 논의가 있어 링크를 첨부합니다. https://www.okky.kr/questions/1477738

요약하자면 String을 권장하지만 계산에 사용되는 값이면 숫자형으로 사용하는게 좋을 듯 합니다.

참고로 숫자형이랑 string 과의 성능차이를 분석한 블로그 링크를 첨부합니다. https://wildeveloperetrain.tistory.com/m/250

sootudio commented 4 months ago

GPT 답변

정수 인덱스를 사용하는 경우에는 일부 상황에서 속도가 더 빠를 수 있습니다. 정수 인덱스를 사용하면 데이터베이스에서 비교 및 정렬할 때 더 빠르게 처리될 수 있기 때문입니다. 또한, 저장 공간 측면에서도 문자열보다는 정수가 더 적은 공간을 차지할 수 있습니다.

그러나 이러한 속도 및 저장 공간의 이점은 보통 데이터베이스나 애플리케이션에서 매우 큰 규모의 데이터나 빠른 처리 속도가 필요한 경우에 중요하게 여겨집니다. 보통은 Enum 값의 명시성과 유지보수성이 더 중요하며, 대부분의 경우에는 이러한 이점이 성능상의 손실을 상쇄시키기에 충분합니다.

따라서 속도를 우선시해야 하는 특정한 상황이 아니라면, Enum 값을 문자열로 저장하여 가독성과 유지보수성을 높이는 것이 권장됩니다.

a-young-kim commented 4 months ago
  1. Enum 값을 문자열로 저장하여 가독성과 유지보수성을 높이는 것이 권장됩니다.
  2. Enum의 여러 기능을 통해 abstract 메서드를 이용한 선언으로 모아 관심사를 집중시킬 수 있는 등의 기능을 구현할 수 있습니다.