์ต๊ทผ ํด๋ฆฐ์ฝ๋๋ฅผ ์ฝ๋ ์ค ๋๋ฏธํฐ ๋ฒ์น์ ๋ํด ์๊ฒ ๋์์ต๋๋ค. ์ฉ์ด ์์ฒด๋ ์์ํ๊ธด ํ๋ฐ ๋ฒ์น์ ๋ด์ฉ ์์ฒด๋ ํฌ๊ฒ ์ด๋ ต์ง ์๊ณ , ํ์์ ๊ฐ๋ฐ์์ ํํ ๋ง์ฃผ์น ์ ์๋ ๋ด์ฉ์ ๋ค๋ฃฌ ๋ฒ์น์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋๋ฏธํฐ ๋ฒ์น์ด๋?
๋๋ฏธํฐ ๋ฒ์น(Law of Demeter)์ ๋ฐ๋ฉํ ๋ฅด ๋ฒ์น์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ์ค์ฌ์ LoD๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค. ์ด ๋ฒ์น์ "์ต์ํ์ ์ง์ ์์น(The Principle of Least Knowledge)์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ๋ชจ๋์ ์์ ์ด ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ๋ชฐ๋ผ์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ค์ ๋ก Demeter๋ผ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ฐ๋ฐ์๋ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํด ์ง๋์น๊ฒ ๋ง์ ์ ๋ณด๋ฅผ ์๊ณ ์๋ค ๋ณด๋, ์๋ก์ ๋ํ ๊ฒฐํฉ๋๊ฐ ๋์์ง๊ณ ์ด๋ก ์ธํด ์ข์ง ๋ชปํ ์ค๊ณ๋ฅผ ์ผ๊ธฐํ๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๋ฅผ ๊ฐ์ ํ๊ณ ์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ด๋ ํ ์๋ฃ(๋ด๋ถ ๊ตฌ์กฐ)๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์จ๊ธฐ๊ณ ํจ์๋ฅผ ํตํด ๊ณต๊ฐํ๊ฒ ๋ง๋ค์๋๋ฐ ์ด๊ฒ์ด ๋ฐ๋ก ๋๋ฏธํฐ ๋ฒ์น์ ๋๋ค.
์ฆ, ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ์ฌ๋ฌ๊ฐ์ .(dot)์ ์ต๋ํ ์ฌ์ฉํ์ง ๋ง๋ผ๋ ๋ฒ์น์ผ๋ก ๋งํ ์ ์์ผ๋ฉฐ, ๋๋ฏธํฐ ๋ฒ์น์ ์ค์ํ๊ฒ ๋๋ฉด ์บก์ํ๋ฅผ ๋์ฌ ๊ฐ์ฒด์ ์์จ์ฑ๊ณผ ์์ง๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ํ๋ฒ ์ง์ ์ ์ธ ์์๋ฅผ ํตํด ์ข ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
๋๋ฏธํฐ ๋ฒ์น ์์
@Getter
public class Employee {
private final String name;
private final Enterprise enterprise;
public int getEnterprisePostalCode() {
return this.enterprise.getAddressPostalCode();
}
}
@Getter
public class Enterprise {
private final int employeeNumber;
private final String domain;
private final Address address;
public int getAddressPostalCode() {
return this.address.getPostalCode();
}
}
@Getter
public class Address {
private final String street;
private final int postalCode;
private final String city;
}
์์ ๊ฐ์ด Employee, Enterprise, Address ํด๋์ค๊ฐ ์ ์๋์ด ์๊ณ , ์ง์์ด ์ํ ํ์ฌ์ ์ฐํธ๋ฒํธ๋ฅผ ๊ฒ์ํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class App {
public static void main(String[] args) {
final Address address = new Address("์ข
๋ก๊ตฌ ์ฒญ์๋๋ก 1", 03054, "์์ธํน๋ณ์");
final Enterprise enterprise = new Enterprise(100, "์ฒญ์๋", address);
final Employee employee = new Employee("์์ฃผํ", enterprise);
// 1๋ฒ - ๋๋ฏธํฐ ๋ฒ์น ์๋ฐ ์ฝ๋!!
System.out.println(employee.getEnterprise().getAddress().getPostalCode());
// 2๋ฒ - ๋๋ฏธํฐ ๋ฒ์น ์ค์ ์ฝ๋!!
System.out.println(employee.getEnterprisePostalCode());
}
}
์์ ๋ ๋ก์ง์ ์ ๋ง ํํ๊ฒ ๋ณผ ์ ์๋ ์ฝ๋์ด์ง๋ง ํ๋๋ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ ์ฝ๋์ ๋๋ค. ๋ ๋ค ํ์ฌ์ ์ฐํธ๋ฒํธ๋ฅผ ์ป๋ ๋ก์ง์ด์ง๋ง 1๋ฒ์ ๊ฒฝ์ฐ๋ 2๋ฒ๊ณผ ๋ฌ๋ฆฌ ๊ฐ์ฒด์๊ฒ ์ฐํธ๋ฒํธ๋ฅผ ์ป์ด์ค๊ธฐ ์ํ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ด ์๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ์๋ฃ๋ฅผ ์ง์ ํ์ธํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฒ์์ ๋งํ๋ ๋ฌธ์ ์ธ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ด๋ ํ ์๋ฃ๋ฅผ ๊ฐ๊ณ ์๋์ง ์ง๋์น๊ฒ ์ ์๊ฒ ๋ฉ๋๋ค.
2๋ฒ์ ๊ฒฝ์ฐ๋ 1๋ฒ์ ์ฝ๋์ฒ๋ผ ์ฌ๋ฌ๊ฐ์ .(dot)๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐํ์ง ์๊ณ , ํจ์๋ผ๋ ๋ฉ์์ง๋ฅผ ํตํด ์๋ฃ๋ฅผ ์ ๊ณต๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ฏธํฐ ๋ฒ์น์ ์ ์ค์ํ๋ ์ฝ๋๊ฐ ๋ฉ๋๋ค.
์ฆ, A์์ C์ ์ ๋ณด๋ฅผ ์ป์ด ์ค๊ธฐ ์ํ ๋ฐฉ๋ฒ์ C์์ B๋ก, B์์ A๋ก ๊ฐ์ ์บก์ํํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ค๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์์ธ
๋จ, DTO์ ์๋ฃ๊ตฌ์กฐ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ๋ ๊ฒ์ด ๋น์ฐํ๋ฏ๋ก ๋๋ฏธํฐ ๋ฒ์น์ ์ ์ฉํ์ง ์์ต๋๋ค. ๋ํ Java Stream API์ฒ๋ผ ๋ฉ์๋ ์ฒด์ด๋(method chaining)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ์ง ์์ต๋๋ค. ๋๋ฏธํฐ ๋ฒ์น์ ๊ฒฐํฉ๋์ ๊ด๋ จ๋ ์ด์ผ๊ธฐ์ด๋ฏ๋ก, ๋ณธ์ง์ ์๊ณ .(dot)์ ๋งค๋ชฐ๋์ด์๋ ์ ๋ฉ๋๋ค.
์ ๋ฆฌ
์ ๋ฆฌํ์๋ฉด ๋๋ฏธํฐ์ ๋ฒ์น์ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ธ๋ถ๋ก ๋๋ฌ๋ด์ง ์๋ ๊ฒ์ด ์ค์ํ๋ฉฐ ์ด๋ฅผ ์ค์ํ๊ธฐ ์ํด ๊ฐ์ฒด ๊ฐ .(dot)๋ฅผ ์ต๋ํ ์ฐ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ต์ข ์ ์ผ๋ก ๋๋ฏธํฐ์ ๋ฒ์น์ ์ค์ํจ์ผ๋ก์จ ๊ฐ์ฒด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๊ณ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
- https://1kevinson.com/the-law-of-demeter/
- https://mangkyu.tistory.com/147
- ํด๋ฆฐ์ฝ๋ 6์ฅ
'BackEnd๐ฑ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผ๊ธ ์ปฌ๋ ์ (First-Class Collection)์ด๋? (0) | 2023.04.12 |
---|---|
Java์ ๊ธฐ๋ณธ ํจ์ํ ์ธํฐํ์ด์ค (0) | 2023.03.20 |
Java์ ์์ธ ์์ฑ ๋น์ฉ์ ๋น์ธ๋ค (0) | 2023.03.10 |
์๋ฐ์์ ๋์์ฑ์ ํด๊ฒฐํ๋ ๋ค์ํ ๋ฐฉ๋ฒ๊ณผ Redis์ ๋ถ์ฐ๋ฝ (5) | 2023.01.08 |
ํด์ ์๋ฃ๊ตฌ์กฐ์, ํด์ ์ถฉ๋ ๊ทธ๋ฆฌ๊ณ Java์ HashMap ๋์ ๋ฐฉ๋ฒ (1) | 2022.12.30 |
[Java] Checked Exception๊ณผ UnChecked Exception (2) | 2022.12.18 |
๋๊ธ