2023. 6. 3. 18:09ㆍHigh 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;
}
✔️ 위의 예시에서 Person
은 Address
를 참조하고, Address
는 City
를 포함하고 있습니다.
✔️ 이를 객체 그래프로 표현하면 다음과 같습니다.
Person → Address → City
💡 즉, 객체 간의 연관관계가 어떻게 구성되는지 표현하는 것이 객체 그래프입니다.
2️⃣ 중첩 객체 (Nested Objects)
📌 객체가 다른 객체를 포함하는 구조를 의미합니다.
📌 JSON 변환, 데이터 바인딩, ORM에서 중첩 객체가 중요한 역할을 합니다.
{
"name": "Alice",
"address": {
"street": "123 Main St",
"city": {
"name": "New York"
}
}
}
✔️ 위의 JSON은 Person
객체가 Address
를 포함하고, Address
가 City
를 포함하는 객체 그래프를 나타냅니다.
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 Loading
과 Eager 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 |