์ฝ์ ๋ ์ง : 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. ๋๋ฏธํฐ ๋ฒ์น
๊ฐ๋
- ๋ชจ๋์ ์์ ์ด ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ๋ชฐ๋ผ์ผ ํ๋ค.
- ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์์ ๋๋ฏธํฐ ๋ฒ์น
- ํด๋์ค C์ ๋ฉ์๋ f๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถํด์ผ ํ๋ค.
- ํด๋์ค C
- f๊ฐ ์์ฑํ ๊ฐ์ฒด
- f ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด
- C ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ฒด
- ๋ํ, ์ ๊ฐ์ฒด์์ ํ์ฉ๋ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํธ์ถํ๋ฉด ์ ๋๋ค.
- ํด๋์ค C์ ๋ฉ์๋ f๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถํด์ผ ํ๋ค.
์ถ์ด์ ํ์์ ํผํ๊ธฐ
- ํ ๋ชจ๋์ ์ฃผ๋ณ ๋ชจ๋์ ๋ชจ๋ฅผ์๋ก ์ข๋ค.
- 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 ์ด์์์ ๊ฐ๋ฐ์์ ์๋์ ๊ฐ์ ์ฝ๋ฉํธ๊ฐ ์์๋ค.
"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. ํ์ฑ ๋ ์ฝ๋์ ๋น์ฆ๋์ค ๊ท์น์ด ํผํฉ๋๋ ๊ฒ์ด ์ ๋ฌธ์ ๊ฐ ๋๋๊ฐ?
- ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ์ ๋ ๊ฐ์ง ์ญํ ์ ๋์์ ์ํํ์ฌ ๋จ์ผ ์ฑ ์ ์์น์ ์๋ฐํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์ฝ๋์ ๋น์ฆ๋์ค ๋ก์ง์ด ์์ฌ ์ ์ง ๋ณด์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด ๋จ์ ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋ค.
3. ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ
- ํ๋ก๊ทธ๋จ์ ์ํํด์ผ ํ๋ ์ผ๋ จ์ ๋จ๊ณ๋ก ๋๋๊ณ , ๊ฐ ๋จ๊ณ๋ ํ๋ก์์ (procedure) ๋๋ ํจ์๋ก ํํ๋๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐ๋๋ง์ด ์๋๋ค!
4. ํด๋ฆฌ์คํฑ(heuristic)
- ์ปดํจํฐํ ์ฉ์ด : ๋ฌธ์ ํด๊ฒฐ์ด๋ ๊ฒฐ์ ์ ์ํด ์ฌ์ฉ๋๋ ๊ท์น ๋๋ ๊ฒฝํ์ ์ธ ๋ฐฉ๋ฒ
- ์ฌ๋ฆฌํ ์ฉ์ด : ๋ณต์กํ ๊ณผ์ ๋ฅผ ๊ฐ๋จํ ํ๋จ ์์ ์ผ๋ก ๋จ์ํ์์ผ ์์ฌ ๊ฒฐ์ ํ๋ ๊ฒฝํฅ
- ๊ฒฝ์ ํ ์ฉ์ด : ์ด๋ค ์ฌ์ ๋๋ ์ํฉ์ ๋ํด ์๋ฐํ ๋ถ์์ ์ํ๊ธฐ๋ณด๋ค ์ ํ๋ ์ ๋ณด๋ง์ผ๋ก ์ฆํฅ์ , ์ง๊ด์ ์ผ๋ก ํ๋จ, ์ ํํ๋ ์์ฌ๊ฒฐ์ ๋ฐฉ์
์ฐธ๊ณ
private, protected ํ๋กํผํฐ์ ๋ฉ์๋
Support for private entity attributes (optional) #3548
'์ฑ ๋ฆฌ๋ทฐ > ํด๋ฆฐ์ฝ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํด๋ฆฐ์ฝ๋] 5. ํ์ ๋ง์ถ๊ธฐ (0) | 2024.08.29 |
---|---|
[ํด๋ฆฐ์ฝ๋] 4. ์ฃผ์ (0) | 2024.08.27 |
[ํด๋ฆฐ์ฝ๋] 3. ํจ์ (0) | 2024.08.26 |
[ํด๋ฆฐ์ฝ๋] 2. ์๋ฏธ ์๋ ์ด๋ฆ (0) | 2024.08.19 |
[ํด๋ฆฐ์ฝ๋] 1. ๊นจ๋ํ ์ฝ๋ (0) | 2024.08.14 |