๐ญ Chapter 6: ๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ
๋ณ์๋ฅผ ๋น๊ณต๊ฐ(private)๋ก ์ ์ํ๋ ์ด์ ๊ฐ ์๋ค. ๋จ๋ค์ด ๋ณ์์ ์์กดํ์ง ์๊ฒ ๋ง๋ค๊ณ ์ถ์ด์๋ค. ์ถฉ๋์ด๋ ๋ณ๋์ด๋ , ๋ณ์ ํ์ ์ด๋ ๊ตฌํ์ ๋ง๋๋ก ๋ฐ๊พธ๊ณ ์ถ์ด์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์งธ์ ์๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์กฐํ(get) ํจ์์ ์ค์ (set) ํจ์๋ฅผ ๋น์ฐํ๊ฒ ๊ณต๊ฐ(public)ํด ๋น๊ณต๊ฐ ๋ณ์๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ ๊น?
๐ ์๋ฃ ์ถ์ํโ
๋ค์ ๋ ์์ ์ ์ฐจ์ด๋ฅผ ์ดํด๋ณด์. ๋ ํด๋์ค ๋ชจ๋ 2์ฐจ์ ์ ์ ํํํ๋ค. ๊ทธ๋ฐ๋ฐ ํ ํด๋์ค๋ ๊ตฌํ์ ์ธ๋ถ๋ก ๋ ธ์ถํ๊ณ ๋ค๋ฅธ ํด๋์ค๋ ๊ตฌํ์ ์์ ํ ์จ๊ธด๋ค.
public class Point {
public double x;
public double y;
}
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
์ ๋ง ๋ฉ์ง๊ฒ๋, ๋ ๋ฒ์งธ ์์ ๋ ์ ์ด ์ง๊ต์ขํ๊ณ๋ฅผ ์ฌ์ฉํ๋์ง ๊ทน์ขํ๊ณ๋ฅผ ์ฌ์ฉํ๋์ง ์ ๊ธธ์ด ์๋ค. ๋ ๋ค ์๋์ง๋ ๋ชจ๋ฅธ๋ค! ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ธํฐํ์ด์ค๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ช ๋ฐฑํ๊ฒ ํํํ๋ค.
๋ณ์ ์ฌ์ด์ ํจ์๋ผ๋ ๊ณ์ธต์ ๋ฃ๋๋ค๊ณ ๊ตฌํ์ด ์ ์ ๋ก ๊ฐ์ถฐ์ง์ง๋ ์๋๋ค. ๊ตฌํ์ ๊ฐ์ถ๋ ค๋ฉด ์ถ์ํ๊ฐ ํ์ํ๋ค! ๊ทธ์ ์กฐํ ํจ์์ ์ค์ ํจ์๋ก ๋ณ์๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ํด๋์ค๊ฐ ๋์ง๋ ์๋๋ค. ๊ทธ๋ณด๋ค๋ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด ์ฌ์ฉ์๊ฐ ๊ตฌํ์ ๋ชจ๋ฅธ ์ฑ ์๋ฃ์ ํต์ฌ์ ์กฐ์ํ ์ ์์ด์ผ ์ง์ ํ ์๋ฏธ์ ํด๋์ค๋ค.
๋ค์ ๋ ์์ ๋ฅผ ์ดํด๋ณด์. ์ฒซ ๋ฒ์งธ ์์ ๋ ์๋์ฐจ ์ฐ๋ฃ ์ํ๋ฅผ ๊ตฌ์ฒด์ ์ธ ์ซ์ ๊ฐ์ผ๋ก ์๋ ค์ค๋ค. ๋ ๋ฒ์งธ ์์ ๋ ์๋์ฐจ ์ฐ๋ฃ ์ํ๋ฅผ ๋ฐฑ๋ถ์จ์ด๋ผ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ์๋ ค์ค๋ค. ์ฒซ ๋ฒ์งธ ์์ ๋ ๋ ํจ์๊ฐ ๋ณ์๊ฐ์ ์ฝ์ด ๋ฐํํ ๋ฟ์ด๋ผ๋ ์ฌ์ค์ด ๊ฑฐ์ ํ์คํ๋ค. ๋ ๋ฒ์งธ ์์ ๋ ์ ๋ณด๊ฐ ์ด๋์ ์ค๋์ง ์ ํ ๋๋ฌ๋์ง ์๋๋ค.
// ๊ตฌ์ฒด์ ์ธ Vehicle ํด๋์ค
public interface Vehicle {
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
// ์ถ์์ ์ธ Vehicle ํด๋์ค
public interface Vehicle {
double getPercentFuelRemaining();
}
์๋ฃ๋ฅผ ์ธ์ธํ๊ฒ ๊ณต๊ฐํ๊ธฐ๋ณด๋ค๋ ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ํํํ๋ ํธ์ด ์ข๋ค. ์ธํฐํ์ด์ค๋ ์กฐํ/์ค์ ํจ์๋ง์ผ๋ก๋ ์ถ์ํ๊ฐ ์ด๋ค์ง์ง ์๋๋ค. ๊ฐ๋ฐ์๋ ๊ฐ์ฒด๊ฐ ํฌํจํ๋ ์๋ฃ๋ฅผ ํํํ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ๊ฐํ๊ฒ ๊ณ ๋ฏผํด์ผ ํ๋ค. ์๋ฌด ์๊ฐ ์์ด ์กฐํ/์ค์ ํจ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๋์๋ค.
๐ ์๋ฃ/๊ฐ์ฒด ๋น๋์นญโ
๊ฐ์ฒด๋ ์ถ์ํ ๋ค๋ก ์๋ฃ๋ฅผ ์จ๊ธด ์ฑ ์๋ฃ๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ง ๊ณต๊ฐํ๋ค. ์๋ฃ ๊ตฌ์กฐ๋ ์๋ฃ๋ฅผ ๊ทธ๋๋ก ๊ณต๊ฐํ๋ฉฐ ๋ณ๋ค๋ฅธ ํจ์๋ ์ ๊ณตํ์ง ์๋๋ค. ๋ ์ ์๋ ๋ณธ์ง์ ์ผ๋ก ์๋ฐ๋๋ค. ๋ ๊ฐ๋ ์ ์ฌ์ค์ ์ ๋ฐ๋๋ค. ์ฌ์ํ ์ฐจ์ด๋ก ๋ณด์ผ์ง ๋ชจ๋ฅด์ง๋ง ๊ทธ ์ฐจ์ด๊ฐ ๋ฏธ์น๋ ์ํฅ์ ๊ต์ฅํ๋ค.
๋ค์ ์์ ๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ํ ํด๋์ค๋ค. ์ฌ๊ธฐ์ area()
๋ ๋คํ ๋ฉ์๋๋ค. ์ธ ๋ํ์ ์ถ๊ฐํด๋ ๊ธฐ์กด ํจ์์ ์๋ฌด๋ฐ ํํฅ์ ๋ฏธ์น์ง ์๋๋ค.
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.141592653589793;
public double area() {
return PI * radius * radius;
}
}
(์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋) ์ ์ฐจ์ ์ธ ์ฝ๋๋ ๊ฐ์กด ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค. ๋ฐ๋ฉด, ๊ฐ์ฒด์งํฅ ์ฝ๋๋ ๊ธฐ์กด ํจ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
์ ์ฐจ์ ์ธ ์ฝ๋๋ ์๋ก์ด ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ๋ชจ๋ ํจ์๋ฅผ ๊ณ ์ณ์ผ ํ๋ค. ๊ฐ์ฒด์งํฅ ์ฝ๋๋ ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ๋ชจ๋ ํด๋์ค๋ฅผ ๊ณ ์ณ์ผ ํ๋ค.
๋ค์ ๋งํด, ๊ฐ์ฒด ์งํฅ ์ฝ๋์์ ์ด๋ ค์ด ๋ณ๊ฒฝ์ ์ ์ฐจ์ ์ธ ์ฝ๋์์ ์ฌ์ฐ๋ฉฐ, ์ ์ฐจ์ ์ธ ์ฝ๋์์ ์ด๋ ค์ด ๋ณ๊ฒฝ์ ๊ฐ์ฒด ์งํฅ ์ฝ๋์์ ์ฝ๋ค!
๋ณต์กํ ์์คํ ์ ์ง๋ค ๋ณด๋ฉด ์๋ก์ด ํจ์๊ฐ ์๋๋ผ ์๋ก์ด ์๋ฃ ํ์ ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ์ด๋๋ ํด๋์ค์ ๊ฐ์ฒด ์งํฅ ๊ธฐ๋ฒ์ด ๊ฐ์ฅ ์ ํฉํ๋ค. ๋ฐ๋ฉด, ์๋ก์ด ์๋ฃ ํ์ ์ด ์๋๋ผ ์๋ก์ด ํจ์๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ์๊ธด๋ค. ์ด๋๋ ์ ์ฐจ์ ์ธ ์ฝ๋์ ์๋ฃ ๊ตฌ์กฐ๊ฐ ์ข ๋ ์ ํฉํ๋ค.
๐ ๋๋ฏธํฐ ๋ฒ์นโ
๋๋ฏธํฐ ๋ฒ์น์ ์ ์๋ ค์ง ํด๋ฆฌ์คํฑ์ผ๋ก, ๋ชจ๋์ ์์ ์ด ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ๋ชฐ๋ผ์ผ ํ๋ค๋ ๋ฒ์น์ด๋ค. ๊ฐ์ฒด๋ ์๋ฃ๋ฅผ ์จ๊ธฐ๊ณ ํจ์๋ฅผ ๊ณต๊ฐํ๋ค. ์ฆ, ๊ฐ์ฒด๋ ์กฐํ ํจ์๋ก ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ณต๊ฐํ๋ฉด ์ ๋๋ค๋ ์๋ฏธ๋ค. ๊ทธ๋ฌ๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ (์จ๊ธฐ์ง ์๊ณ ) ๋ ธ์ถํ๋ ์ ์ด๋๊น. ์ข ๋ ์ ํํ ํํํ์๋ฉด, ๋๋ฏธํฐ ๋ฒ์น์ "ํด๋์ค C์ ๋ฉ์๋ f๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๋ง ํธ์ถํด์ผ ํ๋ค"๊ณ ์ฃผ์ฅํ๋ค.
- ํด๋์ค C
- f๊ฐ ์์ฑํ ๊ฐ์ฒด
- f ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด
- C ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ฒด
ํ์ง๋ง ์ ๊ฐ์ฒด์์ ํ์ฉ๋ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ ํธ์ถํ๋ฉด ์ ๋๋ค. ๋ค์ ๋งํด, ๋ฏ์ ์ฌ๋์ ๊ฒฝ๊ณํ๊ณ ์น๊ตฌ๋๋ง ๋๋ผ๋ ์๋ฏธ๋ค.
๋ค์ ์ฝ๋๋ ๋๋ฏธํฐ ๋ฒ์น์ ์ด๊ธฐ๋ ๋ฏ์ด ๋ณด์ธ๋ค. getOptions()
ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ getScratchDir()
ํจ์๋ฅผ ํธ์ถํ ํ getScratchDir()
ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ getAbsolutePath()
ํจ์๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ด๋ค.
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
๐ ๊ธฐ์ฐจ ์ถฉ๋โ
ํํ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ธฐ์ฐจ ์ถฉ๋(train wreck)์ด๋ผ ๋ถ๋ฅธ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์กฐ์กํ๋ค ์ฌ๊ฒจ์ง๋ ๋ฐฉ์์ด๋ฏ๋ก ํผํ๋ ํธ์ด ์ข๋ค. ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋๋ ํธ์ด ์ข๋ค.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
์ ์์ ๊ฐ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋์ง ์ฌ๋ถ๋ ctxt
, Options
, ScratchDir
์ด ๊ฐ์ฒด์ธ์ง ์๋๋ฉด ์๋ฃ ๊ตฌ์กฐ์ธ์ง์ ๋ฌ๋ ธ๋ค. ๊ฐ์ฒด๋ผ๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์จ๊ฒจ์ผ ํ๋ฏ๋ก ํ์คํ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ค. ๋ฐ๋ฉด, ์๋ฃ ๊ตฌ์กฐ๋ผ๋ฉด ๋น์ฐํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋
ธ์ถํ๋ฏ๋ก ๋๋ฏธํฐ ๋ฒ์น์ด ์ ์ฉ๋์ง ์๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ์์ ๋ ์กฐํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋์ ํผ๋์ ์ผ์ผํจ๋ค. ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ตฌํํ๋ค๋ฉด ๋๋ฏธํฐ ๋ฒ์น์ ๊ฑฐ๋ก ํ ํ์๊ฐ ์์ด์ง๋ค.
final String outputDir = ctxt.options.scratchDir.absolutePath;
์๋ฃ ๊ตฌ์กฐ๋ ๋ฌด์กฐ๊ฑด ํจ์ ์์ด ๊ณต๊ฐ ๋ณ์๋ง ํฌํจํ๊ณ ๊ฐ์ฒด๋ ๋น๊ณต๊ฐ ๋ณ์์ ๊ณต๊ฐ ํจ์๋ฅผ ํฌํํ๋ค๋ฉด, ๋ฌธ์ ๋ ํจ์ฌ ๊ฐ๋จํ๋ฆฌ๋ผ. ํ์ง๋ง ๋จ์ํ ์๋ฃ ๊ตฌ์กฐ์๋ ์กฐํ ํจ์์ ์ค์ ํจ์๋ฅผ ์ ์ํ๋ผ ์๊ตฌํ๋ ํ๋ ์์ํฌ์ ํ์ค์ด ์กด์ฌํ๋ค.
๐ ์ก์ข ๊ตฌ์กฐโ
์ด๋ฐ ํผ๋์ผ๋ก ๋ง๋ฏธ์์ ๋๋๋ก ์ ๋ฐ์ ๊ฐ์ฒด, ์ ๋ฐ์ ์๋ฃ ๊ตฌ์กฐ์ธ ์ก์ข ๊ตฌ์กฐ๊ฐ ๋์จ๋ค. ์ก์ข ๊ตฌ์กฐ๋ ์ค์ํ ๊ธฐ๋ฅ์ ์ํํ๋ ํจ์๋ ์๊ณ , ๊ณต๊ฐ ๋ณ์๋ ๊ณต๊ฐ ์กฐํ/์ค์ ํจ์๋ ์๋ค. ๊ณต๊ฐ ์กฐํ/์ค์ ํจ์๋ ๋น๊ณต๊ฐ ๋ณ์๋ฅผ ๊ทธ๋๋ก ๋ ธ์ถํ๋ค. ๋ํ์ ๋ค๋ฅธ ์ ์ฐจ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ์๋ฃ ๊ตฌ์กฐ ์ ๊ทผ ๋ฐฉ์์ฒ๋ผ ๋น๊ณต๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ํ ์ ํน์ ๋น ์ง๊ธฐ ์ญ์์ด๋ค.
์ด๋ฐ ์ก์ข ๊ตฌ์กฐ๋ ์๋ก์ด ํจ์๋ ๋ฌผ๋ก ์ด๊ณ ์๋ก์ด ์๋ฃ ๊ตฌ์กฐ๋ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ์์ชฝ ์ธ์์์ ๋จ์ ๋ง ๋ชจ์๋์ ๊ตฌ์กฐ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ก์ข ๊ตฌ์กฐ๋ ๋๋๋ก ํผํ๋ ํธ์ด ์ข๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ํจ์ ํ์ ์ ๋ณดํธํ ์ง ๊ณต๊ฐํ ์ง ํ์ ํ์ง ๋ชปํด ์ด์ค๊ฐํ๊ฒ ๋ด๋์ ์ค๊ณ์ ๋ถ๊ณผํ๋ค.
๐ ๊ตฌ์กฐ์ฒด ๊ฐ์ถ๊ธฐโ
๋ง์ฝ ctxt
, options
, scratchDir
์ด ์ง์ง ๊ฐ์ฒด๋ผ ๋ฉด? ์์ ์ฝ๋ ์์ ์ฒ๋ผ ์ค์ค์ด ์ฌํ์ผ๋ก ์ฎ์ด์๋ ์ ๋๋ค. ๊ฐ์ฒด๋ผ๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถฐ์ผ ํ๋๊น. ๊ทธ๋ ๋ค๋ฉด ์์ ๋๋ ํฐ๋ฆฌ์ ์ ๋ ๊ฒฝ๋ก๋ ์ด๋ป๊ฒ ์ป์ด์ผ ์ข์๊น?
ctxt.getAbsolutePathOfScratchDirectoryOption();
ctx.getScratchDirectoryOption().getAbsolutePath();
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ctxt
๊ฐ์ฒด์ ๊ณต๊ฐํด์ผ ํ๋ ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์์ง๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ getScratchDirectoryOption()
์ด ๊ฐ์ฒด๊ฐ ์๋๋ผ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ฐํํ๋ค๊ณ ๊ฐ์ ํ๋ค. ์ด๋ ๋ฐฉ๋ฒ๋ ์ฉ ๋ดํค์ง ์๋๋ค.
ctxt
๊ฐ ๊ฐ์ฒด๋ผ๋ฉด ๋ญ๊ฐ๋ฅผ ํ๋ผ๊ณ ๋งํด์ผ์ง ์์ ๋๋ฌ๋ด๋ผ๊ณ ๋งํ๋ฉด ์ ๋๋ค. ๋ค์์ ๊ฐ์ ๋ชจ๋์์ ๊ฐ์ ธ์จ ์ฝ๋๋ค.
String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutStream(outFile);
BufferOutputStream bos = new BufferedOutputStream(fout);
์ถ์ํ ์์ค์ ๋ค์์ด ๋์ ๋ค์ ๋ถํธํ๋ค. ์ , ์ฌ๋์, ํ์ผ ํ์ฅ์, File
๊ฐ์ฒด๋ฅผ ๋ถ์ฃผ์ํ๊ฒ ๋ง๊ตฌ ๋ค์์ผ๋ฉด ์ ๋๋ค. ์ด์ฐ ๋์๊ฑฐ๋, ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, ์์ ๋๋ ํฐ๋ฆฌ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ป์ผ๋ ค๋ ์ด์ ๊ฐ ์์ ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ผ๋ ์ฌ์ค์ด ๋๋ฌ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ctxt
๊ฐ์ฒด์ ์์ ํ์ผ์ ์์ฑํ๋ผ๊ณ ์ํค๋ฉด ์ด๋จ๊น?
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
๊ฐ์ฒด์ ๋งก๊ธฐ๊ธฐ์ ์ ๋นํ ์๋ฌด๋ก ๋ณด์ธ๋ค! ctxt
๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋๋ฌ๋ด์ง ์์ผ๋ฉฐ, ๋ชจ๋์์ ํด๋น ํจ์๋ ์์ ์ด ๋ชฐ๋ผ์ผ ํ๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ํ์ํ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ์ง ์๋๋ค.
๐ ์๋ฃ ์ ๋ฌ ๊ฐ์ฒดโ
์๋ฃ ๊ตฌ์กฐ์ฒด์ ์ ํ์ ์ธ ํํ๋ ๊ณต๊ฐ ๋ณ์๋ง ์๊ณ ํจ์๊ฐ ์๋ ํด๋์ค๋ค. ์ด๋ฐ ์๋ฃ ๊ตฌ์กฐ์ฒด๋ฅผ ๋๋ก๋ ์๋ฃ ์ ๋ฌ ๊ฐ์ฒด(Data Transfer Object, DTO)๋ผ ํ๋ค. DTO๋ ๊ต์ฅํ ์ ์ฉํ ๊ตฌ์กฐ์ฒด๋ค. ํนํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๊ฑฐ๋ ์์ผ์์ ๋ฐ์ ๋ฉ์์ง์ ๊ตฌ๋ฌธ์ ๋ถ์ํ ๋ ์ ์ฉํ๋ค.
์ข ๋ ์ผ๋ฐ์ ์ธ ํํ๋ ๋น(bean) ๊ตฌ์กฐ๋ค. ๋น์ ๋น๊ณต๊ฐ(private) ๋ณ์๋ฅผ ์กฐํ/์ค์ ํจ์๋ก ์กฐ์ํ๋ค. ์ผ์ข ์ ์ฌ์ด๋น ์บก์ํ๋ก, ์ผ๋ถ OO ์์์ฃผ์์๋ ๋ง์กฑ์ํฌ ๋ฟ ๋ณ๋ค๋ฅธ ์ด์ต์ ์ ๊ณตํ์ง ์๋๋ค.
๐ ํ์ฑ ๋ ์ฝ๋โ
ํ์ฑ ๋ ์ฝ๋๋ DTO์ ํน์ํ ํํ๋ค. ๊ณต๊ฐ ๋ณ์๊ฐ ์๊ฑฐ๋ ๋น๊ณต๊ฐ ๋ณ์์ ์กฐํ/์ค์ ํจ์๊ฐ ์๋ ์๋ฃ ๊ตฌ์กฐ์ง๋ง, ๋๊ฒ save
๋ find
์ ๊ฐ์ ํ์ ํจ์๋ ์ ๊ณตํ๋ค. ํ์ฑ ๋ ์ฝ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ด๋ ๋ค๋ฅธ ์์ค์์ ์๋ฃ๋ฅผ ์ง์ ๋ณํํ ๊ฒฐ๊ณผ๋ค.
๋ถํํ๋ ํ์ฑ ๋ ์ฝ๋์ ๋น์ฆ๋์ค ๊ท์น ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ์ด๋ฐ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ ๊ฐ๋ฐ์๊ฐ ํํ๋ค. ํ์ง๋ง ์ด๋ ๋ฐ๋์งํ์ง ์๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฃ ๊ตฌ์กฐ๋ ์๋๊ณ ๊ฐ์ฒด๋ ์๋ ์ก์ข ๊ตฌ์กฐ๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๊ฒฐ์ฑ ์ ๋น์ฐํ๋ค. ํ์ฑ ๋ ์ฝ๋๋ ์๋ฃ ๊ตฌ์กฐ๋ก ์ทจ๊ธํ๋ค. ๋น์ฆ๋์ค ๊ท์น์ ๋ด์ผ๋ฉด์ ๋ด๋ถ ์๋ฃ๋ฅผ ์จ๊ธฐ๋ ๊ฐ์ฒด๋ ๋ฐ๋ก ์์ฑํ๋ค. (์ฌ๊ธฐ์ ๋ด๋ถ ์๋ฃ๋ ํ์ฑ ๋ ์ฝ๋์ ์ธ์คํด์ค์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.)
๐ ๊ฒฐ๋ก โ
๊ฐ์ฒด๋ ๋์์ ๊ณต๊ฐํ๊ณ ์๋ฃ๋ฅผ ์จ๊ธด๋ค. ๊ทธ๋์ ๊ธฐ์กด ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ๊ฐ์ฒด ํ์ ์ ์ถ๊ฐํ๊ธฐ๋ ์ฌ์ด ๋ฐ๋ฉด, ๊ธฐ์กด ๊ฐ์ฒด์ ์ ๋์์ ์ถ๊ฐํ๊ธฐ๋ ์ด๋ ต๋ค. ์๋ฃ ๊ตฌ์กฐ๋ ๋ณ๋ค๋ฅธ ๋์ ์์ด ์๋ฃ๋ฅผ ๋ ธ์ถํ๋ค. ๊ทธ๋์ ๊ธฐ์กด ์๋ฃ ๊ตฌ์กฐ์ ์ ๋์์ ์ถ๊ฐํ๊ธฐ๋ ์ฌ์ฐ๋, ๊ธฐ์กด ํจ์์ ์ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ ์ด๋ ต๋ค.
(์ด๋ค) ์์คํ ์ ๊ตฌํํ ๋, ์๋ก์ด ์๋ฃ ํ์ ์ ์ถ๊ฐํ๋ ์ ์ฐ์ฑ์ด ํ์ํ๋ฉด ๊ฐ์ฒด๊ฐ ๋ ์ ํฉํ๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ๋ก ์๋ก์ด ๋์์ ์ถ๊ฐํ๋ ์ ์ฐ์ฑ์ด ํ์ํ๋ฉด ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฐจ์ ์ธ ์ฝ๋๊ฐ ๋ ์ ํฉํ๋ค. ์ฐ์ํ ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ ํธ๊ฒฌ์์ด ์ด ์ฌ์ค์ ์ดํดํด ์ง๋ฉดํ ๋ฌธ์ ์ ์ต์ ์ธ ํด๊ฒฐ์ฑ ์ ์ ํํ๋ค.