카테고리 없음

패스트캠퍼스 환급챌린지 44일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기

Laftel 2025. 4. 17. 16:22
반응형

***본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다 
ORM과 DB를 쓰면서 복잡성을 띄울 수 있는 기능 
SQL의 Join = Nest.js Relationships
엔티티와 엔티티의 관계
TypeORM의 관계 어노테이션(@OneToOne, @ManyToOne, @OneToMany, @ManyToMany) 적용 방법을 학습하면서, 단순히 데코레이터를 사용하여 관계를 정의하는 것을 넘어 관계의 주인(Owner)을 명확히 설정하고, 데이터 접근 방식과 성능을 고려하는 설계의 중요성을 깊이 깨닫게 되었습니다. 특히 양방향 관계 설정 시 발생할 수 있는 잠재적인 문제점과 이를 해결하기 위한 전략에 대해 고민하는 시간을 가질 수 있었습니다.
첫째, 관계의 주인 설정의 중요성과 그 의미를 명확히 이해하게 되었습니다. @ManyToOne 또는 @OneToOne 관계에서 @JoinColumn 어노테이션을 사용하여 외래 키 컬럼을 정의하고 관계의 주인을 설정하는 것은 데이터베이스 스키마를 명확하게 만들고, 데이터 일관성을 유지하는 데 필수적입니다. 관계의 주인이 아닌 엔티티에서는 relation 속성을 통해 관련 데이터를 참조할 수 있지만, 데이터 저장 및 업데이트 시에는 주인의 역할을 하는 엔티티를 중심으로 작업이 이루어진다는 점을 인지했습니다. 마치 가족 관계에서 부모와 자식 간의 관계처럼, 데이터의 흐름과 책임을 명확히 정의하는 것이 데이터 관리의 효율성을 높이는 핵심이라고 생각합니다.
둘째, 양방향 관계 설정의 편리성과 잠재적인 무한 루프 문제에 대한 경각심을 갖게 되었습니다. @OneToMany와 @ManyToOne 또는 @ManyToMany 관계를 함께 사용하여 양방향 관계를 설정하면, 양쪽 엔티티에서 서로의 데이터를 편리하게 접근할 수 있다는 장점이 있습니다. 하지만, 이러한 편리함 뒤에는 직렬화(Serialization) 과정에서 무한 루프가 발생할 수 있다는 잠재적인 위험이 존재한다는 것을 알게 되었습니다. 따라서 양방향 관계를 설정할 때는 순환 참조를 방지하기 위해 @Exclude()와 같은 데코레이터를 사용하여 특정 방향의 관계를 직렬화에서 제외하거나, DTO(Data Transfer Object)를 활용하여 필요한 데이터만 선택적으로 반환하는 전략이 필요하다는 인사이트를 얻었습니다. 마치 거울이 서로를 끝없이 비추는 것처럼, 양방향 관계를 잘못 설정하면 데이터 조회 과정에서 예상치 못한 무한 루프에 빠질 수 있다는 점을 기억해야 합니다.
셋째, 관계 설정 시 데이터베이스 스키마 디자인과 ORM 매핑의 조화가 중요함을 느꼈습니다. TypeORM은 객체 지향적인 방식으로 데이터베이스 관계를 정의할 수 있도록 다양한 어노테이션을 제공하지만, 이는 결국 데이터베이스 스키마로 반영됩니다. 따라서 관계를 설정할 때는 객체 모델의 관점뿐만 아니라, 데이터베이스 성능과 관리 효율성을 고려하여 외래 키, 인덱스 등을 적절하게 설계하는 것이 중요합니다. ORM의 편리함에만 의존하기보다는, 데이터베이스의 기본 원리를 이해하고 이를 ORM 설정에 반영하는 노력이 필요하다는 것을 깨달았습니다. 마치 건물을 설계할 때, 아름다운 디자인뿐만 아니라 건물의 안정성과 기능성을 고려해야 하는 것처럼, 데이터 모델링에서도 객체 모델과 데이터베이스 모델의 조화로운 설계가 중요합니다.
넷째, 다양한 관계 설정 옵션(@JoinColumn, @JoinTable, cascade, eager/lazy loading 등)의 이해와 활용 능력이 데이터 관리 효율성을 높이는 핵심임을 확인했습니다. @JoinColumn을 사용하여 외래 키 컬럼의 이름과 속성을 명시적으로 정의하고, @JoinTable을 사용하여 다대다 관계의 중간 테이블을 설정하는 방법을 이해하는 것은 데이터베이스 스키마를 원하는 대로 구성하는 데 필수적입니다. 또한, cascade 옵션을 통해 연관된 엔티티의 변경 사항을 자동으로 전파하거나, eager 및 lazy 로딩 전략을 선택하여 데이터 접근 성능을 최적화하는 능력은 효율적인 데이터 관리를 위한 중요한 역량이라고 생각합니다. 마치 악기의 다양한 연주 기법을 숙달해야 풍부한 음악적 표현이 가능한 것처럼, TypeORM의 다양한 관계 설정 옵션을 이해하고 적절하게 활용해야 데이터 관리의 효율성을 극대화할 수 있습니다.
마지막으로, 관계 설정을 통해 데이터 모델의 의미론적 풍부함을 더할 수 있다는 점을 느꼈습니다. 단순히 테이블을 연결하는 것을 넘어, 관계의 유형과 속성을 명확하게 정의함으로써 데이터 모델은 애플리케이션의 도메인 지식을 더욱 풍부하게 담아낼 수 있습니다. 이는 코드를 더욱 직관적이고 이해하기 쉽게 만들 뿐만 아니라, 비즈니스 로직을 데이터 모델에 자연스럽게 반영할 수 있도록 돕습니다. 마치 언어의 문법과 어휘를 통해 의미를 정확하게 전달할 수 있는 것처럼, TypeORM의 관계 어노테이션을 통해 데이터 모델의 의미를 명확하게 표현하는 것이 효과적인 소프트웨어 개발의 중요한 측면이라고 생각합니다.
이번 TypeORM 관계 어노테이션 학습을 통해 데이터 모델링은 단순한 기술적인 작업이 아니라, 애플리케이션의 핵심 개념과 비즈니스 규칙을 반영하는 중요한 설계 과정임을 다시 한번 깨달았습니다. 앞으로 다양한 관계 설정 시나리오를 경험하고, 데이터 접근 방식과 성능 최적화를 고려한 설계를 통해 더욱 효율적이고 안정적인 애플리케이션을 개발하는 데 기여하고 싶습니다.


#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완
https://bit.ly/4hTSJNB

반응형