SOLID ์›์น™

2024. 4. 7. 23:31ยท๐ŸŽฏ Programming
๋ฐ˜์‘ํ˜•

โœ… SOLID ์›์น™์ด๋ž€?

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ์ง€์ผœ์•ผ ํ•  5๊ฐœ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์›์น™์œผ๋กœ SRP, OCP, LSP, ISP, DIP์˜ ์•ž๊ธ€์ž๋ฅผ ๋”ฐ์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ž˜ ์„ค๊ณ„๋˜์—ˆ๋Š”์ง€ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ์— ๋„์›€์ด ๋˜๋Š” ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค.

  • SRP: Single Responsibility Principle, ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™
  • OCP: Open Closed Principle, ๊ฐœ๋ฐฉ ํ์‡„์˜ ์›์น™
  • LSP: Liskov Substitution Principle, ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜์˜ ์›์น™
  • ISP: Interface Segregation Principle, ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ์˜ ์›์น™
  • DIP: Dependency Inversion Principle, ์˜์กด ์—ญ์ „์˜ ์›์น™

 

 

๐Ÿท ๋‚˜์œ ์„ค๊ณ„์˜ ํŠน์ง•

  • ๊ฒฝ์ง์„ฑ(Shotgun): ํ•˜๋‚˜๋ฅผ ๊ณ ์น˜๋ฉด ๋งˆ์น˜ ๋„๋ฏธ๋…ธ์ฒ˜๋Ÿผ ์˜ํ–ฅ์ด ํผ์ ธ์„œ ์ „์ฒด์ ์ธ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.
  • ๋ถ€์„œ์ง€๊ธฐ ์‰ฌ์›€: ํ•˜๋‚˜๋ฅผ ๊ณ ์ณค๋Š”๋ฐ ์ž‘๋™์ด ๋ฉˆ์ถ˜๋‹ค.
  • ๋ถ€๋™์„ฑ: ์žฌ์‚ฌ์šฉ์ด ์–ด๋ ต๋‹ค.
  • ๋ˆ๋ˆํ•จ(long cycle): ํ•˜๋‚˜๋ฅผ ๊ณ ์น˜๋ฉด ๋‹ค๋ฅธ ๊ณณ๋„ ๊ณ„์† ๊ณ ์ณ์•ผ ํ•ด์„œ ์™„์„ฑ์ด ์•ˆ๋œ๋‹ค.
  • ์“ธ๋ฐ์—†์ด ๋ณต์žกํ•จ: ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๋‹ค.
  • ํ•„์š” ์—†๋Š” ๋ฐ˜๋ณต: ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค.
  • ๋ถˆํˆฌ๋ช…ํ•จ: ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ํฌ๋ฏธํ•˜๋‹ค.

 

 

๐Ÿท ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ

๋‚˜์œ ์„ค๊ณ„์˜ ๋Œ€ํ‘œ์ ์ธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ๋ชจ์Šต์ด ๋งˆ์น˜ ์ŠคํŒŒ๊ฒŒํ‹ฐ์˜ ๋ฉด๋ฐœ๊ณผ ๊ฐ™๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

๋กœ์ง์ด ๊ต‰์žฅํžˆ ๋ณต์žกํ•˜์—ฌ ์ˆ˜์ •์ด ์–ด๋ ต๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ
์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ์˜ ๋ชจ์Šต

 


 

1๏ธโƒฃ SRP(Single Resposibility Principle, ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™)

ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์˜ค์ง ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐํ•ฉ๋œ ์ฑ…์ž„์€ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฑ…์ž„์ด๋ž€ ์‰ฝ๊ฒŒ '๊ธฐ๋Šฅ'์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

public class Student{
	// ๊ฐ ํ•„๋“œ์˜ getter์™€ setter๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •
    private int id;
	private string Name; 
    private string Birth;
    private char Gender; 
    public object Export(string format); // ์ฃผ์–ด์ง„ ํฌ๋งท์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜
}

[๋ฌธ์ œ์ ]

์œ„ ์˜ˆ์‹œ์—์„œ Student์˜ ์ฑ…์ž„์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(1) ํ•™์ƒ์˜ ํ•™๋ฒˆ ์ด๋ฆ„, ์ƒ๋…„์›”์ผ, ์„ฑ๋ณ„์„ ์ €์žฅํ•˜๋Š” ์—ญํ• 

(2) ๋‹ค๋ฅธ ํฌ๋งท์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• 

=> ํ•œ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

[์›์น™ ์ ์šฉ]
๋”ฐ๋ผ์„œ Export ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SRP ์›์น™์„ ์ ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

public class Student{
	// ๊ฐ ํ•„๋“œ์˜ getter์™€ setter๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •
    private int id;
	private string Name; 
    private string Birth;
    private char Gender;
}

public class Exporter{
    public object Export(string format);
}

 

 

๐Ÿท ์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery)

์•ž์—์„œ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๋‚˜๋ˆ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ์š”? ์—ฌ๊ธฐ์„œ ๋‚˜์˜จ ๊ฐœ๋…์ด ๋ฐ”๋กœ ์‚ฐํƒ„์ด ์ˆ˜์ˆ ์ž…๋‹ˆ๋‹ค.

 

์‚ฐํƒ„์ด์€ ์ด์•Œ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํƒ„์ด ๋“ค์–ด์žˆ์–ด ์ด์•Œ์„ ๋งž๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํƒ„์„ ์ผ์ผ์ด ์ฐพ์•„์„œ ์น˜๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ '์ด์•Œ'์€ '์ฑ…์ž„'์œผ๋กœ, 'ํƒ„'์€ 'ํด๋ž˜์Šค'๋กœ ๋น„์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ฆ‰, ์‚ฐํƒ„์ด ์ˆ˜์ˆ ์ด๋ž€ ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋“ค๋กœ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™์„ ์ ์šฉํ•ด ์„ค๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 


 

2๏ธโƒฃ OCP(Open Closed Principle, ๊ฐœ๋ฐฉ ํ์‡„์˜ ์›์น™)

์†Œํ”„ํŠธ์›จ์–ด์˜ ์š”์†Œ๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ์—ด๋ ค ์žˆ์ง€๋งŒ, ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ์˜ ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ, ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ˆ˜์ •์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ์‰ฝ๊ฒŒ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ด์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์ด์–ด๊ฐ€ ๋ด…์‹œ๋‹ค. 

public class Exporter{
    public object Export(string format){
    	switch(format){
        	case "Grade": // ์„ฑ์ ํ‘œ
            	... // ํ•™์ƒ์˜ ๋ชจ๋“  ์„ฑ์ ์ด ์—‘์…€ํ‘œ๋กœ ์ €์žฅ
            case "Attendance": // ์ถœ์„๋ถ€
            	... // ์ด๋ฆ„, ํ•™๋ฒˆ ์ˆœ์„œ์˜ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
            default:
            	...
        }
    }
}

[๋ฌธ์ œ์ ]

Export ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด๋ฉด switch-case๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ƒˆ๋กœ์šด format ํ˜•์‹์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด, case๋ฌธ์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ Exporter ํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

=> ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‰ฝ๊ฒŒ ํ™•์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

[์›์น™ ์ ์šฉ]

OCP ์›์น™์„ ์ง€ํ‚ค๋ ค๋ฉด Exporter๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ , ์ด๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ format๋ณ„๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

public abstract class Formatter{
	public abstract Stream Format(Student student);
}

public class AttendanceFormatter extends Formatter{
	public Stream Format(Student student){
    	return AttendanceStream;
    }
}

public class GradeFormatter extends Formatter{
	public Stream Format(Student student){
    	excel.save(location);
    	return GradeStream;
    }
}

 


 

3๏ธโƒฃ LSP(Liskov Substitution Principle, ๋ฆฌ์Šค์ฝ”ํ”„ ๊ต์ฒด์˜ ์›์น™)

์„œ๋ธŒ ํƒ€์ž…์€ ๋ฒ ์ด์Šค ํƒ€์ž…์— ๊ต์ฒด๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

์Šˆํผ ํด๋ž˜์Šค์—์„œ ๋ฐ›๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ๋‹ค ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, ์Šˆํผ  ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์„ ๋•Œ ์œ ํšจํ•˜๋ฉด ์„œ๋ธŒ ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์„ ๋•Œ๋„ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

OCP ์›์น™์„ ์ ์šฉํ•œ ํ›„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ด…์‹œ๋‹ค.

public abstract class Formatter{
	public abstract Stream Format(Student student);
}

public class AttendanceFormatter extends Formatter{
	public Stream Format(Student student){
    	return AttendanceStream;
    }
}

public class GradeFormatter extends Formatter{
	public Stream Format(Student student){
    	excel.save(location);
    	return GradeStream;
    }
}

[๋ฌธ์ œ์ ]

(1) GradeFormatter์˜ Format ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด location์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์“ฐ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ณ€์ˆ˜๋Š” ์–ด๋””์—์„œ๋„ ๋ฐ›์•„์˜ค์ง€๋„ ์„ ์–ธ๋˜์–ด ์žˆ์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ location ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(2) ๋˜ํ•œ, ์ง€๊ธˆ Format ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด Stream์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š”๋ฐ, Attendance์ผ ๋•Œ๋Š” string์ด, Grade์ผ ๋•Œ๋Š” null์ด ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

=> ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์„œ๋ธŒ ํด๋ž˜์Šค๋“ค์ด ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

[์›์น™ ์ ์šฉ]

LSP ์›์น™์„ ์ ์šฉํ•˜์—ฌ ๊ณ ์ณ๋ด…์‹œ๋‹ค.

public abstract class Formatter{
	public abstract Object Format(Student student, string? location);
}

public class AttendanceFormatter extends Formatter{
	public String Format(Student student, string? location){
    	return attString;
    }
}

public class GradeFormatter extends Formatter{
	public Object Format(Student student, string? location){
    	excel.save(location);
    	return null;
    }
}

๋ถ€๋ชจ ํด๋ž˜์Šค์˜ (1) ํŒŒ๋ผ๋ฏธํ„ฐ์— location์„ ์ถ”๊ฐ€ํ•˜๊ณ , (2) ๋ฐ˜ํ™˜ ํƒ€์ž…์„ Object๋กœ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ฝ”๋“œ์—์„œ `string?` ๋ฌผ์Œํ‘œ์˜ ์˜๋ฏธ๋Š” null ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ํฌ๋งท์ด Attendance์ผ ๋•Œ๋Š” location ๊ฐ’์ด null์ด๊ณ  Grade์ผ ๋•Œ๋Š” null์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

๋ฐ˜ํ™˜ ํƒ€์ž…์„ Object๋กœ ๋ณ€ํ™˜ํ•จ์œผ๋กœ์จ ํฌ๋งท์ด Attendance ์ผ ๋•Œ๋Š” string์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  Grade ์ผ ๋•Œ๋Š” null ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ Object ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ž๋ฐ” ํด๋ž˜์Šค์˜ ์ตœ๊ณ  ์กฐ์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

 


 

4๏ธโƒฃ ISP(Interface Segregation Principle, ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉ์— ๋งž๊ฒŒ ์ž˜ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

์ฆ‰, ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

SRP๊ฐ€ ํด๋ž˜์Šค์˜ ๋‹จ์ผ ์ฑ…์ž„์„ ์ฃผ์žฅํ•œ๋‹ค๋ฉด, ISP๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹จ์ผ ์ฑ…์ž„์„ ์ฃผ์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์•ž์„œ ์“ด ์ฝ”๋“œ๋ฅผ ์‚ด์ง ์ˆ˜์ •ํ•ด์„œ ISP ์›์น™์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

public interface Formatter{
	public void Save(Stduent student);
    public Stduent Get(int id);
}

public class ReadOnlyRepository implements Formatter{
	public void Save(Stduent student){
    	throw NotImplementedException();
    }
    public Stduent Get(int id){
    	return db.findById(id);
    }
}

[๋ฌธ์ œ์ ]

๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฉ”์„œ๋“œ 2๊ฐœ๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

ReadOnlyRepository ํด๋ž˜์Šค๋Š” ์ด๋ฆ„์—์„œ ๋ณด๋“ฏ์ด db๋กœ๋ถ€ํ„ฐ ์ฝ๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์–ด ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Save ํ•จ์ˆ˜๋ฅผ NotImplementedException์„ ํ†ตํ•ด '๋‚˜๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฑฐ๋‹ค~'๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

=> ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜„์žฌ ๊ฐ•์ œ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

[์›์น™ ์ ์šฉ]

ISP ์›์น™์— ๋งž๊ฒŒ ๊ณ ์น˜๋ ค๋ฉด ๊ฒฐ๊ตญ readonly ์šฉ๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ writeonly ์šฉ๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋‘ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ReadOnlyRepository๋Š” readonly ์šฉ๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ตฌํ˜„ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ˆ˜์ •์ด ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋Š” ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

5๏ธโƒฃ DIP(Dependency Inversion Principle, ์˜์กด ์—ญ์ „์˜ ์›์น™)

๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ๊ทธ ๋Œ€์ƒ์˜ ์ƒ์œ„ ์š”์†Œ์ธ ์ถ”์ƒ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

์ฆ‰, ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์•„๋‹Œ ์ถ”์ƒ์ ์ธ ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. 

 

์ด๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…์ด ๋” ๋งŽ์ด ๋ณ€ํ•˜๊ณ  ๋ถˆ์•ˆ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ถ”์ƒ์ ์ธ ๊ฐœ๋…์€ ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š๋Š” ๋ช…์„ธ์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ์ถ”์ƒ์ ์ธ ๊ฒƒ, ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ƒˆ๋กœ์šด ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

public class Kid {
    private Robot toy;
    public void setToy(Robot toy) {
        this.toy = toy;
    }
    public void play() {
        System.out.println(toy.toString());
    }
}

public class Main{
    public static void main(String[] args) {
        Robot robot = new Robot();
        Kid k = new Kid();
        k.setToy(robot);
        k.play();
    }
}

[๋ฌธ์ œ์ ]

์œ„ ์ฝ”๋“œ์—์„œ Kid๋Š” Robot์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ toy๋กœ Robot์ด ์•„๋‹Œ Lego๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

Kid ๋‚ด๋ถ€์˜ ๋ชจ๋“  Robot ๋ถ€๋ถ„ ์ฝ”๋“œ๋ฅผ Lego๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ์šด Lego toy ๊ฐ์ฒด์— ์˜์กดํ•˜๋„๋ก ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

=> ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

[์›์น™ ์ ์šฉ]

์—ฌ๊ธฐ์— DIP ์›์น™์„ ์ ์šฉํ•˜๋ฉด, Robot๊ณผ Lego ํด๋ž˜์Šค์˜ ์ƒ์œ„ ์š”์†Œ์ธ Toy ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

public class Kid {
    private Toy toy;
    public void setToy(Toy toy) {
        this.toy = toy;
    }
    public void play() {
        System.out.println(toy.toString());
    }

๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ toy๋กœ ์ƒˆ๋กœ์šด ์žฅ๋‚œ๊ฐ์„ ํ• ๋‹นํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Toy์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ์ƒˆ๋กœ์šด ์žฅ๋‚œ๊ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค.

Kid์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'๐ŸŽฏ Programming' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐฉ๋ฒ•(+์ •๋ ฌ)  (1) 2025.01.31
[Github Action] build ์˜ค๋ฅ˜ ์›์ธ ๋” ์ž์„ธํžˆ ๋ณด๋Š” ๋ฒ•  (0) 2024.10.08
[ISSUE] boolean์—์„œ is๊ฐ€ ์ƒ๋žต๋˜๋Š” ๋ฌธ์ œ  (0) 2024.09.06
์ธํ„ฐํŽ˜์ด์Šค(Interface) vs ์ถ”์ƒ ํด๋ž˜์Šค(Abstract class)  (0) 2024.05.25
'๐ŸŽฏ Programming' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [JAVA] ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐฉ๋ฒ•(+์ •๋ ฌ)
  • [Github Action] build ์˜ค๋ฅ˜ ์›์ธ ๋” ์ž์„ธํžˆ ๋ณด๋Š” ๋ฒ•
  • [ISSUE] boolean์—์„œ is๊ฐ€ ์ƒ๋žต๋˜๋Š” ๋ฌธ์ œ
  • ์ธํ„ฐํŽ˜์ด์Šค(Interface) vs ์ถ”์ƒ ํด๋ž˜์Šค(Abstract class)
dev-heyjin
dev-heyjin
  • dev-heyjin
    ๊ฐœ๋ฐœ ๊ธฐ๋ก
    dev-heyjin
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (56)
      • ๐ŸŽฏ Programming (8)
      • ๐Ÿ’ช Algorithm (16)
      • โš™๏ธ CS (31)
        • ๋„คํŠธ์›Œํฌ (15)
        • ์šด์˜์ฒด์ œ (15)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    RDS
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    ํ•ดํ‚น
    DB
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
dev-heyjin
SOLID ์›์น™
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”