해결된 질문
작성
·
123
0
안녕하세요. 만 1년된 작은 중소기업에서 일하고 있는 개발자입니다. 강의 잘 듣고 있습니다!
현재 회사에서는 오라클 데이터베이스를 사용하고 있고 최근 스프링부트와 JPA를 사용해서 프로젝트를 시작했고, 낡은 레거시 사업을 영위하는 업체라서 이게 회사의 첫 스프링부트 프로젝트입니다! 나름 새로운 기술스택을 제안했기에 가지는 부담감이 심한데요.
최근에 만든 거의 대부분의 프로젝트들은 단일 DB를 사용하고 있기 때문에 별다른 고민 없이 AutoIncrement를 선택했습니다. 오라클에서도 최신 버전에서는 잘 지원해주고 있고 DB 버전은 높았기 때문에 이에 익숙해서 JPA에서 지원하는 IDENTITY 전략을 사용해서 시스템을 만들었는데요. 현재 ID를 노출해야하는 상황이 생길 경우 이를 그대로 노출하고 있습니다. 다른 PK 전략을 사용하지 않고 보완할 수 있는 방법이 있을까요? 현재 떠오르는것은 외부로 노출할 때 컨트롤러에서 이를 해싱하거나 난수화를 하는 방법을 생각하고 있습니다.
감사합니다!
답변 2
1
wisehero님, 안녕하세요!
일단 보안적인 우려가 되는 부분인지 먼저 확인해보시면 좋을 것 같습니다.
auto_increment는 이미 많이 쓰이기도 하고, 클라이언트에 응답해도 크게 문제가 없는 상황일 수 있습니다.
현재 단일 DB이고, 앞으로도 분산할 상황이 딱히 없을 것 같고, 보안 문제도 우려되지 않는다면,
그냥 auto_increment 쓰는게 마음도 편하고 별 문제 없을 수 있습니다.
이 부분에 대해서 잘 검토해보시면 좋을 것 같네요!
다른 PK 전략을 사용하려면, 클라이언트에게는 추가로 암호화된 값을 내려주면 될 것 같습니다.
(해시 또는 난수화는 엄밀히 말하면 복호화가 안되고, 해시 또는 난수화에 대해 복호화를 하려면 서버에서 매핑 정보를 계속 가지고 있어야 해서 암호화라고 말씀드렸습니다. 아무튼 맥락은 이미 이해하고 계신 것 같네요!)
또는, PK는 그대로 두고, 따로 유니크 인덱스를 만들어서 클라이언트 식별자로 사용할 수도 있습니다. (꼭 동일 테이블의 유니크 인덱스가 아니더라도 별도의 매핑 데이터를 관리할 수도 있다는 의미입니다. 해시 또는 난수화가 이 부분에 해당하겠네요.)
이 부분은 강의에서도 제안하고 문제점에 대해서 언급하긴 하지만, 성능에 딱히 치명적인 수준은 아닙니다.
검토해보았을 때 특별히 문제가 없는 것 같다면, 사실 어떤 방법을 채택하든 정답은 없습니다!
각 방법의 장단점을 이해하며 현 상황에 적절한 최선의 방법을 찾아나가면 될 것 같네요!
처음으로 스프링부트를 제안하셨다니 어깨가 무거우시겠군요.. ㅎㅎㅎ
잘 해내실 수 있으리라 믿습니다!
혹시 더 궁금한 점 있으시면 편히 문의 주세요!
0
안녕하세요, 인프런 AI 인턴입니다. wisehero님.
PK(Primary Key) 전략을 설계하면서 겪는 고민은 시스템 설계의 중요한 부분입니다. 특히, 스프링부트와 JPA를 처음 적용하는 프로젝트에서 더욱 신중함이 필요해보입니다. 주어진 상황에서 IDENTITY 전략을 사용 중이라면, 다음과 같은 방법을 고려할 수 있습니다:
ID 변환:
UUID
(범용 고유 식별자)와 같은 방식을 사용하여 ID를 대체할 수 있습니다. 이 방식은 특히 보안을 강화하고, ID를 직접 노출하지 않게 해줄 수 있습니다.엔티티 상태 변화:
@GenericGenerator
를 활용하여 커스텀 식별자 전략을 정의할 수 있습니다. 이를 통해 특정 규칙에 맞게 ID를 생성하고 외부로 노출할 때 구현된 규칙을 따라 처리할 수 있습니다.외부 시스템 매핑:
도메인 모델 설계 개선:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.