๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฑ… ๋ฆฌ๋ทฐ/ํด๋ฆฐ์ฝ”๋“œ

[ํด๋ฆฐ์ฝ”๋“œ] 6. ๊ฐ์ฒด์™€ ์ž๋ฃŒ ๊ตฌ์กฐ

์ฝ์€ ๋‚ ์งœ : 2024.09.04
์ง€์€์ด : ๋กœ๋ฒ„ํŠธ C. ๋งˆํ‹ด
์ถœํŒ์‚ฌ : ์ธ์‚ฌ์ดํŠธ

 

โœ”๏ธ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

1. ์ž๋ฃŒ ์ถ”์ƒํ™”

  • ๋ณ€์ˆ˜๋ฅผ private์œผ๋กœ ์„ ์–ธํ•˜๋”๋ผ๋„ ๊ฐ ๊ฐ’๋งˆ๋‹ค getter, setter๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๊ตฌํ˜„์„ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌํ˜„์„ ๋ชจ๋ฅธ ์ฑ„ ์ž๋ฃŒ์˜ ํ•ต์‹ฌ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

2. ์ž๋ฃŒ ๊ตฌ์กฐ vs ๊ฐ์ฒด

  • ์ž๋ฃŒ ๊ตฌ์กฐ : ์ž๋ฃŒ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์•„๋ฌด ๋ฉ”์„œ๋“œ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
public class Square {
   public Point topLeft;
   public double side;
}

public class Rectangle {
   public Point topLeft;
   public double height;
   public double width;
}

public class Circle {
   public Point center;
   public double radius;
}

public class Geometry {
   public final double PI = 3.14;

   public double area(Object shape) throws NoSuchShapeException {
      if (shape instanceof Square) {
         Square s = (Square) shape;
         return s.side * s.side;
      } else if (shape instanceof Rectangle) {
         Rectangle r = (Rectangle)shape;
         return r.height * r.width;
      } else if (shape instanceof Circle) {
         Circle c = (Circle)shape;
         return PI * c.radius * c.radius;
      }
      throw new NoSuchException();
   }
}

 

  • ์ž๋ฃŒ๋ฅผ ๊ฐ์ถ”๊ณ  ์ž๋ฃŒ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋งŒ ๊ณต๊ฐœํ•œ๋‹ค. (getter/setter๊ฐ€ ์•„๋‹˜!)
public class Square implements Shape {
   private Point topLeft;
   private double side;

   public double area() {
      return side * side;
   }
}

public class Rectangle implements Shape {
   private Point topLeft;
   private double height;
   private double width;

   public double area() {
      return height * width;
   }
}

public class Circle implements Shape {
   private Point center;
   private double radius;
   public final double PI = 3.14;

   public double area() {
      return PI * radius * radius
   }
}

 

 

  • ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ๊ฐ์ฒด๋Š” ์‚ฌ์‹ค์ƒ ๋ฐ˜๋Œ€์ด๋ฉด์„œ ์ƒํ˜ธ ๋ณด์™„์ ์ด๋‹ค.
    • ์ž๋ฃŒ ๊ตฌ์กฐ
      • ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ๋Š” ๊ธฐ์กด ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค. 
      • ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ๋Š” ์ƒˆ๋กœ์šด ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ธฐ์กด ํ•จ์ˆ˜๋“ค์ด ์ƒˆ๋กœ์šด ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ฐ์ฒด
      • ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ๋Š” ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฝ๋‹ค.
      • ๊ฐ์ฒด ์ง€ํ–ฅ ์ฝ”๋“œ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ธฐ์กด ํด๋ž˜์Šค์— ๋ชจ๋“  ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ์ฒด๋Š” ์•„๋‹ˆ๋ฉฐ, ๋•Œ๋กœ๋Š” ๋‹จ์ˆœํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ๊ฐ€ ์ ํ•ฉํ•œ ์ƒํ™ฉ๋„ ์žˆ๋‹ค.

 

3. ๋””๋ฏธํ„ฐ ๋ฒ•์น™

๊ฐœ๋…

  • ๋ชจ๋“ˆ์€ ์ž์‹ ์ด ์กฐ์ž‘ํ•˜๋Š” ๊ฐ์ฒด์˜ ์†์‚ฌ์ •์„ ๋ชฐ๋ผ์•ผ ํ•œ๋‹ค.

์ถœ์ฒ˜ : https://en.wikipedia.org/wiki/Law_of_Demeter

  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ๋””๋ฏธํ„ฐ ๋ฒ•์น™
    • ํด๋ž˜์Šค C์˜ ๋ฉ”์„œ๋“œ f๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. 
      • ํด๋ž˜์Šค C
      • f๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด
      • f ์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๊ฐ์ฒด
      • C ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ์ฒด
    • ๋˜ํ•œ, ์œ„ ๊ฐ์ฒด์—์„œ ํ—ˆ์šฉ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

์ถœ์ฒ˜ : https://en.wikipedia.org/wiki/Law_of_Demeter

 

์ถ”์ด์  ํƒ์ƒ‰์„ ํ”ผํ•˜๊ธฐ

  • ํ•œ ๋ชจ๋“ˆ์€ ์ฃผ๋ณ€ ๋ชจ๋“ˆ์„ ๋ชจ๋ฅผ์ˆ˜๋ก ์ข‹๋‹ค.
  • A๊ฐ€ B๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  B๊ฐ€ C๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ A๊ฐ€ C๋ฅผ ์•Œ์•„์•ผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

 

์ž๋ฃŒ ๊ตฌ์กฐ์™€ ๊ฐ์ฒด์˜ ํŠน์„ฑ์„ ํ˜ผํ•ฉํ•œ ์„ค๊ณ„๋ฅผ ํ”ผํ•˜๊ธฐ

  • ์ด๋ฅผํ…Œ๋ฉด ๊ณต๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ getter/setter๋„ ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กœ์šด ์ž๋ฃŒ ๊ตฌ์กฐ๋„, ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
// Bad โŒ 
class Rectangle {
    public int width;
    public int height;

    public int getArea() {
        return width * height;
    }
}

 

๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ์ถ”๊ธฐ

  • ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋“œ๋Ÿฌ๋‚ด์ง€ ๋ง๊ณ , ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์—๊ฒŒ '๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ผ'๊ณ  ๋งํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด๋•Œ ํ•จ์ˆ˜๋Š” ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜์—ฌ ์ง์ ‘์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋งŒ ํƒ์ƒ‰ํ•œ๋‹ค. 
    • ์ถ”์ƒํ™” ์ˆ˜์ค€์€ ํ•œ ๋‹จ๊ณ„๋งŒ ๋‚ด๋ ค๊ฐ€์•ผ ํ•œ๋‹ค. [p.392 ์ฐธ๊ณ ]
// Bad
String street = company.getManager().getAddress().getStreet();

// Good
String street = company.getManagerStreet();

 

4. ์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒด(Data Transfer Object, DTO)

  • ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์ „ํ˜•์ ์ธ ํ˜•ํƒœ๋Š” ๊ณต๊ฐœ ๋ณ€์ˆ˜๋งŒ ์žˆ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋กœ, ์ž๋ฃŒ ์ „๋‹ฌ ๊ฐ์ฒด๋ผ๊ณ ๋„ ํ•œ๋‹ค.
  • DTO๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ

  • DTO์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ
  • ๊ณต๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๋น„๊ณต๊ฐœ ๋ณ€์ˆ˜์— getter/setter๊ฐ€ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ง€๋งŒ, ๋Œ€๊ฒŒ save, find ๊ฐ™์€ ํ•จ์ˆ˜๋„ ์ œ๊ณตํ•œ๋‹ค.
  • ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ์— ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ด๋Ÿฐ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค. ์ž๋ฃŒ ๊ตฌ์กฐ๋„ ๊ฐ์ฒด๋„ ์•„๋‹Œ ํ˜ผํ•ฉ๋œ ๊ตฌ์กฐ๋‹ค.
  • ํ•ด๊ฒฐ์ฑ…์€ ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๋‹ด์œผ๋ฉด์„œ ๋‚ด๋ถ€ ์ž๋ฃŒ๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฐ์ฒด๋Š” ๋”ฐ๋กœ ์ƒ์„ฑํ•œ๋‹ค. 

 

5. ์š”์•ฝ

  • ์ƒˆ๋กœ์šด ์ž๋ฃŒ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค.
  • ์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๋Š” ์œ ์—ฐ์„ฑ์ด ํ•„์š”ํ•˜๋ฉด ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ์ ˆ์ฐจ์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค.

 

โœ”๏ธ ์˜ค๋Š˜ ์ฝ์€ ์†Œ๊ฐ

์ด๋ฒˆ ์žฅ์„ ์ฝ์œผ๋ฉด์„œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ private์œผ๋กœ ํ•˜๋ฉด TypeORM์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋กœ ๋งคํ•‘ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ์ผ์ด ๋– ์˜ฌ๋ž๋‹ค.

์ฆ‰, ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ public์œผ๋กœ ๋‘˜ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ๋œป์ธ๋ฐ์š”, ์ด๊ฑด JPA์™€ ํ™•์—ฐํžˆ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด๋‹ค.

์™œ TypeORM์—์„œ private ํ”„๋กœํผํ‹ฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”์ง€์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ, TypeORM GitHub ์ด์Šˆ์—์„œ ๊ฐœ๋ฐœ์ž์˜ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์žˆ์—ˆ๋‹ค.

์ถœ์ฒ˜: https://github.com/typeorm/typeorm/issues/3548

 

"If you want to send back only model with some method and no properties (or partially available) then maybe its good idea to have a separate model for that? And keep your entity as a only-schema-definition place? It's a perfect encapsulation."
"๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๋ช‡๊ฐ€์ง€์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ  ์†์„ฑ์ด ์—†๊ฑฐ๋‚˜ ์ผ๋ถ€ ์†์„ฑ๋งŒ ํฌํ•จ๋œ ๋ชจ๋ธ์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ๋ณ„๋„์˜ ๋ชจ๋ธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—”ํ‹ฐํ‹ฐ๋Š” ์Šคํ‚ค๋งˆ ์ •์˜๋งŒ์„ ์œ„ํ•œ ๊ณต๊ฐ„์œผ๋กœ ์œ ์ง€ํ•˜์„ธ์š”. ์ด๊ฒƒ์ด ์™„๋ฒฝํ•œ ์บก์Аํ™”์ž…๋‹ˆ๋‹ค."

 

DDD๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์—”ํ‹ฐํ‹ฐ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ์บก์Аํ™”๋œ ๋ชจ๋ธ ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ ๊ฐ™๋‹ค.

์ €๋Š” ์ด ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋ณด๊ณ  ํด๋ฆฐ ์ฝ”๋“œ์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์™€ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜์ž๋Š” ๊ด€์ ์—์„œ TypeORM์ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์„๊นŒ... ๋ผ๋Š” ์ถ”์ธก์„ ํ•ด๋ณด์•˜๋‹ค.

 

โœ”๏ธ ๊ถ๊ธˆํ•œ ๋‚ด์šฉ & ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š๋Š” ๋‚ด์šฉ

1. ๊ตฌํ˜„์„ ์™œ ๊ฐ์ถฐ์•ผ ํ•˜๋Š”๊ฐ€?

  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” '์บก์Аํ™”'๋ผ๊ณ  ํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ ‘๊ทผ์„ ๋ง‰์•„์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์—์„œ ์ž˜๋ชป ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ๋ณ€๊ฒฝ ๋กœ์ง์„ ํ•œ ๊ณณ์œผ๋กœ ์ œํ•œํ•˜์—ฌ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. [์ฐธ๊ณ ]
    • ๋˜ํ•œ ๋ณต์žกํ•œ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆจ๊ฒจ์„œ ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๋ฌธ์„œํ™”๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  • JavaScript ์บก์Аํ™” ๋ฐฉ๋ฒ• [์ฐธ๊ณ ] 
    • '#' prefix๋ฅผ ๋ถ™์—ฌ private ํ”„๋กœํผํ‹ฐ๋กœ ์„ค์ •ํ•œ๋‹ค.
    • protected ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์—์„œ ๊ด€์Šต์ ์œผ๋กœ protected ํ”„๋กœํผํ‹ฐ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ '_' prefix๋ฅผ ๋ถ™์ธ๋‹ค.
    • ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด getter๋งŒ ๋งŒ๋“ค๊ณ , setter๋Š” ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

 

2. ํ™œ์„ฑ ๋ ˆ์ฝ”๋“œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ํ˜ผํ•ฉ๋˜๋Š” ๊ฒƒ์ด ์™œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฐ€?

์ถœ์ฒ˜ : https://ko.wikipedia.org/wiki/%EC%95%A1%ED%8B%B0%EB%B8%8C_%EB%A0%88%EC%BD%94%EB%93%9C_%ED%8C%A8%ED%84%B4

  1. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ์˜ ๋‘ ๊ฐ€์ง€ ์—ญํ• ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ฝ”๋“œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์„ž์—ฌ ์œ ์ง€ ๋ณด์ˆ˜์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.

 

3. ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๋‹จ๊ณ„๋Š” ํ”„๋กœ์‹œ์ €(procedure) ๋˜๋Š” ํ•จ์ˆ˜๋กœ ํ‘œํ˜„๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฐ˜๋Œ€๋ง์ด ์•„๋‹ˆ๋‹ค!

 

4. ํœด๋ฆฌ์Šคํ‹ฑ(heuristic)

  • ์ปดํ“จํ„ฐํ•™ ์šฉ์–ด : ๋ฌธ์ œ ํ•ด๊ฒฐ์ด๋‚˜ ๊ฒฐ์ •์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ทœ์น™ ๋˜๋Š” ๊ฒฝํ—˜์ ์ธ ๋ฐฉ๋ฒ•
  • ์‹ฌ๋ฆฌํ•™ ์šฉ์–ด : ๋ณต์žกํ•œ ๊ณผ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ํŒ๋‹จ ์ž‘์—…์œผ๋กœ ๋‹จ์ˆœํ™”์‹œ์ผœ ์˜์‚ฌ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝํ–ฅ
  • ๊ฒฝ์ œํ•™ ์šฉ์–ด : ์–ด๋–ค ์‚ฌ์•ˆ ๋˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด ์—„๋ฐ€ํ•œ ๋ถ„์„์— ์˜ํ•˜๊ธฐ๋ณด๋‹ค ์ œํ•œ๋œ ์ •๋ณด๋งŒ์œผ๋กœ ์ฆ‰ํฅ์ , ์ง๊ด€์ ์œผ๋กœ ํŒ๋‹จ, ์„ ํƒํ•˜๋Š” ์˜์‚ฌ๊ฒฐ์ • ๋ฐฉ์‹

 

์ฐธ๊ณ 

Law of Demeter

์•กํ‹ฐ๋ธŒ ๋ ˆ์ฝ”๋“œ ํŒจํ„ด

private, protected ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ

Active Record vs Data Mapper

Support for private entity attributes (optional) #3548