ν©ν 리 λ©μλ ν¨ν΄μ μμ± ν¨ν΄ μ€ νλλ‘ κ°μ²΄ μμ±μ 곡μ₯ ν΄λμ€μκ² μμνλ ν¨ν΄μ λ§νλ€. ν΄λΌμ΄μΈνΈκ° ꡬ체 ν΄λμ€λ₯Ό μ§μ μΈκΈνμ¬ `new` μ°μ°μλ₯Ό νΈμΆνλ λμ , λ§λ€κ³ μ νλ κ°μ²΄μ μμ± μ± μμ λ§‘μ 곡μ₯ ν΄λμ€μκ² κ°μ²΄ μμ±μ λ§‘κΈ΄λ€.
μ΄λ¦ κ·Έλλ‘ κ°μ²΄λ₯Ό λ§λ€μ΄λ΄λ 곡μ₯(Factory)λ₯Ό λ§λλ ν¨ν΄μ΄λΌκ³ ν μ μλ€. 곡μ₯ ν΄λμ€μμ κ°μ²΄λ₯Ό λ§λλ μΈν°νμ΄μ€λ₯Ό μ 곡νλ©°, (μ¬κΈ°μ μΈν°νμ΄μ€λ κ°μ²΄ μμ±μ νλ λ©μλλ₯Ό λ»νλ€. `ShapeFactory`μμλ `createShape()` λ©μλκ° μΈν°νμ΄μ€λΌκ³ ν μ μλ€.) ν΄λΉ λ©μλλ₯Ό ν¬ν¨νλ μΈν°νμ΄μ€, μ¦ κ³΅μ₯ ν΄λμ€λ₯Ό μμ λ°λ 곡μ₯ μλΈ ν΄λμ€κ° λ§λ€ κ°μ²΄μ μ νμ κ²°μ νλ€.
곡μ₯ μΈν°νμ΄μ€: κ°μ²΄ μμ± λ©μλλ₯Ό μ μνλ μΈν°νμ΄μ€.
μλΈ κ³΅μ₯ ν΄λμ€: μ΄λ€ ꡬ체 ν΄λμ€λ₯Ό μμ±ν μ§ κ²°μ ν¨.
μλ₯Ό λ€μ΄μ, `Shape` μΈν°νμ΄μ€κ° μ‘΄μ¬νκ³ κ·Έλ₯Ό μμλ°λ `Circle`κ³Ό `Rectangle` ν΄λμ€κ° μ‘΄μ¬ν κ²½μ° μ΄ `shape` κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ ν©ν 리 λ©μλ ν¨ν΄μ μ¬μ©νλ€κ³ νμ λ, `ShapeFactory`λΌλ 곡μ₯ μΈν°νμ΄μ€κ° μκ³ κ·Έλ₯Ό μμλ°λ `CircleFactory` ν΄λμ€μ `RectangleFactory` ν΄λμ€λ₯Ό μμ±νλ€.
μ΄λ κ² κ°μ²΄ μμ± κ³΅μ₯μ΄ λ°λ‘ μ‘΄μ¬νλ€λ©΄ `Circle` κ°μ²΄λ₯Ό μμ±νκ³ μ νλ ν΄λΌμ΄μΈνΈ `Main`μ `Circle` ꡬ체 ν΄λμ€λ₯Ό μ ν λͺ¨λ₯΄κ³ λ ν΄λΉ ν΄λμ€λ‘λΆν° κ°μ²΄λ₯Ό μμ±ν μ μλ€. λ§νΈμμλ νλ§€λ₯Ό μν΄ κ³Όμκ° νμνμ§λ§ κ³Όμλ₯Ό λ§λλ λ°©λ²μ λͺ¨λ₯΄λ κ²κ³Ό κ°λ€. 곡μ₯μκ² κ³Όμλ₯Ό μ£Όλ¬Ένλ©΄ 곡μ₯μμ κ³Όμλ₯Ό λ§λ€μ΄μ λ§νΈμ 곡κΈνλ κ²κ³Ό μ μ¬νλ€. μ¬κΈ°μ λ§νΈλ ν΄λΌμ΄μΈνΈ, 곡μ₯μ 곡μ₯ ν΄λμ€λΌκ³ ν μ μλ€.
// μΈν°νμ΄μ€
interface Shape {
void draw();
}
// ꡬν ν΄λμ€
class Circle implements Shape {
@Override
public void draw() {
System.out.println("λκ·ΈλΌλ―Έλ₯Ό 그립λλ€.");
}
}
class Rectagle implements Shape {
@Override
public void draw() {
System.out.println("μ§μ¬κ°νμ 그립λλ€.");
}
}
// 곡μ₯ μΈν°νμ΄μ€
interface ShapeFactory {
Shape createShape();
}
// 곡μ₯ μλΈ ν΄λμ€(ꡬν ν΄λμ€)
class CircleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
// 곡μ₯ μλΈ ν΄λμ€(ꡬν ν΄λμ€)
class RectangleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// ν΄λΌμ΄μΈνΈ
public class Main {
public static void main(String[] args) {
// CircleFactoryλ₯Ό μ¬μ©νμ¬ Circleμ μμ±ν¨
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
// μΆλ ₯: λκ·ΈλΌλ―Έλ₯Ό 그립λλ€.
circle.draw();
// RectangleFactoryλ₯Ό μ¬μ©νμ¬ Rectangleμ μμ±ν¨
ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
// μΆλ ₯ : μ§μ¬κ°νμ 그립λλ€.
rectangle.draw();
}
}
μ€νλ§μμ μ¬μ©λλ `AppConfig` λν ν©ν 리 λ©μλ ν¨ν΄μ μΌμ’ μ΄λ€. κ°μ²΄ μμ±μ μν λ©μλκ° λͺ¨μ¬μλ€. κ°μ²΄ μμ±μ μ± μμ κ°λ ν΄λμ€μΈ κ²μ΄λ€.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
`memberService()`μ ꡬν κ°μ²΄λ `memberRepository()` μ¦ DAO κΈ°λ₯μ νλ κ°μ²΄μ μμ‘΄νκ³ μλ€. μ΄ `AppConfig` κ°μ²΄κ° κ°μ²΄μ μμ±μ λ΄λΉν¨κ³Ό λμμ μμ‘΄μ± μ£Όμ μ μ± μλ λ΄λΉνκ³ μλ κ²μ΄λ€.
ν©ν 리 λ©μλ ν¨ν΄μμ 곡μ₯ ν΄λμ€λ μ£Όλ‘ κ°μ²΄ μμ±μ μ± μλΏ μλλΌ λ νμ₯λ μ μλ€.
1. κΈ°λ³Έμ μΈ μ± μμ κ°μ²΄λ₯Ό μμ±νλ κ²μ΄λ€.
2. ν΄λΉ κ°μ²΄μ μ΄κΈ°κ°μ μ€μ νκ±°λ μμ‘΄μ±μ μ£Όμ ν μ μλ€.
3. μ€λΈμ νΈ νμ κ΄λ¦¬νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ λμ κΈ°μ‘΄μ κ°μ²΄λ₯Ό μ¬νμ©ν μ μλ€.
μλ₯Ό λ€μ΄, μΉ μ ν리μΌμ΄μ μ μλ²μ DBμ μ°κ²°μ λΉμ©μ΄ λ§μ΄ λ λ€. `Connection`κ°μ²΄λ₯Ό μμ±νκ³ , DBμ μ°κ²°νκ³ , 쿼리λ₯Ό 보λ΄κ³ , κ²°κ³Όκ°μ λ°μ μ²λ¦¬νλ κ³Όμ μ΄ κ³μ λ°λ³΅λκΈ° λλ¬Έμ΄λ€. λ°λΌμ μμ²μ΄ λ€μ΄μ¬ λλ§λ€ κ°μ²΄λ₯Ό μμ±νλ€λ©΄ λΉμ©μ΄ κ°λΉν μ μμ΄ μ»€μ§κ² λλ€. μ¬κΈ°μλ κ°μ₯ ν° λΉμ©μ μ°¨μ§νλ κ²μ΄ λ°λ‘ DBμ μ°κ²°νλ κ³Όμ μΈλ°, μ΄λ 미리 `Connection` κ°μ²΄λ₯Ό μ¬λ¬ κ° λ§λ€μ΄ λκ³ μμ²μ΄ λ€μ΄μ¬ λλ§λ€ λΉλ €μ£Όλ λ°©λ²μ μ΄μ©νλ€λ©΄ `Connection` κ°μ²΄λ₯Ό μ¬λ¬λ² μμ±νλ λΉμ©μ μ€μΌ μ μλ€. μ΄λ κ² κ°μ²΄μ ν λΉ κ·Έλ¬λκΉ μμ±κ³Ό μμ μ λΉμ©μ΄ ν¬κ±°λ μμ£Ό μΌμ΄λλ κ²½μ°μ μ΄λ¬ν ν¨ν΄μ μ¬μ©νλ©΄ μ±λ₯μμ ν¬κ² μ΄λμ λ³Ό μ μλ€. μ΄λ κ² `Connection` κ°μ²΄λ₯Ό μ¬λ¬κ° μμ±ν΄λκ³ μμ²μ΄ μ¬ λλ§λ€ λμ¬ν΄μ£Όμλ€κ° λ€μ λ°νλ°λ κ²μ 컀λ₯μ νμ΄λΌκ³ νλλ°, λμ μ μμκ° λ§μ κ²½μ°μ μμ² μλ§λ€ `Connection` κ°μ²΄λ₯Ό μμ±ν΄μ ν λΉν΄μ£Όλ κ²μ΄ μλλΌ (μμ²μ΄ μ¬ λλ§λ€ κ°μ²΄λ₯Ό μμ±νλ€λ©΄ μκ°μ΄ λ μ€λ κ±Έλ¦¬κ² μ£ ?) μ΄λ―Έ λ§λ€μ΄λ `Connection` κ°μ²΄λ₯Ό ν λΉν΄μ£Όκ³ μ¬μ¬μ©νκΈ°λ₯Ό λ°λ³΅νλ€. μ΄λ λͺ¨λ `Connection` μ΄ μ¬μ©λκ³ μλ€λ©΄ `Connection` μ΄ λ°νλ λκΉμ§ λ²νΈμλλ‘ λκΈ° μνλ‘ κΈ°λ€λ¦¬κ² λλ€.
μ°λ¦¬κ° μν κ΄λ¦¬ μμ€ν , GOODS ν΄λμ€λ₯Ό λ§λ€μμ λ μ¬μ©λμλ `JDBCTemplate`μ΄ `ConnectionFactory`λΌκ³ ν μ μλ€. μ°λ¦¬κ° `Connection` κ°μ²΄λ₯Ό μμ±ν νμ μμ΄ μ΄λ―Έ ν νλ¦Ώμ΄ μ μλμ΄ μμ΄μ ν΄λΉ ν΄λμ€μμ `getConnection()`μ νΈμΆνκΈ°λ§ νλ©΄ `Connection`μ κ°μ Έμ¬ μ μμλ€. `Connection` κ°μ²΄λ₯Ό κ°μ Έμ€λ ν΄λΌμ΄μΈνΈ, μ¦ DAOμμλ μ΄λ€ DBμ μ°κ²°λλμ§ κ΅¬μ²΄μ μΈ μ½λλ₯Ό λͺ¨λ₯΄κ³ λ `Connection` κ°μ²΄λ₯Ό μμ±ν μ μλ€.
κ·Έλ°λ° μ¬κΈ°μ, μ°λ¦¬λ νΈμμ±μ μν΄ JDBC Templateμ static λ©μλλ‘ μ μΈνκ³ μ¬μ©νμμ§λ§ Springμμ μ¬μ©λλ JDBC Templateμ μ μ¬νμ§λ§ μ‘°κΈ λ€λ₯΄λ€κ³ ν μ μλ€. Springμμλ DAOκ° `JDBCTemplate`μ λ©€λ² νλλ₯Ό κ°μ§κ³ μλ€. μ΄λ DAOλ `JDBCTemplate`μ μμ‘΄νλ€κ³ ννν μ μλ€. κ·Έλ¦¬κ³ μ¬κΈ°μ λ `JDBCTemplate`μ `DataSource`μκ² μμ‘΄νκ³ μλ€. μκΉ μ»€λ₯μ νμ λν΄μ μκΈ°νλλ°, μΉμμλ μ¬μ©μκ° νλλͺ μ΄ μλλΌ λ§μ μμ μ μ κ° λμμ μ κ·ΌνκΈ° λλ¬Έμ Springμ 컀λ₯μ νμ κ΄λ¦¬νλ€. μ΄ μ»€λ₯μ νμ κ΄λ¦¬νλ κ²μ΄ `DataSource`μ΄λ€. μ΄ `DataSource`κ° `getConnection()` λ©μλλ₯Ό κ°μ§κ³ μλ€. Springμ `DriverManagerDataSource`, `HikariDataSource` λ±μ΄ `DataSource`λ₯Ό ꡬνν ν΄λμ€ μ€ νλλ€. μ΄λ€ ν΄λμ€μ `DataSource`λ₯Ό μμ±νλ λ©μλκ° μλ€λ©΄, μ΄ λ©μλλ ν©ν 리 λ©μλμ ν΄λΉνλ€.
μ΄μ²λΌ 곡μ₯ ν΄λμ€μ μ± μμ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§ μ μλ€.
곡μ₯ ν΄λμ€κ° λ°λμ μΈν°νμ΄μ€λ‘ μ μΈλμ΄μΌ νλ κ²μ μλμ§λ§ μΌλ°μ μΌλ‘ κ°μ²΄ μμ± λ©μλμ ꡬνμ κ°μ νκΈ° μν΄ μΈν°νμ΄μ€λ‘ μ€μ νλ€. JDK 1.9λΆν°λ μΈν°νμ΄μ€μ default λ©μλ μ μΈμ΄ νμ©λλ―λ‘ κ³΅μ₯ ν΄λμ€λ₯Ό μΈν°νμ΄μ€λ‘ μ μΈνλ κ²μ΄ μ’μ μ νμΌ μ μλ€.
// κ΅ν΅ μλ¨ μΈν°νμ΄μ€
interface Vehicle {
void startEngine();
}
// ꡬν ν΄λμ€: μ°¨
class Car implements Vehicle {
@Override
public void startEngine() {
System.out.println("μλμ°¨κ° μΆλ°ν©λλ€~!");
}
}
// ꡬν ν΄λμ€: νΈλ
class Truck implements Vehicle {
@Override
public void startEngine() {
System.out.println("νΈλμ΄ μΆλ°ν©λλ€~!");
}
}
// ꡬν ν΄λμ€: μ€ν λ°μ΄
class Motorcycle implements Vehicle {
@Override
public void startEngine() {
System.out.println("μ€ν λ°μ΄ μΆλ°~!");
}
}
// κ΅ν΅ μλ¨ μΈν°νμ΄μ€
interface VehicleFactory {
Vehicle createVehicle();
}
// μ°¨ μμ± κ³΅μ₯
class CarFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Car();
}
}
// νΈλ μμ± κ³΅μ₯
class TruckFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Truck();
}
}
// μ€ν λ°μ΄ μμ± κ³΅μ₯
class MotorcycleFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Motorcycle();
}
}
// ν΄λΌμ΄μΈνΈ
public class Main {
public static void main(String[] args) {
// CarFactoryλ‘ μλμ°¨ μμ±
VehicleFactory carFactory = new CarFactory();
Vehicle car = carFactory.createVehicle();
// μΆλ ₯: μλμ°¨κ° μΆλ°ν©λλ€~!
car.startEngine(); // Output: Car Engine Started
// TruckFactoryλ‘ νΈλ μμ±
VehicleFactory truckFactory = new TruckFactory();
Vehicle truck = truckFactory.createVehicle();
// μΆλ ₯: νΈλμ΄ μΆλ°ν©λλ€~!
truck.startEngine();
// MotorcycleFactoryλ‘ μ€ν λ°μ΄ μμ±
VehicleFactory motorcycleFactory = new MotorcycleFactory();
Vehicle motorcycle = motorcycleFactory.createVehicle();
// μΆλ ₯: μ€ν λ°μ΄ μΆλ°~!
motorcycle.startEngine();
}
}
ν©ν 리 λ©μλ ν¨ν΄μ μ£Όμ λͺ©μ μ κ°μ²΄ μμ±μ λν μ± μμ μλΈ ν΄λμ€, μ¦ ν΄λΌμ΄μΈνΈ μ½λκ° μλ λ€λ₯Έ ν΄λμ€λ‘ λΆλ¦¬νμ¬ ν΄λΌμ΄μΈνΈ μ½λκ° κ΅¬μ²΄μ μΈ ν΄λμ€μ μ§μ μμ‘΄νμ§ μλλ‘ νλ κ²μ΄λ€.
β¨ μ₯μ
ν΄λΌμ΄μΈνΈκ° ꡬ체 ν΄λμ€λ₯Ό μ§μ μΈκΈνμ§ μκ³ μΈν°νμ΄μ€μ μμ‘΄νμ¬ κ°μ²΄λ₯Ό μμ±νλ―λ‘
1. ꡬ체 ν΄λμ€λ₯Ό μλν μ μλ€.
2. ν΄λΌμ΄μΈνΈμ ꡬ체 ν΄λμ€μ κ°ν κ²°ν©μ νΌν μ μλ€.
3. μμ± μ½λκ° ν κ³³(곡μ₯ ν΄λμ€)μ λͺ¨μ¬μκΈ° λλ¬Έμ μ μ§ λ³΄μκ° μ©μ΄νλ€. μμ λ° νμ₯μ΄ μ©μ΄νλ€λ λ»μΈλ°, μ΄λ κ°μ²΄ μ§ν₯ 5λ μμΉ SOLID μ€μ λ¨μΌ μ± μ μμΉ(SRP: Single Responsibility Principle)κ³Ό κ°λ°© νμ μμΉ(OCP: Open Close Princlple)μ λΆν©νλ€.
κ°μ²΄μ λμ¨ν κ²°ν©μΌλ‘ μμ‘΄μ±μ κ΄λ¦¬νλ μμ± ν¨ν΄μΌλ‘ κ΄λ¦¬κ° ν¨μ¨μ μ΄λ€.
π λ¨μ
1. μ νμ μκ° μ¦κ°νλ©΄ 곡μ₯ ν΄λμ€λ μ¦κ°νκΈ° λλ¬Έμ κ΄λ¦¬κ° λ²κ±°λ‘μμ§ μ μλ€.
2. ν΄λΌμ΄μΈνΈ μ½λμμ `new` μ°μ°μλ₯Ό μ¬μ©νμ¬ μ§μ κ°μ²΄λ₯Ό μμ±ν λλ³΄λ€ κ°λ μ±μ΄ λ¨μ΄μ§ μ μλ€.
λν ν©ν 리 λ©μλ ν¨ν΄μ μ¬μ©νλλΌλ μλ‘μ΄ ν΄λμ€κ° μΆκ°λ λ ν΄λΉ ν΄λμ€μ λν ν©ν 리λ₯Ό μμ±ν΄μΌ νλ―λ‘, ν΄λΌμ΄μΈνΈ μ½λμμ μμ μ΄ λ°μν μ μλ€. μλ₯Ό λ€μ΄ Shape ν΄λμ€λ₯Ό μμ λ°λ ν΄λμ€ μ€ `Rectangle` ν΄λμ€ λμ μ `Triangle` ν΄λμ€λ‘λΆν° κ°μ²΄λ₯Ό μμ±νκ³ μΆλ€λ©΄, `ShapeFactory` ν΄λμ€λ₯Ό μμλ°λ `TriangleFactory` ν΄λμ€λ₯Ό λ§λ€κ³ ν΄λΌμ΄μΈνΈ μ½λμμ `TriangleFactory` κ°μ²΄λ₯Ό μμ±νμ¬ `Shape` νμ μ `Triangle` κ°μ²΄λ₯Ό μμ±ν μ μλ€.
μ΄ ν¨ν΄μ κ°μ²΄ μμ± λ‘μ§μ΄λ ν΄λμ€ κ΅¬μ‘°κ° λ³΅μ‘ν κ²½μ°μ μ μ©νκ² μ¬μ©λλ€.
κ°μ²΄ μμ± μꡬ μ¬νμ΄ λ¨μνκ±°λ μ νμ μκ° μ νμ μΈ κ²½μ°μλ μ±κΈν€κ³Ό κ°μ ν¨ν΄μΌλ‘ λ체νλ κ²μ΄ λ ν¨μ¨μ μΌ μ μλ€.
'CS > λμμΈ ν¨ν΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λμμΈ ν¨ν΄] μν(State) ν¨ν΄ (0) | 2024.01.17 |
---|---|
[λμμΈ ν¨ν΄] λ°μ½λ μ΄ν°(Decorator) ν¨ν΄ (0) | 2024.01.13 |
[λμμΈ ν¨ν΄] νλ‘μ(Proxy) ν¨ν΄ (0) | 2024.01.13 |
[λμμΈ ν¨ν΄] μ±κΈν€(Singleton) ν¨ν΄ (0) | 2024.01.10 |