๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ 5์›์น™ SOLID 1. ๋‹จ์ผ์ฑ…์ž„์›์น™ (SRP)

    ๊ฐ์ฒด ์ง€ํ–ฅ ์›์น™ ์„ค๊ณ„์˜ 5์›์น™์€ 

    1. SRP  : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

    2. OCP : ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™

    3. LSP  : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

    4. ISP : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

    5. DIP  : ์˜์กด ์—ญ์ „ ์›์น™ 

    ์ด ์žˆ๋‹ค.

    ๊ทธ ์ค‘ ์ฒซ๋ฒˆ์งธ ์›์น™, SRP์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ๋‹ค.


    ๋‹จ์ผ์ฑ…์ž„์›์น™ (SRP : SingleResponsibilityPrinciple)


    ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๊ฐ€ ๋‹จ ํ•œ๊ฐ€์ง€ ์—ฌ์•ผ ํ•œ๋‹ค.

     

    ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์€ SRP, Single Responsibility Principle ์ฆ‰, ๋‹จ์ผ ์ฑ…์ž„์›์น™์ด๋‹ค. 

    ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ ์ง€์ผœ์•ผ ํ•  ์›์น™ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. 

     

    ํ•˜์ง€๋งŒ ์–ธ๋œป ๋ณด๋ฉด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ์„ ํ•ด์•ผ ํ•œ๋‹ค ๋ผ๋Š” ๋œป์œผ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

    ์ด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์•กํ„ฐ! ํ•œ ๊ธฐ๋Šฅ๋งŒ์„ ๋‹ด๋‹นํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

            ->  ์—ฌ๊ธฐ์„œ ์•กํ„ฐ๋ž€ ํด๋ž˜์Šค๋ฅผ ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ฃผ์ฒด๋ฅผ ๋งํ•œ๋‹ค. 

    ```

    ์ฆ‰, ๋ฉ”์†Œ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฑ…์ž„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ 
    ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ์ผ๋งŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค!

    ```

     

    SRP๋ฅผ ์œ„๋ฐ˜ํ•œ ์ฝ”๋“œ

    pulic class Employee {
    	private String name;
        private String position;
        
        public Employee (name, position) {
        	this.name = name;
            this.position = position;
        }
        
        void calculateExtraHour() { }
        
        void calculatePay() { //๊ธ‰์—ฌ ๊ณ„์‚ฐ ๋ฉ”์†Œ๋“œ
    		calculateExtraHour();
        }
        void reportHours() { //๊ทผ๋ฌด ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๋ฉ”์†Œ๋“œ
        	calculateExtraHour();
        }
        void save() { } //๋ณ€๊ฒฝ๋œ ์ •๋ณด DB์— ์ €์žฅํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        
    }

     

    ์œ„์—์„œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„ธ๊ฐœ ์žˆ๋‹ค 

    1. calculatePay() ๋Š” ํšŒ๊ณ„ํŒ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธ‰์—ฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฉ”์†Œ๋“œ

    2. reportHours() ๋Š” ์ธ์‚ฌํŒ€์—์„œ ๊ทผ๋ฌด์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ 

    3. save() ๋Š” ๊ธฐ์ˆ ํŒ€์—์„œ ๋ณ€๊ฒฝ๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ

     

    ์ฆ‰, Employee ํด๋ž˜์Šค์—์„œ๋Š” 3๊ฐœ์˜ ์•กํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Facade Pattern ์ด ์žˆ๋‹ค.

     

    Facade Pattern (ํผ์‚ฌ๋“œ ํŒจํ„ด) 

    Facade ๋ž€ ๊ฑด๋ฌผ์˜ ์ •๋ฉด์„ ๋œปํ•œ๋‹ค.

    ์ฆ‰, Facade Pattern ์€ ๋ง ๊ทธ๋Œ€๋กœ ๊ฑด๋ฌผ์˜ ๋’ท๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ , ์ •๋ฉด๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. 

    ์ด์ œ ์œ„ ์ฝ”๋“œ์— ์ด ํŒจํ„ด์„ ์ ์šฉ์‹œ์ผœ ๋ณด์ž 

    public class EmployeeFacade {
    	private String name;
        private String position;
        
        public EmployeeFacade (name, position) {
    		this.name = name;
            this.position = position;
        }
        PayCalculator calculatePay() {
        	return new PayCalculator().calculatePay(); 
        }
        HourReporter reportHours() {
        	return new HourReporter().reportHours();
        }
        EmployeeSaver save() {
        	return new EmployeeSaver().save();
        }
    }
    public class PayCalculator {
    	calculateExtraHour() {}
        calculatePay() {
        	calculateExtraHour();
        }
    }
    
    public class HourReporter{
    	calculateExtraHour() {}
        reportHours() {
        	calculateExtraHour();
        }
    }
    
    publlic class EmployeeSaver{
    	save(){}
    }

    ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด EmployeeFacade ํด๋ž˜์Šค์—์„œ๋Š” ๋กœ์ง์ด ๊ตฌํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. 

    ๋‹จ์ง€ ๊ฐ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ์—ญํ• ๋งŒ ํ•˜๊ฒŒ ๋œ๋‹ค. 

     

    ์ฆ‰, ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด์žˆ๋Š”์ง€ ๊ฑด๋ฌผ์˜ ๋’ท๋ถ€๋ถ„์€ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ 

    ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฑด๋ฌผ์˜ ์ •๋ฉด๋งŒ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ

    ๊ฐ ๋ฉ”์†Œ๋“œ์˜ ๊ตฌํ˜„์€ ๊ฐ ํด๋ž˜์Šค์— ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

     

    ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ 

    ๊ทธ ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋กœ ๊ฐ€ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— EmployeeFacade ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. 

    ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

     

    ๋”ฐ๋ผ์„œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์—‘ํ„ฐ๋งŒ์„ ๋‹ด๋‹นํ•ด์•ผ ํ•œ๋‹ค! 


    ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ  

    1. ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•  ๋•Œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค.

    2. ๊ธฐ๋Šฅ ์ˆ˜์ • ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 

    3. ๋‹จ์ผ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์ด ์ ์–ด์ ธ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ ๋‹ค. 

    4. ์ž‘๊ณ  ์ž˜ ์กฐ์ง๋œ ํด๋ž˜์Šค๋Š” ๊ฒ€์ƒ‰๊ณผ ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค. 

    5. ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ๋ฐ ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.

     

    ํ•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ณด๋‹ค ๊ธธ์–ด์งˆ์ˆ˜์žˆ๋‹ค๋Š” ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด 

    SRP๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ• ๊ฒƒ์ด๋‹ค. 

    ์ด๋•Œ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์™€ ์˜๋ฏธ ํŒŒ์•… ์ธก๋ฉด์—์„œ ๋” ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 

    ์„ค๊ณ„ ์‹œ ์ž˜ ๊ณ ๋ คํ•ด์„œ ์„ค๊ณ„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

    ๋Œ“๊ธ€