1. 객체지향 프로그래밍이란 무엇인가요? 그리고 그 주요 특징은 무엇인가요?

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍의 패러다임 중 하나로, 프로그램을 '객체'라는 기본 단위로 구성하고 이러한 객체들이 상호 작용하도록 하는 방식입니다. 각 객체는 데이터(속성)와 그 데이터를 조작하는 방법(메서드)를 포함하고 있습니다. 패러다임의 주요 특징은 다음과 같습니다:

  1. 캡슐화(Encapsulation): 객체의 데이터와 메서드를 함께 묶는 것을 의미하며, 객체의 상태를 직접 변경하지 못하게 하고 메서드를 통해서만 접근을 허용하는 방식입니다. 이를 통해 데이터의 안전성을 보장하며, 구현 내용을 숨기고 사용자에게는 필요한 기능만을 제공하는 인터페이스를 제공합니다.
  2. 상속(Inheritance): 상속은 클래스 간에 코드를 재사용하고 계층 구조를 형성하는 데 사용됩니다. 기존 클래스의 속성과 메서드를 새 클래스가 상속받아 사용할 수 있으며, 이를 통해 코드 중복을 줄이고 유지 관리를 용이하게 할 수 있습니다.
  3. 다형성(Polymorphism): 하나의 메서드나 클래스가 있을 때 이를 여러 방법으로 동작시키는 기능을 의미합니다. 오버라이딩(상속 받은 메서드를 재정의) 및 오버로딩(동일한 이름의 메서드를 다른 파라미터로 사용)이 다형성에 포함됩니다.
  4. 추상화(Abstraction): 복잡한 시스템을 단순화하는 기법으로, 필요한 기능만을 표현하고 불필요한 정보는 숨깁니다. 이를 통해 사용자는 간단한 인터페이스를 통해 복잡한 시스템을 다룰 수 있게 됩니다.

이러한 특징들은 코드의 재사용성을 높이고, 모듈성을 증가시키며, 유지 관리를 용이하게 하여 소프트웨어 개발을 효율적으로 만드는 크게 기여합니다.

 

2. 절차지향 프로그래밍과 객체지향 프로그래밍의 주요 차이점을 설명해주실 수 있나요?

절차지향 프로그래밍과 객체지향 프로그래밍은 프로그래밍 방식에 있어서 근본적으로 다른 접근 방식을 가지고 있습니다.

절차지향 프로그래밍은 프로그램이 순차적으로 실행되도록 설계하며, 데이터를 입력 받아서 처리하고 결과를 출력하는 일련의 과정을 순서대로 기술하는 방식입니다. 이런 방식은 컴퓨터의 처리 방식과 유사하여 초기의 프로그래밍 언어에서 주로 사용되었습니다. 대표적인 절차지향 언어로는 C언어가 있습니다.

절차지향 프로그래밍의 주요 특징과 단점은 다음과 같습니다:

  • 코드의 순서가 프로그램의 흐름과 일치하므로 이해하기 쉽습니다.
  • 일반적으로 빠른 실행 속도를 가집니다.
  • 하지만 프로그램이 커지고 복잡해질수록 유지보수와 코드의 재사용이 어렵습니다.
  • 또한 함수 내부에서 데이터를 직접 변경하므로 코드의 추적이 어렵고 디버깅이 어려울 수 있습니다.

반면, 객체지향 프로그래밍은 프로그램을 여러 개의 독립된 '객체'로 구성하고, 이들 객체 간의 상호작용으로 프로그램을 설계하는 방식입니다. 각 객체는 상태(데이터)와 행동(메서드)을 가지며, 이를 통해 실세계의 사물이나 개념을 추상화하여 프로그램에 반영하는 것이 가능합니다. 대표적인 객체지향 언어로는 Java, C++, Python 등이 있습니다.

객체지향 프로그래밍의 주요 특징과 장점은 다음과 같습니다:

    • 코드의 재사용이 용이하며, 유지보수가 쉽습니다.
    • 객체 간의 정보은닉(캡슐화)이 가능하여 데이터의 보안성이 높습니다.
    • 실세계의 개념을 직관적으로 코드에 반영할 수 있어 설계 과정이 자연스럽습니다.
    • 다형성, 상속 등의 개념을 통해 유연성과 확장성이 높은 프로그램을 작성할 수 있습니다.
    • 하지만 객체 간의 상호작용이 복잡해질수록 전체 시스템을 이해하기 어렵고, 실행 속도가 절차지향 프로그래밍에 비해 상대적으로 느릴 있지만, 이는 대형 시스템에서는 큰 문제가 되지 않습니다. 오늘날의 컴퓨터는 충분히 빠르기 때문에, 대부분의 경우에서 객체지향 프로그래밍의 여러 가지 이점이 속도 저하를 상쇄합니다.
    • 객체지향 프로그래밍의 주요 원칙 중 하나는 DRY(Don't Repeat Yourself) 원칙입니다. 이 원칙은 코드 중복을 최소화하고 코드의 재사용을 극대화하도록 권장합니다. 이는 메서드와 클래스를 잘 설계하여 여러 위치에서 재사용할 수 있게 함으로써 달성할 수 있습니다.
    • 마지막으로, 객체지향 프로그래밍은 테스트와 디버깅을 용이하게 합니다. 객체는 상대적으로 독립적이므로 개별적으로 테스트하고 디버깅할 있습니다. 이는 유닛 테스트 작성을 쉽게 하며, 코드의 품질을 향상시키는 도움이 됩니다.
    • 객체지향 프로그래밍의 또 다른 특징은 코드의 모듈성입니다. 이는 객체 간의 통신이 메서드 호출을 통해 이루어진다는 사실에서 기인합니다. 각 객체는 독립적인 엔티티로, 다른 객체와 상호작용하기 위해 정의된 인터페이스를 통해 통신합니다. 이 접근 방식은 코드의 재사용을 쉽게 만들며, 시스템의 다른 부분에 영향을 미치지 않고 개별 객체를 업데이트하거나 수정할 수 있습니다.

3. 관점지향 프로그래밍(AOP)에 대해 알고 있나요? 그리고 어떤 상황에서 AOP를 사용하면 좋을까요?

  • 관점지향 프로그래밍(Aspect-Oriented Programming, AOP)은 특정 로직을 기존 코드 전반에 걸쳐 재사용하도록 설계된 프로그래밍 기법입니다. 이는 로직의 분산(Distributed Logic)을 방지하며, 관련 없는 코드가 섞이는 것을 피할 수 있습니다. 이를 통해 코딩의 복잡성을 줄이고, 가독성을 향상시킬 수 있습니다.
  • AOP는 '관심사(Cross-cutting Concerns)'의 분리를 통해 이를 달성합니다. 관심사는 프로그램의 다양한 부분에 걸쳐 나타나는 특정 기능이나 규칙을 의미합니다. 로깅, 보안, 트랜잭션 관리 등이 그 예입니다. 이러한 관심사를 별도의 모듈('관점')으로 분리하고, 핵심 로직에서는 이를 참조하지 않도록 합니다. 이렇게 함으로써 핵심 로직의 순수성과 재사용성을 보장할 수 있습니다.
  • AOP를 사용하면 좋은 상황은 주로 다음과 같습니다:
  1. 로깅: 여러 메소드나 클래스에 걸쳐 반복적으로 사용되는 로깅 기능을 AOP를 이용해 한 곳에서 관리할 수 있습니다.
  2. 트랜잭션 관리: 특정 조건에 따라 트랜잭션을 시작하거나 커밋, 롤백하는 등의 기능을 AOP를 통해 캡슐화할 수 있습니다.
  3. 보안: 특정 메소드 호출 전에 권한을 체크하는 등의 보안 검사 로직을 AOP를 통해 적용할 수 있습니다.
  4. 에러 처리: 공통적인 에러 처리 패턴을 AOP를 이용해 한 곳에서 관리하고 재사용할 수 있습니다.

Java Spring 프레임워크에서는 AOP 지원하며, 관련 기능을 구현하는데 많이 사용됩니다.

 

4. AOP를 사용함으로써 어떤 장점을 얻을 수 있나요? 구체적인 예를 들어 설명해주세요.

AOP (Aspect-Oriented Programming)는 관점지향 프로그래밍으로서 코드의 중복을 줄이고, 모듈화를 통해 각 기능을 분리하여 관리할 수 있는 프로그래밍 패러다임입니다. AOP를 사용함으로써 얻을 수 있는 주요 장점과 구체적인 예시는 다음과 같습니다:

  1. 중복 코드 제거: AOP를 이용하면 공통 기능을 한 곳에 모듈화하여 여러 위치에서 재사용할 수 있습니다. 이는 코드의 중복을 줄여주고 코드의 가독성을 높여줍니다. 예를 들어, 서비스의 여러 메서드에서 동일한 로깅 또는 에러 핸들링 로직이 필요한 경우, 이를 별도의 '관점'으로 분리하여 코드 중복을 줄일 수 있습니다.
  2. 모듈화 및 코드의 유지 보수성 향상: AOP는 관심사의 분리(SoC, Separation of Concerns)를 통해 모듈화를 지원합니다. 이는 각 기능을 독립적으로 개발하고 유지 보수할 수 있도록 해주며, 따라서 코드의 유지 보수성이 향상됩니다. 예를 들어, 보안, 트랜잭션 관리, 로깅과 같은 공통 기능을 별도의 '관점'으로 분리하여 각 기능을 독립적으로 개발하고 유지 보수할 수 있습니다.
  3. 추가 기능 적용 용이: AOP는 비즈니스 로직과는 별개의 공통 기능을 쉽게 추가할 수 있도록 합니다. 이는 프로그램의 기능 확장을 용이하게 합니다. 예를 들어, 특정 메서드 호출 시에 성능 측정 로직을 추가하고 싶을 경우, AOP를 통해 성능 측정 관점을 만들고 이를 적용할 메서드에 적용함으로써 쉽게 성능 측정 기능을 추가할 수 있습니다.
  4. 프로그램의 가독성 향상: 각 기능이 모듈화되어 분리되므로, 개별 기능에 대한 이해가 용이해지고 프로그램의 전체적인 가독성이 향상됩니다.

이런 장점들 덕분에 AOP Spring 같은 프레임워크에서 흔히 사용되며, 비즈니스 로직의 효율적인 관리와 기능 확장성 제공 등에 크게 기여합니다.

 

5. 절차지향, 객체지향, 관점지향 각 프로그래밍 패러다임이 적합한 사례나 상황에 대해 설명해주실 수 있나요?

  1. 절차지향 프로그래밍(Procedural Programming):
  • 절차지향 프로그래밍은 프로그램을 일련의 절차나 단계로 보는 프로그래밍 방식입니다. 이 방식은 간단하고 직관적이며, 상대적으로 빠른 실행 속도를 가집니다. 하지만 코드가 복잡해질수록 유지보수와 확장이 어려울 수 있습니다.
  • 절차지향 프로그래밍은 프로그램이 순차적으로 명령을 수행하는 문제나, 간단하고 명확한 절차를 가지는 문제를 해결하는 데 적합합니다. 예를 들어, 순차적인 단계를 거치는 데이터 분석이나, 간단한 계산기나 문자열 처리 등의 애플리케이션을 만드는데 적합합니다.
  1. 객체지향 프로그래밍(Object-Oriented Programming):
  • 객체지향 프로그래밍은 실세계의 사물이나 개념을 추상화하여 클래스와 객체로 나타내는 프로그래밍 방식입니다. 코드의 재사용성과 유지보수가 용이하며, 다형성, 상속 등을 통해 유연성과 확장성이 높은 프로그램을 작성할 수 있습니다.
  • 객체지향 프로그래밍은 복잡하고 대형의 소프트웨어 시스템을 개발하거나, 여러 사람이 협업해야 하는 프로젝트, 또는 유지보수와 확장이 필요한 시스템을 개발하는 데 적합합니다. 예를 들어, GUI 애플리케이션, 웹 애플리케이션, 데이터베이스 시스템, 분산 시스템 등에 적합합니다.
  1. 관점지향 프로그래밍(Aspect-Oriented Programming):
  • 관점지향 프로그래밍은 여러 모듈이 공통으로 사용하는 기능(로그 기록, 보안 확인 등)을 분리하여 관리하는 프로그래밍 방식입니다. 이 방식은 코드의 재사용성을 높이고 중복을 줄일 수 있습니다.
  • 관점지향 프로그래밍은 프로그램의 다양한 부분에 걸쳐 있는 공통 기능을 모듈화하고 재사용하는 데 적합합니다. 예를 들어, 로깅, 트랜잭션 관리, 보안 등의 공통 기능을 분리, 관리할 수 있습니다. 이런 공통 기능들은 프로그램의 여러 위치에서 반복적으로 발생하며, 이를 횡단 관심사(cross-cutting concern)라고 부릅니다. 이런 횡단 관심사를 별도의 코드로 분리함으로써 기능 간의 결합도를 낮추고, 유지보수와 재사용성을 높일 수 있습니다.
  • AOP는 로깅, 보안, 트랜잭션 관리 등과 같이 여러 객체나 함수, 클래스에 걸쳐 공통적으로 필요한 기능을 분리하여 개발하고 싶을 때 유용합니다. 예를 들어, 서비스의 모든 메소드 호출 시간을 로깅하고자 한다면, 각 메소드마다 로깅 코드를 삽입하는 것이 아니라 AOP를 사용하여 해당 기능을 분리하고 중앙에서 관리할 수 있습니다. 이는 코드의 중복을 줄이고, 가독성과 유지보수성을 향상시키는 데 도움이 됩니다.
  • AOP 스프링 프레임워크와 같은 엔터프라이즈급 애플리케이션에서 흔히 사용되며, 이를 통해 서비스의 일관성을 유지하고 코드의 품질을 향상시킬 있습니다.

6. 특정 프로젝트에 적절한 프로그래밍 패러다임을 선택하는 기준은 무엇이라고 생각하나요?

  1. 프로젝트의 복잡성과 크기: 규모의 프로젝트에서는 코드 재사용성, 모듈성, 유지보수성 등이 중요해질 있습니다. 경우, 객체지향 프로그래밍이나 함수형 프로그래밍 같은 패러다임을 사용하면 좋습니다. 반면, 작은 프로젝트에서는 절차지향 프로그래밍이 충분할 있습니다.
  2. 동시에 많은 사용자가 접속하는 서비스: 많은 사용자가 동시에 서비스를 이용하면서 병렬로 처리되어야 하는 작업이 많은 경우, 함수형 프로그래밍이 유리할 있습니다. 함수형 프로그래밍은 상태를 변경하지 않고 데이터를 처리하는 방식으로, 병렬 처리와 동시성에 강점을 가지고 있습니다.
  3. 로깅, 보안, 트랜잭션 처리와 같은 공통적인 기능이 필요한 경우: 이런 경우에는 관점지향 프로그래밍(AOP) 유용합니다. AOP 특정 기능을 모듈화하고 해당 기능이 필요한 다양한 지점에서 재사용할 있게 해줍니다.

7. 스프링 프레임워크에서의 AOP 구현에 대해 설명해주실 수 있나요? 해당 기술을 사용한 경험이 있다면 구체적으로 어떤 프로젝트에서 어떻게 사용했는지 말씀해주세요

 Spring Security 처리나 Custom Error Handling 등은 관점지향 프로그래밍(AOP) 통해 구현될 있습니다. 예를 들어, Spring Security 메소드 호출 전에 권한 검사를 수행하는 등의 보안 관련 기능을 AOP 통해 적용합니다. 또한, 에러 처리 로직 역시 AOP 통해 공통 로직을 분리하고 재사용할 있습니다. 이런 방식은 코드의 중복을 줄이고 가독성을 높이며, 유지보수를 용이하게 합니다.

더보기

AOP(관점지향 프로그래밍)는 거시적인 관점에서 코드의 특정 부분에 공통적으로 적용되는 기능을 모듈화하는 프로그래밍 패러다임입니다. 로깅, 트랜잭션 관리, 보안 등과 같은 기능이 AOP의 대표적인 예시입니다.

프로그램의 핵심 비즈니스 로직과는 별개이지만, 프로그램 전반에 걸쳐 필요로 하는 기능들입니다. 이런 기능들을 AOP를 통해 분리하면, 비즈니스 로직에 집중할 수 있게 되고 코드의 재사용성과 가독성이 높아집니다.

 

엔티티 분리는 주로 도메인 주도 설계 (Domain-Driven Design, DDD)에서 사용되는 설계 패턴 하나로, 엔티티가 자신의 비즈니스 로직을 캡슐화하도록 유지하는 것을 목표로 합니다.

 

AOP (Aspect-Oriented Programming)은 관점 지향 프로그래밍의 약어입니다. AOP는 객체지향 프로그래밍(OOP)의 보완적인 기술로 개발되었습니다.

AOP는 애플리케이션의 로직에서 핵심 비즈니스 로직과 관련 없는 부가적인 기능, 즉 "관심사(Concern)"를 분리하여 개발하는 방법론입니다.

AOP는 이러한 관심사를 "어드바이스(Advice)"라는 단위로 분리합니다. 이 어드바이스는 애플리케이션의 핵심 비즈니스 로직과 분리되어 실행되며, 일반적으로 로깅, 보안, 트랜잭션 처리 등과 같은 부가적인 기능을 수행합니다.

또한, AOP는 "포인트컷(Pointcut)"이라는 개념을 사용하여, 어떤 메소드에 어떤 어드바이스를 적용할지를 결정할 수 있습니다. 포인트컷은 메소드의 이름, 인자, 리턴값 등을 이용하여 메소드를 필터링하여 지정할 수 있습니다.

AOP의 장점은 다음과 같습니다.

  1. 핵심 비즈니스 로직과 부가적인 기능을 분리하여 코드를 유연하고 재사용 가능하게 만듭니다.
  2. 어드바이스를 중앙 집중화하여 적용하므로, 코드의 중복을 제거하고 유지보수를 용이하게 합니다.
  3. 애플리케이션의 모든 메소드에 일관된 부가적인 기능을 적용할 수 있습니다.

하지만 AOP를 사용하면 코드의 가독성이 떨어지고, 디버깅이 어려워질 수 있기 때문에, AOP는 적절한 경우에만 사용해야 합니다.

 

* "포인트컷(Pointcut)"은 "어드바이스(Advice)"가 적용될 메소드를 결정하는 역할을 합니다. 여기서 어드바이스는 "메소드 실행 전/후나 예외 발생 등 특정 지점에서 실행되어야 하는 코드"를 말합니다.

포인트컷은 표현식을 사용하여 어떤 메소드에 어드바이스가 적용될지 결정합니다. 이 표현식은 일반적으로 메소드의 패턴, 매개변수 타입, 예외 타입 등을 기반으로 합니다.

execution(* com.example.service.*.*(..))

이 표현식은 com.example.service 패키지의 모든 클래스의 모든 메소드를 선택하게 됩니다.

  • execution은 메소드 실행 조인 포인트를 선택하는 가장 일반적인 포인트컷 디자인에이터입니다.
  • * com.example.service.*.*(..)는 com.example.service 패키지의 모든 클래스의 모든 메소드를 대상으로 합니다.
  • 첫 번째 *는 메소드의 리턴 타입에 관계없이 모든 메소드를 의미합니다.
  • 두 번째 *는 com.example.service 패키지 내의 모든 클래스를 의미합니다.
  • 세 번째 *는 모든 메소드를 의미합니다.
  • (..)는 어떠한 매개변수가 오든 상관 없음을 의미합니다.

따라서 이 포인트컷 표현식은 "com.example.service 패키지의 모든 클래스의 모든 메소드가 실행될 때" 어드바이스를 적용하겠다는 의미입니다.

이렇게 포인트컷을 통해 어드바이스를 적용할 메소드를 정확하게 지정함으로써, 코드의 중복을 줄이고 관심사를 분리하여 코드의 가독성과 유지보수성을 향상시킬 있습니다.

 

2023.05.25 - [Spring] - 절차지향(Procedural), 객체지향(Object-Oriented), 관점지향(Aspect-Oriented) 프로그래밍 pt.1