안녕하세요, 오늘도 최종프로젝트 진행상황과 기술면접 준비 내용을 정리해보았습니다.
DI, IoC에 대해 설명해주세요.
DI(Dependency Injection)와 IoC(Inversion of Control)는 소프트웨어 디자인 패턴과 원칙으로, 특히 객체 지향 프로그래밍에서 코드의 유연성, 확장성, 테스트 용이성을 높이기 위해 사용됩니다. 이 두 개념은 서로 밀접하게 관련되어 있지만, 각각의 목적과 사용 방식이 다릅니다.
IoC는 제어의 역전이라고 번역되며, 객체의 생성과 라이프사이클 관리, 의존성 주입 등을 컨테이너 또는 프레임워크에 맡기고, 객체는 자신의 주요 로직에 집중할 수 있도록 하는 개념입니다.
전통적인 절차적 프로그래밍에서는 프로그램의 흐름을 개발자가 직접 제어합니다. 반면에 IoC를 적용하면 프로그램의 흐름을 프레임워크나 컨테이너가 제어하게 됩니다. 이는 코드의 재사용성과 확장성을 높이고, 모듈 간의 결합도를 낮추는 데 유리합니다.
대표적인 IoC의 구현 방식으로는 다음과 같은 것들이 있습니다:
DI는 의존성 주입이라고 번역되며, 객체가 직접 의존성을 생성하는 것이 아니라 외부에서 주입받는 방식을 의미합니다. 이는 객체의 의존성을 컨테이너나 외부 설정 파일 등을 통해 주입함으로써 객체 간의 결합도를 낮추고, 코드의 테스트 용이성과 유지보수성을 높여줍니다.
DI의 주요 유형에는 다음과 같은 것들이 있습니다:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
}
public class Car {
private Engine engine;
public void setEngine(Engine engine) {
this.engine = engine;
}
}
public interface EngineSetter {
void setEngine(Engine engine);
}
public class Car implements EngineSetter {
private Engine engine;
@Override
public void setEngine(Engine engine) {
this.engine = engine;
}
}
IoC는 더 넓은 개념으로, DI는 IoC를 구현하는 하나의 방법입니다. IoC가 객체의 제어권을 프레임워크나 컨테이너에 넘기는 큰 그림을 제시한다면, DI는 구체적으로 그 제어권을 의존성 주입을 통해 어떻게 실현할 것인지에 대한 방법론입니다.
Spring Framework는 Java 기반의 대표적인 IoC 컨테이너이며, DI를 적극적으로 활용합니다. Spring에서는 객체의 생명주기를 관리하고, 필요한 의존성을 주입하는 역할을 IoC 컨테이너가 수행합니다. 이를 통해 개발자는 비즈니스 로직 구현에 집중할 수 있고, 의존성 관리나 객체 생성 등의 반복적인 작업을 최소화할 수 있습니다.
객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?
객체지향 프로그래밍은 프로그래밍 패러다임 중 하나로, 프로그램을 객체(object)라는 기본 단위로 구성하는 방법론입니다. 객체는 데이터(속성)와 그 데이터에 대한 동작(메서드)을 포함하며, 객체들이 서로 상호작용하여 프로그램을 구성합니다.
모듈화 및 코드 재사용성 향상: 객체지향 프로그래밍은 코드를 모듈화하여 작성할 수 있어, 특정 기능을 가진 객체를 재사용하기 쉽습니다. 이는 유지보수를 간편하게 하고, 코드의 중복을 줄입니다.
복잡한 시스템의 관리: 객체지향 프로그래밍은 복잡한 시스템을 객체 단위로 나누어 관리하기 쉽게 합니다. 각 객체는 독립적으로 설계되고, 시스템 전체의 구조를 이해하기 쉽게 만듭니다.
유지보수 및 확장성: 객체지향 설계는 시스템의 일부를 수정하거나 확장할 때 다른 부분에 영향을 주지 않도록 설계할 수 있어 유지보수와 확장이 용이합니다.
디자인 패턴 적용: 객체지향 프로그래밍은 다양한 디자인 패턴(예: 싱글톤, 팩토리, 옵저버 등)을 적용하기에 적합합니다. 디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 일반적인 해결책을 제공합니다.
객체지향 프로그래밍은 소프트웨어 설계와 구현에서 강력한 도구입니다. 이를 통해 복잡한 문제를 더 구조적이고 유연하게 해결할 수 있으며, 유지보수성과 확장성을 높여줍니다. 객체지향의 기본 원칙과 개념을 잘 이해하고 활용하면, 더 나은 품질의 소프트웨어를 개발할 수 있습니다.
최종프로젝트
스코프확장논의
구현한거 합동 테스트
포스트맨팀
리팩토링
추가기능정리
추가기능역할분배
AWS S3연결
일정조율
역할별코딩
튜터님피드백