3월 27일 월요일 TIL 회고록
Q. 객체지향 프로그래밍(OOP)에 대해 설명해주세요. 알고있는 원칙이나 키워드를 언급해주세요.
객체지향 프로그래밍이란?
객체지향 프로그래밍(OOP)는 객체의 관점에서 프로그래밍 하는 것이고, 객체들이 서로 유기적으로 상호작용 하는 프로그래밍이다.
객체지향의 특징
- 캡슐화: 접근제어 지시자를 통한 정보 은닉(Public > protected > default > private)을 통해 여러가지 형태의 객체를 디자인 (ex: 싱글톤)
- 상속: 상위 클래스의 특징을 하위 클래스에서 상속받아 코드의 중복 제거하고 코드 재사용성을 증대
- 추상화 : 모델링 개념, 클래스 설계를 할 때 공통적으로 묶일 수 있는 기능은 추상화 > 추상클래스 > 인터페이스 모델링해서 향후 다형성으로 확장할 수 있게 설계
- 다형성 : OOP의 꽃
- 다형성을 통해 역할과(인터페이스) 구현을 분리해서 오버라이딩을 통해 서비스의 구현기능을 유연하게 변경, 확장 가능
- 특히 스프링같은 DI컨테이너를 이용하면 다형성을 극대화해서 OCP,DIP 설계 원칙을 잘 지키면서도 구현체를 편리하게 변경, 확장이 가능하다.
객체지향 프로그래밍의 5가지 핵심 원칙, SOLID
SOLID란 객체지향 프로그래밍을 하면서 지켜야하는 원칙으로, S = SRP (단일 책임의 원칙), O = OCP (개방 폐쇄 원칙), L = LSP (리스코프 치환 원칙), I = ISP (인터페이스 분리 원칙) , D = DIP (의존 역전 원칙)의 앞글자를 따서 만들어졌다. SOLID 원칙을 지키면 시간이 지나도 변경이 용이하고, 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 되는 것으로 알려져있다.
SRP (단일 책임의 원칙) : 하나의 클래스는 하나의 책임만 가져야한다. 책임이란 기준이 모호하기 때문에 변경을 책임의 기준으로 삼으면 설계에 용이할 수 있다.
OCP (개방 폐쇄 원칙) : 확장에는 열려있어야하고, 수정에는 닫혀있어야한다.
확장에 열려있다는 의미는 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다는 의미고
수정에 닫혀있다는 의미는 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있어야 한다는 의미이다.
OCP는 결국 추상화를 의미한다. 객체를 추상화함으로써 확장에는 열려있고, 수정에는 닫혀있는 유연한 구조를 만들 수 있다.
OCP를 구현하기 위해서는 DI(Dependency Injection), IoC(Inversion of Container)가 필요하다.
LSP (리스코프 치환 원칙) : 부모 객체와 이를 상속받은 자식 객체가 있을 때, 부모 객체를 호출하는 과정에서 자식 객체가 부모 객체를 완전히 대체할 수 있다는 원칙이다. 객체지향 언어에는 객체의 상속이 일어나는데 이 과정에서 부모/자식 객체가 정의된다.
이 과정에서 자식 객체는 부모 객체의 특성을 가지며, 이를 토대로 확장할 수 있다. 하지만 이 과정에서 무리하거나 객체의 의의와 어긋나는 확장으로 인해 잘못된 방향으로 상속받는 경우가 생긴다. 리스코프 치환 원칙은 올바른 상속을 위해 객체의 확장이 부모 객체의 방향을 온전히 따르도록 권고하는 방식이다.
ISP (인터페이스 분리 원칙) : 객체는 자신이 호출하지 않는 메서드에 의존하지 않아야한다는 원칙이다.
인터페이스 분리 원칙은 객체가 반드시 필요한 기능만 가지도록 제한하는 원칙이다. 불필요한 기능의 상속/구현을 최대한 방지함으로써 객체의 불필요한 책임을 제거한다. 큰 규모의 객체는 필요에 따라 인터페이스로 나누어 확장성을 향상시킨다.
객체를 상속할 땐 해당 객체가 상속 받는 객체에 적합한 객체일지, 의존적인 기능이 없는지 판단하여 올바른 객체를 구현,상속해야 한다.
DIP (의존 역전 원칙) : 의존 역전 원칙이란 고수준 모듈은 저소준 모듈의 구현에 의존해서는 안되며, 저소준 모듈이 고수준 모듈의 구현에 의존해야 한다는 원칙이다. 객체지향 프로그래밍에서는 객체들 사이에 메세지를 주고 받기 위해 의존성이 생기는데, 의존 역전 원칙은 올바른 의존 관계를 위한 원칙에 해당된다.
고수준 모듈 : 입력과 출력으로부터 먼(비즈니스와 관련된) 추상화된 모듈, 인터페이스와 같은 객체의 형태나 추상적 개념
저수준 모듈 : 입력과 출력으로부터 가까운(HTTP,데이터베이스,캐시 등과 관련된) 구현 모듈, 구현된 객체
의존 역전 원칙은 개방 폐쇄 원칙과 밀접한 관련이 있으며, 의존 역전 원칙이 위배되면 개방 폐쇄 원칙도 위배될 가능성이 높다.
정리 : 결국 5가지 핵심 원칙인 SOLID의 핵심은 추상화와 다형성이다. 구체 클래스의 의존하지 않고 추상 클래스 또는 인터페이스에 의존함으로써, 유연하고 확장 가능한 애플리케이션을 만들 수 있는 것이다.
Q. REST API란 무엇인지
REST : 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미
HTTP URL을 통해 자원을 명시하고, HTTP Method (GET,POST,PUT,DELETE 등) 을 통해
해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
REST API는 위(REST)의 원리를 지키는 API이고, REST API를 사용하는 방법은
HTTP 주소에 대문자나 명사를 사용하지 않고,
/를 사용하지 않으며,
_(언더바) 대신 -(하이픈)을 사용한다 등등이 있다.
REST API를 사용한 이유는 사용한 것과 사용하지 않은 것과의 가독성이 차원이 다르기 때문에 REST API를 사용했다.
// REST API 사용 X
/api/Question_Comment/{commentId}/
// REST API 사용
/api/question-comments/{commentId}