{% hint style="danger" %} νκ·Έ λ¬λ¦° ν΄λμ€λ νλμ ν΄λμ€μμ μ¬λ¬ κ°μ§ λ€λ₯Έ νμ μ κ°μ²΄λ₯Ό μ²λ¦¬νλ λ°©μμΌλ‘ μ€κ³λλ€. νμ§λ§ μ΄λ κ² νλ©΄ μΈλͺ¨μλ λ°μ΄ν° νλμ μ½λκ° μκΈ°λ©°, μ μ§λ³΄μλ μ΄λ ΅κ³ μ€μλ‘ μΈν΄ λ°νμ μ€λ₯κ° λ°μν κ°λ₯μ±λ 컀μ§λ€. {% endhint %}
class Figure {
enum Shape { RECTANGLE, CIRCLE };
final Shape shape; // νκ·Έ νλ
// μ¬κ°ν(RECTANGLE)μΌ λ μ¬μ©
double length;
double width;
// μ(CIRCLE)μΌ λ μ¬μ©
double radius;
// μμ© μμ±μ
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// μ¬κ°νμ© μμ±μ
Figure(double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
// λ©΄μ κ³μ° (νκ·Έ κ°μ λ°λΌ λΆκΈ° μ²λ¦¬)
double area() {
switch (shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError("μ μ μλ λͺ¨μ: " + shape);
}
}
}
- λΆνμν νλ: κ° λνμ νμνμ§ μμ νλλ ν΄λμ€μ ν¬ν¨λμ΄ μλ€. μλ₯Ό λ€μ΄, μμλ
length
,width
κ° νμνμ§ μκ³ , μ¬κ°νμλradius
κ° νμ μλ€. - 쑰건문μΌλ‘ λΆκΈ° μ²λ¦¬: νκ·Έ κ°μ λ°λΌ
area()
λ©μλμμ 쑰건문μ μ¬μ©ν΄ λΆκΈ° μ²λ¦¬νλ λ°©μμ 볡μ‘νκ³ μ€μλ₯Ό μ λ°ν μ μλ€. - νμ₯μ± λΆμ‘±: μλ‘μ΄ λνμ μΆκ°νλ €λ©΄
switch
λ¬Έμ μλ‘μ΄case
λ₯Ό μΆκ°ν΄μΌ νλ©°, νκ·Έ κ°μ μ²λ¦¬ν μ μλ μ½λλ μΆκ°ν΄μΌ νλ€.
ν΄λμ€ λ΄λΆμ νΉμ νκ·Έ νλλ₯Ό λκ³ , κ·Έ νκ·Έμ κ°μ λ°λΌ ν΄λμ€μ λμμ΄λ λ°μ΄ν°λ₯Ό λ€λ₯΄κ² μ²λ¦¬νλ λ°©μμΌλ‘ μ€κ³λ ν΄λμ€λ₯Ό μλ―Ένλ€. νκ·Έ νλ
λ ν΄λμ€μ μνλ λͺ¨μμ λνλ΄λ μν μ νλ€. μ΄ νκ·Έ νλμ λ°λΌ ν΄λμ€κ° μ΄λ€ λ°©μμΌλ‘ λμν μ§ κ²°μ νλλ°, μλ₯Ό λ€μ΄ ν΄λμ€κ° μ¬λ¬ κ°μ§ λ€λ₯Έ νμ
μ κ°μ²΄λ₯Ό ννν΄μΌ νλ μν©μμ νκ·Έ νλλ₯Ό μ¬μ©ν΄ κ·Έ νμ
μ ꡬλΆνκ² λλ κ²μ.
- μ΄κ±° νμ μ μΈ, νκ·Έ νλ, switch λ¬Έ λ± μΈλ°μλ μ½λκ° λ§λ€. μ¬λ¬ ꡬνμ΄ ν ν΄λμ€μ νΌν©λΌ μμ΄μ κ°λ μ±λ λμλ€.
- λ€λ₯Έ μλ―Έλ₯Ό μν μ½λλ μΈμ λ ν¨κ» νλ λ©λͺ¨λ¦¬λ λ§μ΄ μ¬μ©νλ€. νλλ€μ
final
λ‘ μ μΈνλ €λ©΄ ν΄λΉ μλ―Έμ μ°μ΄μ§ μλ νλλ€κΉμ§ μμ±μμμ μ΄κΈ°νν΄μΌ νλ€(μ°μ§ μλ νλλ₯Ό μ΄κΈ°ννλ λΆνμν μ½λκ° λμ΄λλ€). - λ λ€λ₯Έ μλ―Έλ₯Ό μΆκ°νλ €λ©΄ μ½λ λ₯Ό μμ ν΄μΌ νλ€. μλ₯Ό λ€μ΄ μλ‘μ΄ μλ―Έλ₯Ό μΆκ°ν λλ§λ€ λͺ¨λ switch λ¬Έμ μ°Ύμ μ μλ―Έλ₯Ό μ²λ¦¬νλ μ½λλ₯Ό μΆκ°ν΄μΌ νλλ° , νλλΌλ λΉ λ¨λ¦¬λ©΄ μμ λ°νμμ λ¬Έμ κ° λΆκ±°μ Έ λμ¬ κ²μ΄λ€.
- λ§μ§λ§μΌλ‘, μΈμ€ν΄μ€μ νμ λ§μΌλ‘λ νμ¬ λνλ΄λ μλ―Έλ₯Ό μ κΈΈμ΄ μ ν μλ€.
νλ§λλ‘, νκ·Έ λ¬λ¦° ν΄λμ€λ μ₯ν©νκ³ , μ€λ₯λ₯Ό λ΄κΈ° μ½κ³ , λΉν¨μ¨μ μ΄λ€.
λ€νν μλ°μ κ°μ κ°μ²΄ μ§ν₯ μΈμ΄λ νμ νλλ‘ λ€μν μλ―Έμ κ°μ²΄λ₯Ό νννλ ν¨μ¬ λμ μλ¨μ μ 곡νλ€.
λ°λ‘ ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ₯Ό νμ©νλ
μλΈνμ΄ν (subtyping)
μ΄λ€.
ν΄λμ€λ₯Ό κ³μΈ΅κ΅¬μ‘°λ‘ μ€κ³νλ©΄ λλ€. κ°μ₯ λ¨Όμ λ£¨νΈ ν΄λμ€λ‘ μΆμ ν΄λμ€λ₯Ό μ μνκ³ , νκ·Έμ λ°λΌ λ¬λΌμ§λ λ©μλλ₯Ό μΆμ λ©μλλ‘ μ μΈνλ€. κ·Έλ° λ€μ κ° λνμ ν΄λΉνλ νμ ν΄λμ€λ₯Ό λ§λ€μ΄ κ°κ°μ νλλ₯Ό κ°μ§κ² νκ³ , λ£¨νΈ ν΄λμ€μ μΆμ λ©μλλ₯Ό ꡬννλ€.
// λ£¨νΈ ν΄λμ€: λͺ¨λ λνμ κ³΅ν΅ μ‘°μ
abstract class Figure {
abstract double area();
}
// νμ ν΄λμ€: μ
class Circle extends Figure {
final double radius;
Circle(double radius) {
this.radius = radius;
}
@Override
double area() {
return Math.PI * (radius * radius);
}
}
// νμ ν΄λμ€: μ¬κ°ν
class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
- λΆνμν νλ μ κ±°: κ° λνμ λ§λ νλλ§ λ¨κΈ°κ³ λΆνμν νλλ λͺ¨λ μ κ±°νλ€.
- λΆκΈ° μ²λ¦¬ μ κ±°: 쑰건문μ μ¬μ©ν λΆκΈ° μ²λ¦¬κ° νμ μλ€. κ° λν ν΄λμ€μμ κ³ μ ν λ‘μ§μ ꡬνν μ μμ΄ μ½λλ₯Ό κ°κ²°νκ² μ μ§ν μ μλ€.
- μ μ°ν νμ₯μ±: μλ‘μ΄ λνμ μΆκ°ν λλ§λ€ λ£¨νΈ ν΄λμ€λ₯Ό 건λ릴 νμ μμ΄ λ 립μ μΈ νμ ν΄λμ€λ₯Ό μΆκ°νλ©΄ λλ€.
- μ»΄νμΌ νμ κ²μ¦: μ»΄νμΌλ¬κ° κ° ν΄λμ€κ° νμν νλλ₯Ό λͺ¨λ μ΄κΈ°ννκ³ , μΆμ λ©μλλ₯Ό ꡬννλμ§ νμΈν΄μ€λ€. λ°λΌμ μ€μλ‘ μΈν λ°νμ μ€λ₯κ° μ€μ΄λ λ€.
κ³μΈ΅ κ΅¬μ‘°λ‘ μ€κ³νμ κ²½μ°, μλ‘μ΄ λνμ μ½κ² νμ₯ν μ μλ€. μλ₯Ό λ€μ΄, μ μ¬κ°νμ μ¬κ°νμ νΉλ³ν ννλ‘ μ μν μ μλ€.
class Square extends Rectangle {
Square(double side) {
super(side, side); // μ μ¬κ°νμ κΈΈμ΄μ λλΉκ° λμΌ
}
}
μμ΄ν 20μμλ μΆμν΄λμ€λ³΄λ€λ μΈν°νμ΄μ€λ₯Ό κ³ λ €νλΌκ³ νλλ°..? μ μμ κ³μΈ΅ κ΅¬μ‘°μΌ λλ μΆμν΄λμ€λ₯Ό μ΄μ©ν κ±ΈκΉ? π€
μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ μ΄μ λ μν©μ λ°λΌ λ€λ₯΄λ€. μμμ μΈν°νμ΄μ€κ° λ μ μ°νκ³ λ€μ€ μμμ΄ κ°λ₯νλ€κ³ νμ§λ§, μΆμ ν΄λμ€κ° νμν κ²½μ°λ μλ€. μΆμ ν΄λμ€λ₯Ό μ ννλ μ£Όμ μ΄μ λ₯Ό λͺ κ°μ§ μ€λͺ ν΄λ³΄μ
μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ κ°μ₯ ν° μ΄μ λ
κ³΅ν΅ μν(νλ)
λ₯Ό 곡μ νκ±°λ κΈ°λ³Έ ꡬνμ μ 곡νκΈ° μν΄μμ΄λ€.
μλ₯Ό λ€μ΄, μ¬λ¬ μλΈ ν΄λμ€λ€μ΄ 곡ν΅μ μΌλ‘ μ¬μ©ν μΈμ€ν΄μ€ λ³μλ λ©μλκ° μλ€λ©΄, μΆμ ν΄λμ€λ‘ μ΄ λΆλΆμ μμλ°μ μ¬μ©νκ² ν μ μλ€.
- μμ: λͺ¨λ λν ν΄λμ€μμ μκΉμ΄λ μμΉ λ±μ κ³΅ν΅ νλλ₯Ό μ μ§νκ³ μΆλ€λ©΄, μΆμ ν΄λμ€κ° μ ν©νλ€. μ΄λ κ² νλ©΄ 곡ν΅λ μνλ₯Ό μμλ°μ μ¬μ©ν μ μκ³ , μ½λ μ€λ³΅μ μ€μΌ μ μλ€.
abstract class Shape {
String color; // κ³΅ν΅ μν (νλ)
// κ³΅ν΅ κ΅¬νμ μν λ©μλ
void setColor(String color) {
this.color = color;
}
abstract double area(); // μλΈ ν΄λμ€κ° ꡬνν΄μΌ νλ μΆμ λ©μλ
}
μ΄ κ²½μ° λͺ¨λ λνμ μκΉμ κ°κ³ μκ³ , μκΉμ λ³κ²½ν μ μλ€. μ΄ κΈ°λ₯μ λͺ¨λ λν μλΈ ν΄λμ€μ μΌμΌμ΄ ꡬννλ λμ , μΆμ ν΄λμ€λ₯Ό ν΅ν΄ 곡ν΅μΌλ‘ μμλ°λλ€.
μΈν°νμ΄μ€λ μν(νλ)
λ₯Ό κ°μ§ μ μκ³ , λ©μλμ κΈ°λ³Έ ꡬνμ μ 곡ν μ μλ λν΄νΈ λ©μλλ μΌλΆ μ νμ μ΄λ€. νμ§λ§ μΆμ ν΄λμ€λ μμλ°λ ν΄λμ€μ κΈ°λ³Έ λ©μλ ꡬνμ μ 곡ν μ μλ€.
μλ₯Ό λ€μ΄, λν ν΄λμ€μμ λ©΄μ μ ꡬνλ area()
λ©μλλ κ° λνλ§λ€ λ€λ₯΄κ² ꡬνλκ² μ§λ§, toString()
κ°μ 곡ν΅μ μΈ λμμ μΆμ ν΄λμ€μμ 미리 μ μν΄μ€ μ μλ€.
abstract class Shape {
abstract double area();
@Override
public String toString() {
return "This is a shape";
}
}
λͺ¨λ λν μλΈ ν΄λμ€λ toString()
λ©μλλ₯Ό μλμΌλ‘ μμλ°μ μ¬μ©ν μ μκ² λλ€. λ§μ½ μΈν°νμ΄μ€μλ€λ©΄ μ΄λ° 곡ν΅μ μΈ κ΅¬νμ μ 곡νκΈ°κ° μ΄λ ΅λ€.
μΆμ ν΄λμ€λ μμλ°λ ν΄λμ€λ€μ΄ μλμΌλ‘ κΈ°λ³Έ ꡬνμ κ°μ§κ² νκ³ , νμν λΆλΆλ§ μ€λ²λΌμ΄λν μ μκ² λμμ€λ€. μ΄λ μ½λ μ€λ³΅μ μ€μ΄κ³ , μΌκ΄λ λ°©μμΌλ‘ κΈ°λ₯μ μ 곡νλ λ° μ 리νλ€.
μλ₯Ό λ€μ΄, μλ°μ AbstractList
, AbstractMap
κ°μ μΆμ ν΄λμ€λ λͺ¨λ 리μ€νΈλ 맡 ꡬνμ²΄κ° κ³΅ν΅μ μΌλ‘ μ¬μ©νλ λ©μλλ₯Ό 미리 μ μνκ³ , κ° κ΅¬ν체λ κ·Έ λ©μλλ₯Ό μμλ°μ μ¬μ©ν μ μλ€. μ΄λ ꡬ체μ μΈ κ΅¬νμ κ°νΈνκ² λ§λ€ μ μκ² ν΄μ€λ€.
μΆμ ν΄λμ€λ ν΄λμ€ κ³μΈ΅κ΅¬μ‘° λ΄μμ μ’ λ μ격νκ² μμμ μ ννκ³ μ ν λ μ¬μ©λλ€. μΈν°νμ΄μ€λ μ무 ν΄λμ€λ ꡬνν μ μμ§λ§, μΆμ ν΄λμ€λ νλμ λΆλͺ¨ ν΄λμ€λ§ μμν μ μκΈ° λλ¬Έμ, μΌκ΄λ κ³μΈ΅κ΅¬μ‘°λ₯Ό μ μ§νκ³ μΆμ λ μ¬μ©λλ€.
μλ₯Ό λ€μ΄, Shape
λΌλ μΆμ ν΄λμ€κ° μλ€λ©΄, μ΄ μΆμ ν΄λμ€λ₯Ό μμλ°μ Circle
, Rectangle
λ±μ λͺ¨λ κ°μ μμ ꡬ쑰λ₯Ό 곡μ νκ² λλ€. μ΄λ μ½λ μ μ§λ³΄μμ±κ³Ό μΌκ΄μ±μ λμ΄λ λ° κΈ°μ¬ν μ μλ€.
μΆμ ν΄λμ€λ μΈν°νμ΄μ€μ ν¨κ» 골격 ꡬν(Skeletal Implementation)μ μ 곡νλ λ° λ§€μ° μ μ©νλ€.
μ¦, μΈν°νμ΄μ€λ‘λ νμ μ μ μνκ³ , μΆμ ν΄λμ€λ‘λ κΈ°λ³Έ λμμ μ μν΄μ, μλΈ ν΄λμ€λ νμν λΆλΆλ§ ꡬννλ©΄ λλ€.
μλ₯Ό λ€μ΄, μλ°μ AbstractList
λ List
μΈν°νμ΄μ€λ₯Ό ꡬνν μΆμ ν΄λμ€λ‘, List
μ λ§μ λ©μλλ₯Ό κΈ°λ³Έμ μΌλ‘ ꡬννκ³ μλ€. μ΄λ κ² νλ©΄ μλ‘μ΄ List
ꡬν체λ₯Ό λ§λ€ λ, AbstractList
λ₯Ό μμλ°μμ νΈλ¦¬νκ² κ΅¬νν μ μλ€.
abstract class AbstractList<E> implements List<E> {
@Override
public boolean isEmpty() {
return size() == 0;
}
@Override
public boolean contains(Object o) {
for (E e : this) {
if (e.equals(o)) return true;
}
return false;
}
// λ λ§μ λ©μλλ₯Ό κΈ°λ³Έ ꡬνμΌλ‘ μ 곡
}
μ΄ λ°©μμ μλ‘μ΄ List
ꡬν체λ₯Ό λ§λ€ λ, ν΅μ¬ λ©μλλ§ κ΅¬ννκ³ λλ¨Έμ§λ μλμΌλ‘ μμλ°μ μ μκ² ν΄μ€λλ€.
μΈν°νμ΄μ€κ° λ μ μ°νκ³ λ€μ€ μμμ΄ κ°λ₯νλλΌλ, κ³΅ν΅ μν(νλ)λ₯Ό 곡μ νκ±°λ κΈ°λ³Έ λμμ μ 곡ν΄μΌ νλ μν©μμλ μΆμ ν΄λμ€κ° λ μ ν©νλ€. νΉν 곡ν΅λ λ°μ΄ν°λ ꡬνμ μμνκ³ , μ¬λ¬ νμ ν΄λμ€μμ 곡ν΅μ μΌλ‘ μ¬μ©νλ κ³΅ν΅ λμμ μ μ§ν΄μΌ ν λλ μΆμ ν΄λμ€κ° λ μ ν©ν μ νμ΄ λλ€.
κ²°λ‘ μ μΌλ‘, μν©μ λ°λΌ μΆμ ν΄λμ€κ° λ μ ν©ν λκ° μκ³ , μ΄λ° κ²½μ°λΌλ©΄ μΆμ ν΄λμ€λ₯Ό μ ννλ κ²μ΄ μ’λ€.
{% hint style="info" %} μΈν°νμ΄μ€λ₯Ό μ¬μ©ν κ³μΈ΅ ꡬ쑰λ μλΈνμ΄ν(subtyping)μ΄λΌκ³ ν μ μλ€. {% endhint %}
μλΈνμ΄νμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ νμ νμ (subtype)μ΄ μμ νμ (supertype)μ μν μ ν μ μλ κ΄κ³λ₯Ό μλ―Ένλ€.
μ¦, μμ νμ μ λ©μλλ₯Ό νμ νμ μ΄ λͺ¨λ ꡬνν΄μ νμ νμ κ°μ²΄κ° μμ νμ μΌλ‘ λμν μ μλ μν©μ λ§ν©λλ€.
μλΈνμ΄νμ ν΅μ¬μ "νμ νμ μ΄ μμ νμ μ λͺ¨λ λμμ μ§μν΄μΌ νλ€"λ μ μ΄λ€. μΈν°νμ΄μ€λ μ΄ μλΈνμ΄νμ κ·μΉμ λ°λ₯΄λ λνμ μΈ μλ¨ μ€ νλμ΄λ€. μΈν°νμ΄μ€λ ν΄λμ€κ° λ°λμ ꡬνν΄μΌ ν λ©μλλ€μ μ§ν©μ μ μνλ―λ‘, κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ€μ μΈν°νμ΄μ€ νμ μΌλ‘ μ°Έμ‘°ν μ μλ€.
μ¦, μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ κ³μΈ΅ ꡬ쑰λ₯Ό λ§λ€λ©΄, μμ μΈν°νμ΄μ€ νμ μ ꡬνν νμ ν΄λμ€κ° μμ μΈν°νμ΄μ€λ‘ λμν μ μκΈ° λλ¬Έμ, μ΄κ²λ μλΈνμ΄νμ ν΄λΉνλ€.
interface Shape {
double area(); // λͺ¨λ λνμ΄ κ΅¬νν΄μΌ νλ λ©μλ
}
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
class Rectangle implements Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
System.out.println("Circle Area: " + circle.area());
System.out.println("Rectangle Area: " + rectangle.area());
}
}
μ μ½λμμ Shape
λ μΈν°νμ΄μ€μ΄κ³ , Circle
κ³Ό Rectangle
μ Shape
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ€μ΄λ€. Circle
κ³Ό Rectangle
κ°μ²΄λ λͺ¨λ Shape
νμ
μΌλ‘ μ°Έμ‘°λ μ μκ³ , Shape
μΈν°νμ΄μ€μ μ μλ area()
λ©μλλ₯Ό μ¬μ©ν μ μλ€. μ΄κ²μ΄ λ°λ‘ μλΈνμ΄ν
- μΆμ ν΄λμ€λ 곡ν΅λ μν(νλ)μ ꡬνμ 곡μ νλ λ° κ°μ μ΄ μμ§λ§, λ¨μΌ μμλ§ κ°λ₯νλ€. μ¦, ν ν΄λμ€κ° νλμ λΆλͺ¨ μΆμ ν΄λμ€λ§ κ°μ§ μ μλ€.
- μΈν°νμ΄μ€λ μνλ₯Ό κ°μ§ μ μμ§λ§, λ€μν ꡬνμ²΄κ° λμΌν λμμ 보μ₯νλλ‘ λ€μ€ μμμ΄ κ°λ₯νλ€. μ¦, νλμ ν΄λμ€κ° μ¬λ¬ κ°μ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μμ΅λλ€.
λ λ€ μλΈνμ΄νμ μ§μνμ§λ§, μΈν°νμ΄μ€λ λ μ μ°ν κ³μΈ΅ ꡬ쑰λ₯Ό μ€κ³ν μ μκ² λμμ€λ€.
{% hint style="success" %}
μλΈνμ΄νμ μμ νμ (μΈν°νμ΄μ€λ μΆμ ν΄λμ€)μ λμμ νμ νμ μ΄ κ΅¬νν΄μ μμ νμ μ²λΌ λμν μ μλ κ΄κ³λ₯Ό λ§νλ©°, μΈν°νμ΄μ€λ μλΈνμ΄νμ ꡬννλ μ€μν λ°©λ² μ€ νλμ΄λ€.
{% endhint %}
5. μ€ν°λμμ μΆκ° μ€λͺ : API SERVER APPLICATION μμ Entityλ₯Ό ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ‘ λ§λλ €λ©΄
μΆμ² : https://antique-banon-928.notion.site/Effective-Java-20-25-10-17-11d82aee42598045ab1ded57b536635b
νΌμμ€ν΄μ€ λ μ΄μ΄μμ λ¨μν DBμ μ μ₯λμ΄ μλ κ°μ κΊΌλ΄μ€λ μν λ§ νμ§ μκ³ , κ³μΈ΅κ΅¬μ‘°μ νμ μΌλ‘ λ³νν΄μ£Όλ μν μ ν΄μ€λ€.
λ μ΄μ΄λ μν€ν μ³
νΌμμ€ν΄μ€ λ μ΄μ΄λ‘ Repository, Dao Layer μ΄ λκ³μΈ΅μΌλ‘ λλλ€.Daoλ DBμμ κ°μ κΊΌλ΄μ€λ μν μ, Repositoryλ κ³μΈ΅κ΅¬μ‘°μ νμ μΌλ‘ μ νν΄μ£Όλ μν μ 맑λλ€.
μ΄λ―Έμ§ ν΄μ¦, ν μ€νΈ ν΄μ¦ μ΄ 2 μ’ λ₯μ ν΄μ¦κ° μ‘΄μ¬νλ€.
Dao
- QuizEntity νμ κ°μ κ°μ§κ² λκΈ° λλ¬Έμ κ°μ²΄μ§ν₯μ μΌλ‘ μ’λ€λ κ²
@Repository
@RequiredArgsConstructor
public class QuizDao {
private final JPAQueryFactory queryFactory;
public List<QuizEntity> findQuiz(QuizType quizType) {
return queryFactory
.select(quiz)
.from(quiz)
.where(quiz.type.eq(quizType))
.fetch();
}
}
Repository
@Repository
@RequiredArgsConstructor
public class QuizRepository {
private final QuizDao quizDao;
public List<TextQuiz> findTextQuiz() {
return quizDao.findQuiz(QuizType.TEXT)
.map(TextQuiz::from).collect(Collectors.toList());
}
public List<ImageQuiz> findImageQuiz() {
return quizDao.findQuiz(QuizType.IMAGE)
.map(ImageQuiz::from).collect(Collectors.toList());
}
}
- νκ·Έ λ¬λ¦° ν΄λμ€λ₯Ό μ¨μΌ νλ μν©μ κ±°μ μλ€. μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ λ° νκ·Ένλκ° λ±μ₯νλ€λ©΄ νκ·Έλ₯Ό μμ κ³ κ³μΈ΅κ΅¬μ‘°λ‘ λ체νλ λ°©λ²μ μκ°ν΄λ³΄μ.
- ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ‘ λ³νν¨μΌλ‘μ¨ μ½λκ° λ κ°κ²°ν΄μ§κ³ , κ° ν΄λμ€μ μν μ΄ λͺ νν΄μ‘λ€. νκ·Έ λ¬λ¦° ν΄λμ€λ μ μ§λ³΄μμ νμ₯μ±μ΄ λ¨μ΄μ§ μ μμ§λ§, ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ‘ λ³ννλ©΄ μ΄λ¬ν λ¬Έμ λ€μ ν΄κ²°ν μ μλ€.
κΈ°μ‘΄ ν΄λμ€κ° νκ·Έ νλλ₯Ό μ¬μ©νκ³ μλ€λ©΄ κ³μΈ΅κ΅¬μ‘°λ‘ 리ν©ν°λ§νλ κ±Έ κ³ λ―Όν΄λ³΄μ.