인프런 커뮤니티 질문&답변

google_user님의 프로필 이미지
google_user

작성한 질문수

실전! Querydsl

공통 코드 테이블을 운영 할 경우 엔티티 설계를 어떻게 하는게 좋을까요?

작성

·

6.2K

2

안녕하세요 

김영환님 스프링부트와 jpa 모든 강의들 너무나 잘 들었습니다 

그동안 2tier방식의 앱(oracle, PowerBuilder) 만을 개발하다

스프링부트와 data jpa를 이용한 개발을 하려니 참 막막 했는데

개념을 잡는데 많은 도움이 되었습니다 ^^

한가지 질문을 드리고자 합니다 

데이타베이스 관점에서 여러 테이블에서 필요에 맞는 공통 코드들을 

하나의 테이블에 모아놓은 후 구분 코드와 세부 코드해서 설계를 해보려 하는데 

이럴경우 엔티티 설계를 어떻게하는것이 좋은 방법인지 궁금합니다. 

(enum 이나 각 코드에 맞는 엔티티를 다 생성하는것이은 너무 많아보여서요)

혹시 참고 할 만한 자료가 있음 추천도 부탁드립니다^^

좋은 하루 되세요 

답변 4

12

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 google_user님

공통 코드를 하나의 테이블에 모아놓은 후 구분 코드와 세부 코드를 설계하는 방법은 어렵지 않습니다.

공통 코드가 보통 DB 중심으로 설계되는 테이블이기 때문에 DB 관점에서 테이블을 원하는 모양으로 설계하면 됩니다.

그리고 학습한 내용으로 엔티티를 그대로 매핑하면 됩니다.

단 이때 공통 코드와 비즈니스 엔티티는 서로 연관관계 매핑은 안하는 것이 좋습니다. 모든 엔티티에 연관관계가 다 CommonCode가 붙을 수 있는데 이것을 그렇게 좋은 방법이 아닙니다. 대신 비즈니스 엔티티가 코드 값 자체를 가지고 있는게 더 좋습니다. 공통 코드의 값을 조회할 때는, 공통 코드 자체를 캐시에 올려두고 애플리케이션에서 필요한 CommonCodeService 같은 것을 호출해서 불러서 그 값을 찾는 방식으로 진행하는 것이 더 나은 선택입니다.

하지만 JPA를 사용한다면 DB에서 애플리케이션으로 관점을 확실하게 옮기는 것이 필요합니다.

정말 코드 컴파일 없이 동적으로 공통 코드가 변경되어야 하면 공통 코드 테이블을 사용할 수 있지만, 그게 아니라면 가급적 ENUM을 사용하는 것을 권장드립니다. 예를 들어서 주문의 상태 처럼 비즈니스 의미가 매우 중요한 내용을 공통 코드로 사용해서 개발하면, 비즈니스 로직이 공통 코드를 바라보고 개발해야 하기 때문에, 좋은 코드를 만들기가 참 어렵습니다.

반면에 ENUM을 사용하면 비즈니스 의미가 명확하게 부여되기 때문에, 코드를 추적하기도 쉽고 관리도 쉽습니다.

저도 과거에 SQL 중심으로 개발할 때는 공통 코드를 사용하는 방법을 좋아했는데, JPA를 사용하면서 그런 부분들이 공통 코드 없이 ENUM을 사용하는 것이 훨씬 효과적이었습니다.

감사합니다^^

테이블에 공통코드를 관리하는 경우는 화면의 조회조건 selectbox같은곳에서 공통코드를 보여줘야 할 때 테이블에서 조회해서 사용하면 되는데,

 

테이블에 공통코드 저장 안 하고 enum으로만 사용는 경우는 화면의 조회조건 selectbox같은곳에서 공통코드를 보여줘야 할 때 어떻게 데이터를 조회해오나요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. jeoningu님

enum을 사용해서 selectbox에서 보여주면 됩니다.

다음을 참고해보시면 도움이 되실거에요.

https://techblog.woowahan.com/2527/

감사합니다.

1

안녕하세요 영한선생님

저도 추가적으로 질문 드리고 싶습니다.

ENUM으로 사용 시,  아래와 같이 CommonCode enum을 선언해서 쓰는게 나은지

enum CommonCode{

...

}

도메인 별로 필요한 enum을 선언해서 쓰는게 나은지 궁금합니다.(==주문상태)

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 준기님

ENUM들을 각각의 목적에 맞게 사용하시는 것이 좋습니다.

감사합니다.

1

google_user님의 프로필 이미지
google_user
질문자

너무나 자세한 답변 감사드립니다

여러번 읽으면서 의미를 되세겨 보겠습니다^

0

안녕하세요. 선생님 

ENUM으로 공통코드를 관리하는것 까지는 좋은데, 만약 A라는 서비스에서 사용하는 공통코드를 B, C 서비스와 공유 하고 싶을 경우 어떤 방식으로 접근을 해야 할까요?

Rest방식으로 공통코드를 공유한다면, DB에서 공통코드를 관리하는 것 처럼 공통코드를 값으로 접근해야 하기때문에 별로인것 같고, 그렇다고 공통코드를 공유하기 위한 라이브러리를 만들어서 공유하기엔는 의존성이 생겨서 또 별로인 것 같아 고민입니다.

혹시 힌트를 얻을 수 있을가 해서, 질문드립니다.

google_user님의 프로필 이미지
google_user

작성한 질문수

질문하기