자바 OOP 5원칙 - SOLID

kwj1830·2022년 5월 23일
0
post-thumbnail

SOLID

1. Single Responsbility Principle (SRP) : 단일 책임 원칙

1개의 클래스는 1개의 책임만 가져야 한다.

public class Member() {

private long id;

@NotEmpty
private String loginId;

@NotEmpty
private String password;

public Member(long id, String loginId, String password) {
	this.id = id;
    this.loginId = loginId;
    this.password = password;
}

private String itemId;
private String itemName;

}

상기 코드는 임의의 프로그램에서 회원 관리하기 위한 Member 클래스다. 근데 Member 클래스에 회원이 가진 item까지 정의되어 있다. 이는 단일 책임 원칙에 위배되며, item을 위한 다른 Item 클래스를 만들어서 책임을 분리해 주는 것이 좋다.

만약 Member와 관련된 기능이라할지라도, 저 Member는 Member의 필드를 저장하기 위한 책임만을 가져야하며, Member의 저장소 역할을 한다거나, 서비스와 관련된 기능이 있으면 안된다.

2. Open / Closed Principle (OCP) : 개방 폐쇄 원칙

확장에는 열려있어야 하며, 변경에는 닫혀있어야 한다.

public interface MemberRepository() {

public save();
public findById();
public findAll();

}

Member를 저장하기 위한 Repository 클래스가 있다고 하자. 이 친구는 컴퓨터 Memory에 저장하는 클래스다. 이후 정책이 바뀌어서 MongoDB나 SQL을 이용하게 된다면 상기 Repository를 수정하는 것이 아닌, interface를 활용해서 확장 후 사용 하는 것이 바람직하다.

public class JPAMemberRepo() implements MemberRepository {

// 내용 생략

}

기존 클래스를 수정하는 것이 아닌 새로운 클래스를 만든다는 것으로 볼 수도 있겠다.

3. Liskov Substitution Principle (LSP) : 리스코브 치환 원칙

하위 클래스는 언제나 상위 클래스로 교체할 수 있어야 한다.

하위 클래스는 언제나 상위 클래스의 한 종류여야 하며,
구현 클래스는 언제나 인터페이스의 한 종류여야 한다. 즉 속해있어야 한다.

이 원칙을 지켜야 다형성과 DIP를 지킬 수 있다.

MemberRepository는 하위 클래스로 JPAMemberRepo를 가지고 있으며, MemberRepository를 선언 하고 JPAMemberRepo를 사용할 수 있어야 한다.

4. Iterface Segregation Principle (ISP) : 인터페이스 분리 원칙

하나의 범용 인터페이스보다, 작은 기능 여러개 인터페이스가 좋다.

1번과도 연결 될 수 있다. 한 개의 인터페이스가 다양한 기능을 가지기 보단 여러개로 쪼개놔야 다른 확장에도 매우 유리해지며, 유지보수에도 유리하다.

  • 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스 등으로 분리
  • 사용자 클라이언트 -> 운전자, 정비사로 분리가 가능

만야 정비 메커니즘이 변하더라도, 운전에 전혀 영향을 주지 않는다. 이를 지키면 인터페이스가 명확해진다.

스프링이나 java 내부 메서드들을 본다면 철저하게 이 ISP에 따라 다양한 인터페이스가 있는 것을 확인할 수 있다.

5. Dependency Inversion Principle (DIP) : 의존관계 역전 원칙

구체화된 클래스에 의존하기보다 추상화 클래스에 의존해야 한다.

MemberRepository를 활용하는 서비스를 짤 때 의존관계 주입시 실제 구체회된 JPAMemberRepo를 넣는 다면, 향후 또 다른 Repo 정책 변경시 서비스 클래스 전체를 고쳐야 하는 사고가 발생할 수 있다. 그렇기에 서비스를 짤 때 상위 클래스인 MemberRepository를 사용한다면 LSP에 의해 JPAMemberRepo나 다른 클래스를 사용할 수 있을 것이다.

클래스를 만들 때 의존관계가 필요하다면 인터페이스에 의존하게 해야 한다.

profile
https://potent-grey-e01.notion.site/36c7ffc9d32e4e83b325da26ed8d1728<-- 포트폴리오

0개의 댓글