Object Graph

2023. 6. 3. 18:09High Level Programming Language

📌 객체 그래프(Object Graph)란?

객체 그래프(Object Graph)객체 간의 관계를 시각적으로 또는 개념적으로 표현한 구조입니다.
즉, 프로그램에서 객체들이 어떻게 연결되고 참조되는지를 나타내는 개념입니다.

🔹 객체(노드): 개별적인 인스턴스
🔹 관계(엣지): 객체 간의 참조

 

💡 객체 그래프를 이해하면 데이터 바인딩, ORM(객체 관계 매핑), 직렬화, 보안 등에서
발생할 수 있는 문제를 더 깊이 파악할 수 있습니다.

객체 그래프의 주요 개념

1️⃣ 객체와 관계 (Nodes & Edges)

📌 객체(Node): 프로그램에서 생성된 인스턴스
📌 관계(Edge): 객체가 다른 객체를 참조하는 관계

class Person {
    private String name;
    private Address address; // Person → Address 관계
    // getters and setters
}

class Address {
    private String street;
    private City city; // Address → City 관계
    // getters and setters
}

class City {
    private String name;
}

✔️ 위의 예시에서 PersonAddress를 참조하고, AddressCity를 포함하고 있습니다.
✔️ 이를 객체 그래프로 표현하면 다음과 같습니다.

Person → Address → City

💡 즉, 객체 간의 연관관계가 어떻게 구성되는지 표현하는 것이 객체 그래프입니다.

2️⃣ 중첩 객체 (Nested Objects)

📌 객체가 다른 객체를 포함하는 구조를 의미합니다.
📌 JSON 변환, 데이터 바인딩, ORM에서 중첩 객체가 중요한 역할을 합니다.

{
  "name": "Alice",
  "address": {
    "street": "123 Main St",
    "city": {
      "name": "New York"
    }
  }
}

✔️ 위의 JSON은 Person 객체가 Address를 포함하고, AddressCity를 포함하는 객체 그래프를 나타냅니다.

3️⃣ 순환 관계 (Cyclic References)

📌 객체가 직접 또는 간접적으로 자기 자신을 참조하는 경우입니다.
📌 순환 참조는 직렬화(Serialization) 또는 ORM에서 문제가 될 수 있습니다.

class Employee {
    private String name;
    private Department department; // Employee → Department 관계
}

class Department {
    private String name;
    private Employee manager; // Department → Employee 관계 (순환 참조)
}

✔️ Employee 객체는 Department를 참조하고,
✔️ Department 객체는 다시 Employee(매니저)를 참조합니다.

객체 그래프 표현:

Employee → Department → Employee (순환)

💡 이처럼 순환 관계가 존재할 경우, 직렬화/역직렬화나 데이터 바인딩 과정에서 StackOverflowError가 발생할 수 있습니다.

✔️ 해결 방법

  • @JsonIgnore 또는 @JsonManagedReference / @JsonBackReference를 사용하여 직렬화 방지 (Jackson)
  • ORM에서 @OneToMany(mappedBy="department")@ManyToOne 관계를 올바르게 설정
class Department {
    @JsonManagedReference
    private Employee manager;
}

class Employee {
    @JsonBackReference
    private Department department;
}

✔️ @JsonManagedReference@JsonBackReference를 설정하면 무한 루프를 방지할 수 있습니다.

🚨 객체 그래프와 보안 문제

객체 그래프가 문제를 일으킬 수 있는 대표적인 보안 위험은 다음과 같습니다.

🔹 1. 민감한 데이터 노출 (Sensitive Data Exposure)

객체 그래프가 클라이언트에 노출되면서 민감한 정보가 유출될 가능성이 있습니다.

class User {
    private String username;
    private String password; // 보안 문제 발생 가능
    private Address address;
}

✔️ password 필드가 외부 요청에 의해 바인딩될 경우 암호 유출 위험이 있습니다.

해결 방법

  • @JsonIgnore를 사용하여 JSON 직렬화에서 제외
  • DTO(Data Transfer Object) 패턴을 사용하여 필요한 데이터만 클라이언트에 제공
class UserDTO {
    private String username;
    private String address;
}

✔️ DTO 패턴을 사용하면 불필요한 내부 객체가 외부에 노출되는 문제를 방지할 수 있습니다.

🔹 2. 불필요한 필드 조작 (Unauthorized Property Modification)

객체 그래프가 깊어질수록 클라이언트가 의도치 않게 중요한 데이터를 수정할 위험이 있습니다.

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setAllowedFields("name", "email"); // 특정 필드만 허용
}

✔️ 필요한 필드만 허용하면, 민감한 속성이 클라이언트 요청에 의해 변경되는 것을 방지할 수 있습니다.

🔹 3. 대량 데이터 조회 및 성능 이슈 (Lazy Loading & Performance)

📌 JPA에서 객체 그래프를 다룰 때 Lazy LoadingEager Loading 설정이 중요합니다.
📌 불필요한 객체까지 로딩되면 성능 문제가 발생할 수 있습니다.

@Entity
class Person {
    @OneToMany(fetch = FetchType.LAZY) // 필요할 때만 로딩
    private List<Address> addresses;
}

✔️ FetchType.LAZY 설정을 사용하면 필요할 때만 객체를 조회하여 성능을 최적화할 수 있습니다.

🎯 Summary

객체 그래프는 객체 간의 관계를 시각화한 구조이며, 데이터 바인딩, ORM, 직렬화에서 중요한 개념입니다.
순환 관계가 발생하면 무한 루프, StackOverflowError 등의 문제가 발생할 수 있습니다.
보안 문제를 방지하기 위해

  • @JsonIgnore, DTO 패턴, setAllowedFields() 등을 활용
  • 불필요한 데이터 노출 및 조작을 방지
    ORM에서 Lazy Loading을 설정하여 성능을 최적화

💡 객체 그래프를 이해하고 활용하면 웹 애플리케이션의 데이터 구조를 더 안전하고 효율적으로 관리할 수 있습니다! 🚀

'High Level Programming Language' 카테고리의 다른 글

생성자와 빌더  (0) 2023.06.04
Java Advanced Programming Quiz 문제 + 정답  (0) 2023.06.03
Package  (0) 2023.06.03
Basic Multilingual Plane (BMP)  (0) 2023.06.03
JVM 메모리 구조  (0) 2023.06.03