SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 앞글자만 따서 소개한 것이다. SRP, OCP, LSP, ISP, DIP를 포함하고 있다.
1. SRP(단일 책임 원칙)
SRP는 한 클래스가 하나의 책임만을 가져야 한다는 원칙이다. Clean Code 책을 참고했을 때 하나의 책임이란 클래스를 수정해야 할 이유가 한 가지일 때라고 한다.
1) SRP 위배되는 코드
- 클래스를 수정해야 할 경우가 2가지 이상
- Component 관리에 대한 정보를 변경할 때 수정
- Version 정보에 대해 변경할 때 수정
public class SuperDashboard{
// Component 관리
public Component getLastFocusedComponent()
public void setLastFocused(Component lastFocused)
// Version 정보
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
2) SRP를 적용한 코드
- Component 관리와 Version 정보에 대한 클래스 분리를 통해 SRP 적용
public class DashbordComponent{
public Component getLastFocusedComponent()
public void setLastFocused(Component lastFocused)
}
public class DashbordVersion{
public int getMajorVersionNumber()
public int getMinorVersionNumber()
public int getBuildNumber()
}
2. OCP(개방 폐쇠 원칙)
OCP는 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다는 원칙이다. 클래스의 경우 기능 확장은 자유로우나 멤버 변수나 메서드의 수정은 최소화 할 수 있도록 작성되어져야 한다.
1) OCP 위배되는 코드
- 기능 확장과 수정을 할 때 클래스를 수정해야 하는 경우
- 기능을 확장할 때마다 Sql 클래스는 수정
- create, select 등 메서드에 대해 변경할 때 Sql 클래스가 수정
public class Sql {
public Sql(String table, Column[] columns);
create(string table, Colums[] columns)
select(string table, Colums[] columns);
}
2) OCP를 적용한 코드
- Sql를 추상화 클래스로 만들고 crate, select 등의 기능을 하위 클래스로 분리하여 OCP 적용
- 이후 각 기능이 변경되면 해당 기능을 가진 클래스만 수정 (변경에 닫힘)
- 기능이 추가되면 새로운 클래스를 만들어 확장 가능 (확장에 열림)
abstract public class Sql {
public Sql(String table, Column[] columns);
abstract public String generate();
}
public class CreateSql extends Sql {
public CreateSql(string table, Column[] columns)
@Override public String generate()
}
public class SelectSql extends Sql{
public SelectSql(String, table, Column[] columns)
@Override public String generate()
}
다음 장에서는 SOLID의 LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 관계 역전 원칙)에 대한 간단한 정의와 예제를 다룰 것이다.
'개발공부' 카테고리의 다른 글
[ Java Spring ] List 정렬하기 (0) | 2022.12.19 |
---|---|
[ Java Spring ] CRUD Repository vs JPA Repository (0) | 2022.12.04 |
DB 외부 접속 포트 포워딩 문제 (0) | 2022.11.21 |
[ 인생퍼즐 ] TypeORM Transaction 사용 (0) | 2022.09.04 |
객체 지향 설계 - SOLID(2) (0) | 2022.03.14 |