ย ์คํ๋ง์ ์๋ฆฌ๋ฅผ ๊ณต๋ถํ๋ ๋์ค, ์ต์ํ ๋จ์ด๊ฐ ๋์๋ค. SOLID , ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ด๋ค.
๊ธฐ์กด์๋ ๋น์ฐํ ์๊ณ ์๋ ๊ฐ๋
์ด์ง๋ง ์ฌ์ค์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ๋ณด๋ค๋ ๋จ์ํ ์ธ์ฐ๊ณ ๋ง ์์๋ ๊ฐ๋
์ด์์ผ๋ฏ๋ก, ํ์คํ๊ฒ ์๊ณ ์๋ค๊ณ ๋ ๋จ์ ํ ์ ์์๋ค.
SOLID ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฐ๋์ ์๊ณ ์ค๋ฌด์์ ์ ๋๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ ๊ฐ๋
์ด๋ค. ์ด๋ฒ ๊ธฐํ์, ๋ณด๋ค ์ข์ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์๋๋ก SOLID ์ ๋ํ ํ์คํ ์ดํด๋ฅผ ๋ชฉํ๋ก ํ์ต ๋ฐ ์ ๋ฆฌํด๋ณด์๋ค.
SRP ์๋ฐMemberService ์ ํ์ ๋๋ฉ์ธ์ ๋ํ ๋ก์ง์ ๋ชจ์๋์ด๋ (ํ๋์ ํด๋์ค์ ํ๋์ ๊ธฐ๋ฅ๋ง ์กด์ฌํ์ง ์๋๋ผ๋), ํ์์ด๋ผ๋ ์ผ๊ด๋ ์ฑ
์ ๋ด์์ ๋์ํ๋ฏ๋ก SRP ์๋ฐ์ด ์๋// SRP ์๋ฐ
public class memberService {
public void join(Member member) {
// ํ์ ์ ์ฅ
}
public void sendMail(Member member) {
// ์ด๋ฉ์ผ ๋ฐ์ก
}
}
SRP ์๋ฐ// SRP ์ค์
public class MemberService {
public void join(Member member) {
// ํ์ ์ ์ฅ
}
}
public class EmailService {
public void sendMail(Member member) {
// ์ด๋ฉ์ผ ๋ฐ์ก
}
}
MemberService ๋ ํ์ ๋๋ฉ์ธ์๋ง, EmailService ๋ ์ด๋ฉ์ผ ๋๋ฉ์ธ์๋ง ์ง์คํ๋ฏ๋ก, SRP ์ค์IOC ๋ฐ DI ๋ฅผ ํตํด ํด๋น ์์น์ ์ค์ํ ์ ์๋๋ก ์ค๊ณ๋์ด์์// OCP ์๋ฐ
public class DiscountService {
public int getNormalDiscountRate() {
// ํ ์ธ์จ ๋ก์ง
}
}
VIP , GOLD ๋ฑ ์๋ก์ด ์ ์ฑ
์ถ๊ฐ ์ ํด๋์ค ์์ ํ์// OCP ์ค์
public interface DiscountPolicy{
int getDiscountRate();
}
public class VipDiscountPolicy implements DiscountPolicy {
public int getDiscountRate() {
// VIP ํ ์ธ์จ ๋ก์ง
}
}
public class NormalDiscountPolicy implements DiscountPolicy {
public int getDiscountRate() {
// ์ผ๋ฐ ํ ์ธ์จ ๋ก์ง
}
}
public class DiscountService {
private final DiscountPolicy discountPolicy;
public DiscountService(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public int discount() {
return discountPolicy.getDiscountRate();
}
}
DiscountPolicy ๊ตฌํ์ฒด๋ง ์ถ๊ฐํ์ฌ ์ฃผ์
ํ๋ฉด ๋จsleep() ์ด๋ผ๋ ์ ์๋ ์๋ฏธ์ ๋ฉ์๋๋ฅผ, ์์์ด ๋ฌ๋ฆฌ๊ธฐ๋ผ๋ ์๋ฏธ๋ก ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด LSP ์์น์ ์๋ฐ// LSP ์๋ฐ
class Parent {
int[] location = {0, 0};
void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
class Child extends Parent {
@Override
void sleep() {
location[0]++;
}
}
sleep() ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง๋ง, ์์์ ์์ง์ด๊ธฐ์ ์๋ฏธ๋ก sleep() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉLSP ์๋ฐ// LSP ์ค์
class Parent {
int[] location = {0, 0};
void sleep() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}
class Child extends Parent {
@Override
void sleep() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
}
}
sleep() ๋ฉ์๋๋ฅผ ๊ตฌํSRP ๋ ํด๋์ค ๋ถ๋ฆฌ์ ์์น์ด๋ผ๋ฉด, ISP ๋ ์ธํฐํ์ด์ค ๋ถ๋ฆฌ์ ์์น// ISP ์๋ฐ
interface Machine {
void print();
void scan();
void fax();
}
class PrintMachine implements Machine {
public void print() {
// ํ๋ฆฐํธ
}
public void scan() {
throw new RuntimeException("์ค์บ์ ์ฌ์ฉํ ์ ์์");
}
public void fax() {
throw new RuntimeException("ํฉ์ค๋ ์ฌ์ฉํ ์ ์์");
}
}
PrintMachine ์ ํ๋ฆฐํธ ๊ธฐ๋ฅ๋ง ํ์ํ์ง๋ง, scan() , fax() ๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ฏ๋ก ISP ์๋ฐ// ISP ์ค์
interface Printer {
void print();
}
interface Scanner {
void scan();
}
class PrintMachine implements Printer {
public void print() {
// ํ๋ฆฐํธ
}
}
PrintMachine ์ ํ๋ฆฐํธ์ ํ์ํ Printer ์ธํฐํ์ด์ค๋ง ๊ตฌํํ๋ฉด ๋จIOC ๋ฐ DI ๋ฅผ ํตํด ํด๋น ์์น์ ์ค์ํ ์ ์๋๋ก ์ค๊ณ๋์ด์์// DIP ์๋ฐ
public class OrderService {
private final DiscountPolicy discountPolicy = new VipDiscountPolicy();
public int order() {
return discountPolicy.getDiscountRate();
}
}
VipDiscountPolicy ์ ์์กดํ๊ณ ์์ผ๋ฏ๋ก, ๋ค๋ฅธ ์ ์ฑ
์ผ๋ก ๋ณ๊ฒฝ์ ์ํ๋ฉด ํด๋น ํด๋ผ์ด์ธํธ ์ฝ๋์ ์์ ์ด ํ์// DIP ์ค์
public class OrderService {
private final DiscountPolicy discountPolicy;
public OrderService(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public int order() {
return discountPolicy.getDiscountRate();
}
}
DiscountPolicy ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
ํ๋ฏ๋ก, ์ ์ฑ
์ ๋ฐ๋ผ ์์ ๋กญ๊ฒ ๊ต์ฒดํ ์ ์์@Component , @Autowired ๋ฑ์ ๊ธฐ๋ฅ์ ํตํด ์ด ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ์ฐธ๊ณ ) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/