작성
·
221
2
영한님, 티아카데미 동영상을 우연히 본 뒤, 강의에 반해서 IT강의에 처음으로 결제를 해보게 된 초보개발자 입니다.
아직 강좌 학습이 진행 중인 상태에서 궁금한 것 몇 개만 문의드려봅니다.
1) 보통 시스템 운영을 하다보면 현업 요청으로 인한 자료 추출이나 그 밖의 운영상 확인을 위해 실제 SQL 문을 소스 상에서 긁어서 DB Tool 로 결과 조회를 하는 경우가 상당한데요. JPA 로 개발을 하게 된 시스템은 위와 같은 SQL 실행이 필요할 때, 매번 해당 기능을 로컬에서 실행을 한 뒤, 이후 로그에 나타난 SQL 을 긁어서 활용하는 방식을 취해야 할까요?
2) 약간 좀 어려울 수 있는 질문이 될 수도 있을 거 같은데요. 연관 관계 맵핑 강좌를 듣고 있는데 하나의 객체가 외래키를 속성으로 가지는 것이 객체지향스럽지 않다는 말씀을 하셨고, (Member 에서 team_id) 이보다는 객체참조를 중요하게 설명하고 계신데요.
막상 또 설계나 개발을 하다보면 객체참조보다 외래키를 속성으로만 포함시키는 경우도 많이 보게 됩니다.
아직 객체지향에 익숙치가 않아서 주로 언제 객체참조를 쓰는 게 좋고 언제 속성을 사용하는 것이 좋은 지 감이 잘 오지 않는데 영한님이 생각하시는 기준이 있다면 설명을 해주시면 도움이 될 것 같습니다.
답변 1
1
반갑습니다 아리마님^^
좋은 질문입니다.
1. 운영하다보면 이런 경우가 정말 많지요^^ 로컬에서 실행해서 SQL을 얻거나, SQL을 직접 작성해서 DB Tool로 결과를 조회하고 제공합니다. 물론 반복적인 요청은 어드민을 만들어서 제공하는게 좋겠지요^^!
2. JPA와 같은 ORM을 사용하지 않으면, 대부분 엔티티간 객체 연관관계 없이, 단순히 id 값을 사용합니다. 그 이유는 관계형 데이터베이스가 객체를 저장하는 것이 아니라 단순히 id를 저장하기 때문인데, SQL을 직접 다루면 이런 제약 때문에 객체를 DB에 맞추어서 설계를 많이 합니다.
JPA와 같은 ORM을 사용하면?
처음 JPA를 사용하면 가급적이면 연관관계를 만드는 것으로 고민을 하는 것이 좋습니다. 객체는 참조를 기반으로 동작하기 때문이지요. 추가로 뒤에서 JPQL 부분을 보면 아시겠지만, 연관관계가 있어야 lazy loading, fetch join 같은 JPA 최적화 기법을 활용할 수 있습니다.
JPA와 같은 ORM을 사용하지만 연관관계 없이 단순히 id(외래키)만 저장하면 좋은 상황은?
제가 도메인 설계를 좋아하는 이유는 이런 부분에 정답이 있기 보다는, 해당 문맥에 맞는 적절한 여러 선택지를 하나 고를 수 있기 때문인데요. 이런 선택에 따라서 미래의 누군가는 엄청 고통스러워 질 수 있고, 행복해 질 수 도 있지요.(보통 그 미래의 누군가는 자신이지만... 이건 사족입니다 ㅎㅎ)
먼저 시야를 데이터베이스에서 객체지향으로 옮겨야 합니다. 객체지향에서는 연관관계가 있으면 서로 의존관계를 가지고 있지요. 하지만 연관관계가 없으면 의존관계가 물리적으로 없어집니다. 여기에서 응집성, 결합도 등을 고민해서 도메인 설계를 해야 합니다. 결국 서로 많이 참조하고 사용하는 것 끼리는 함께 묶어서 연관관계를 만들고, 서로 참조할 일이 거의 없는 경우는 연관관계를 끊어내고, 단순히 id(외래 키 값)만 저장하는 것이 좋습니다.
여기서 좀 많이 어려운 내용이지만, 한걸음 더 나아가면 DDD(도메인 주도 설계)에 나오는 aggregate root라는 개념이 있습니다. 서로 트랜잭션 범위가 같고, 강한 의존도가 있으면 aggregate로 묶고, 그것을 대표하는 하나의 엔티티를 aggregate root라 합니다. 더 자세한 부분은 에릭 에반슨의 도메인 주도 설계(http://www.yes24.com/Product/Goods/5312881?scode=032&OzSrank=1) 책을 한번 보시거나 최범균님의 DDD(http://www.yes24.com/Product/Goods/27750871) 책도 읽어보시면 좋습니다.
감사합니다^^